这个是我自己分析WOW原始UI代码后,对一些比较关键的部分,我记录下来的
这次我写的是ZoneText.xml和ZoneText.lua,是显示地区文字的UI,在Interface/FrameXML里面
至于如何提取文件,如何查询函数,如何测试,还有一些基础问题和显而易见的东西我就不累述了
大家可以在网上找找这些文章,或者E-mail找我要,asdic.xxs@gamil.com

文章里面如果有什么纰漏,希望大家毫不客气的提出来,我一定查究!

另:WOW原始UI代码分析【ActionButton]】<script language="javascript" type="text/javascript"> document.title="WOW原始UI代码分析【ActionButton】 - "+document.title </script>

版本:1。7。1

做人要厚道,转载请注明出处。

该颜色表示:最近版本更新
该颜色表示:最近错误修改

------------

先看图像,因为我是在5区新开的小号测试的UI,所以不可能满世界到处跑去截图
对下面这种古怪的截图方式,希望大家能够体谅

我先解释一下下面要用到的术语指的是什么

【地域】:就是地图上面一块大地方的名字,在图像的第一排,如:莫高雷
【pvp信息】:显示该地区的阵营信息,一般在地域的下面,如:联盟或者部落
【地区】:在地图上面最细小的地方,一般和迷你地图上面的名字相同,一般在最后一排,如:纳拉其营地
【战场信息】:显示为“pvp区域”,一般在最后一排,我没有到战场截图,而是改成了战场变量
【跟随信息】:这里显示的是“正在跟随XX”,“已经停止跟随XX”那个文本框,一般在屏幕正中间

下面是ZoneText.xml和ZoneText.lua的源码,我的注释会插入其中。

ZoneText.xml
<Ui xmlns="http://www.blizzard.com/wow/ui/" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.blizzard.com/wow/ui/
../FrameXML/UI.xsd">
 <Script file="ZoneText.lua"/>
 <Script>
  ZoneFadeInDuration = 0.5;
 文字淡入时间
  ZoneHoldDuration = 1.0;
  文字显示时间
  ZoneFadeOutDuration = 2.0;
   文字淡出时间

function SetZoneText(showPVPInfo)
  这个函数用来设置文字的颜色和临时显示位置
   ZoneTextString:SetText(GetZoneText());
   GetZoneText函数,用来得到当前【地域】
   local pvpType, factionName, isArena = GetZonePVPInfo();
   if ( pvpType == "friendly" ) then
    PVPInfoTextString:SetText(format(FACTION_CONTROLLED_TERRITORY, factionName));
  FACTION_CONTROLLED_TERRITORY显示为“营地”
 factionName显示“部落”还是“联盟”

        ZoneTextString:SetTextColor(0.1, 1.0, 0.1);
    SubZoneTextString:SetTextColor(0.1, 1.0, 0.1);
    PVPInfoTextString:SetTextColor(0.1, 1.0, 0.1);
    SubZoneTextString:SetPoint("TOP", "PVPInfoTextString", "BOTTOM", 0, 0);
        相当于SetPoint(point,relativeTo,relativePoint,OffsetX,OffsetY)
   elseif ( pvpType == "hostile" ) then
    PVPInfoTextString:SetText(format(FACTION_CONTROLLED_TERRITORY, factionName));
    ZoneTextString:SetTextColor(1.0, 0.1, 0.1);
    SubZoneTextString:SetTextColor(1.0, 0.1, 0.1);
    PVPInfoTextString:SetTextColor(1.0, 0.1, 0.1);
    SubZoneTextString:SetPoint("TOP", "PVPInfoTextString", "BOTTOM", 0, 0);
   elseif ( pvpType == "contested" ) then
    PVPInfoTextString:SetText(CONTESTED_TERRITORY);
    CONTESTED_TERRITORY显示为“争夺中的领土”
    ZoneTextString:SetTextColor(1.0, 0.7, 0);
    SubZoneTextString:SetTextColor(1.0, 0.7, 0);
    PVPInfoTextString:SetTextColor(1.0, 0.7, 0);
    SubZoneTextString:SetPoint("TOP", "PVPInfoTextString", "BOTTOM", 0, 0);
   else 
  1.6.2:这种情况一般不发生,但是当你执行/console reloadui,或者其他一些命令的时候使得UI值清空
   但是此时没有调用过GetZonePVPInfo,所以这时pvpType的值为nil
   1.7.1:改正了这个BUG,当执行/console reloadui后,GetZonePVPInfo将会执行一次,所以pvpType中有当前正确的值
    PVPInfoTextString:SetText("");
    ZoneTextString:SetTextColor(1.0, 0.9294, 0.7607);
    SubZoneTextString:SetTextColor(1.0, 0.9294, 0.7607);
    SubZoneTextString:SetPoint("TOP", "ZoneTextString", "BOTTOM", 0, 0);
   end
   if ( isArena ) then 
   判断在战场
    PVPArenaTextString:SetText(FREE_FOR_ALL_TERRITORY);
    FREE_FOR_ALL_TERRITORY显示为“pvp区域”
    SubZoneTextString:SetTextColor(1.0, 0.1, 0.1);
   else
    PVPArenaTextString:SetText("");
   end
   if ( not showPVPInfo ) then
    PVPInfoTextString:SetText("");
    SubZoneTextString:SetPoint("TOP", "ZoneTextString", "BOTTOM", 0, 0);
    当不显示【pvp信息】的时候,【地区】显示上升一排,近接着【地域】下面
   end
  end
 </Script>
 <!-- These frames are shown when the current zone or subzone changes -->
 <Frame name="ZoneTextFrame" parent="UIParent" frameStrata="LOW" toplevel="true">
 显示【区域】的窗口,其中还包括了【pvp信息】窗口
  <Anchors>
   <Anchor point="BOTTOM">
    <Offset>
     <AbsDimension x="0" y="512"/>
    </Offset>
   </Anchor>
  </Anchors>
  <Size>
   <AbsDimension x="128" y="128"/>
  </Size>
  <Layers>
   <Layer level="ARTWORK">
    <FontString name="ZoneTextString" inherits="ZoneTextFont">
    【地域】文本框
     <Size>
      <AbsDimension x="512" y="0"/> 
      他的大小,如果值为0则为自动适应大小变化
      如果大小超过指定值,但还可以显示“...”,则显示“...”
      如果连“...”也显示不了则什么也不显示

     </Size>
     <Anchors>
      <Anchor point="CENTER"/>
     </Anchors>
    </FontString>
    <FontString name="PVPInfoTextString" inherits="SubZoneTextFont">
    【pvp信息】文本框
     <Size>
      <AbsDimension x="512" y="0"/>
     </Size>
     <Anchors>
      <Anchor point="TOP" relativeTo="ZoneTextString" relativePoint="BOTTOM"/>
      这个是通常情况下的对齐方式,临时的方式可以在上面SetZoneText函数里面更改
     </Anchors>
    </FontString>
   </Layer>
  </Layers>
  <Scripts>
   <OnLoad>
    FadingFrame_OnLoad();
    FadingFrame_SetFadeInTime(this, ZoneFadeInDuration);
    FadingFrame_SetHoldTime(this, ZoneHoldDuration);
    FadingFrame_SetFadeOutTime(this, ZoneFadeOutDuration);
    this:RegisterEvent("ZONE_CHANGED");
    【地区】变更
    this:RegisterEvent("ZONE_CHANGED_INDOORS");
   进入城市
    this:RegisterEvent("ZONE_CHANGED_NEW_AREA");
    【地域】变更
   </OnLoad>
   <OnEvent>
    local newText = GetZoneText();
    if ( event == "ZONE_CHANGED" ) then
     this.zoneText = newText;
     这里并没有判断【地域】是否变化,但是他更新了【地域】文本
     return;
     这个if的意思是,仅【地区】变更后,并不显示【地域】和【pvp信息】文本框,return实现了这个作用
    end
    这里注意,ZONE_CHANGED和ZONE_CHANGED_NEW_AREA是互斥事件
    即当进入新【地域】的时候并不产生ZONE_CHANGED
    if ( newText ~= this.zoneText ) then
    这是对ZONE_CHANGED_INDOORS的处理
     this.zoneText = newText;
     if ( event == "ZONE_CHANGED_NEW_AREA" ) then
      当进入新【地域】的时候,同时显示【pvp信息】
      SetZoneText(1);
     else
      SetZoneText();
     如果是进入城市则不显示
     end
     FadingFrame_Show();
     显示!
    end
    这里注意,虽然进入城市要显示该文本框,但是它并不是一种ZONE_CHANGED_NEW_AREA事件
   </OnEvent>
   <OnUpdate>
    FadingFrame_OnUpdate();
    这个函数用来做淡出特效
   </OnUpdate>
  </Scripts>
 </Frame>
 <Frame name="SubZoneTextFrame" parent="UIParent" frameStrata="LOW" toplevel="true">
 【地区】窗口,包括了【战场信息】窗口
  <Anchors>
   <Anchor point="BOTTOM">
    <Offset>
     <AbsDimension x="0" y="512"/>
    </Offset>
   </Anchor>
  </Anchors>
  <Size>
   <AbsDimension x="128" y="128"/>
  </Size>
  <Layers>
   <Layer level="ARTWORK">
    <FontString name="SubZoneTextString" inherits="SubZoneTextFont">
    【地区】文本
     <Size>
      <AbsDimension x="512" y="0"/>
     </Size>
     <Anchors>
      <Anchor point="TOP" relativeTo="ZoneTextString" relativePoint="BOTTOM"/>
     </Anchors>
    </FontString>
    <FontString name="PVPArenaTextString" inherits="SubZoneTextFont">
    【战场信息】文本
     <Size>
      <AbsDimension x="512" y="0"/>
     </Size>
     <Anchors>
      <Anchor point="TOP" relativeTo="SubZoneTextString" relativePoint="BOTTOM"/>
     </Anchors>
    </FontString>
   </Layer>
  </Layers>
  <Scripts>
   <OnLoad>
    FadingFrame_OnLoad();
    FadingFrame_SetFadeInTime(this, ZoneFadeInDuration);
    FadingFrame_SetHoldTime(this, ZoneHoldDuration);
    FadingFrame_SetFadeOutTime(this, ZoneFadeOutDuration);
    this:RegisterEvent("ZONE_CHANGED");
    this:RegisterEvent("ZONE_CHANGED_INDOORS");
    this:RegisterEvent("ZONE_CHANGED_NEW_AREA");
    下面3句放在OnLoad下面,表示了进入游戏后将显示全部信息
注意,在【地域】窗口中并没有下面3句
    PVPArenaTextString:SetTextColor(1.0, 0.1, 0.1);
   【战场信息】初始化
    SetZoneText(1);
    【pvp信息】初始化
    SubZoneTextString:SetText(GetSubZoneText());
   【地区】初始化
   </OnLoad>
   <OnEvent>
    local text = SubZoneTextString:GetText();
    local newText = GetSubZoneText();
    if(text ~= newText) then
     SubZoneTextString:SetText(newText);
     SetZoneText(1);
   更新【pvp信息】,虽然不显示,但是仍然需要更新
     FadingFrame_Show();
     注意,这里的FadingFrame_Show虽然和上一个【地域】窗口的同名,但是实际不同
所以这个是显示【地区】文本框,而且并不显示【pvp信息】文本框
    end
   注意,这里并没有判断event,因为任意一个该窗口注册的事件都能够引起以上语句
   </OnEvent>
   <OnUpdate>
    FadingFrame_OnUpdate();
   </OnUpdate>
  </Scripts>
 </Frame>
 <Frame name="AutoFollowStatus" parent="UIParent" setAllPoints="true" frameStrata="BACKGROUND" hidden="true">
【跟随信息】窗口
  <Layers>
   <Layer level="ARTWORK">
    <FontString name="AutoFollowStatusText" inherits="GameFontNormal">
     <Anchors>
      <Anchor point="CENTER">
       <Offset>
        <AbsDimension x="0" y="0"/>
       </Offset>
      </Anchor>
     </Anchors>
     <FontHeight>
      <AbsValue val="20"/>

这个我有疑问,没有试出来,请高人帮忙指定一下,或者等我分析以后的东西知道后再写上来
     </FontHeight>
    </FontString>
   </Layer>
  </Layers>
  <Scripts>
   <OnLoad>
    AutoFollowStatus_OnLoad();
   </OnLoad>
   <OnEvent>
    AutoFollowStatus_OnEvent(event);
   </OnEvent>
   <OnUpdate>
    AutoFollowStatus_OnUpdate(arg1);
   arg1代表跟随目标的名字
   </OnUpdate>
  </Scripts>
 </Frame>
</Ui>

ZoneText.lua

AUTOFOLLOW_STATUS_FADETIME = 4.0;
淡出时间

function AutoFollowStatus_OnLoad()
 this:RegisterEvent("AUTOFOLLOW_BEGIN");
自动跟随开始时的事件
 this:RegisterEvent("AUTOFOLLOW_END");
 自动跟随结束

this:RegisterEvent("PLAYER_ENTERING_WORLD");
进出游戏,出入副本,复活或者死亡
end

function AutoFollowStatus_OnEvent(event)
 if ( event == "AUTOFOLLOW_BEGIN" ) then
  this.unit = arg1;
跟随对象名字
  this.fadeTime = nil;
注意,正在跟随的时候,淡出时间为nil即不淡出
  this:SetAlpha(1.0);
  AutoFollowStatusText:SetText(format(TEXT(AUTOFOLLOWSTART),this.unit));
  AUTOFOLLOWSTART显示为“正在跟随”
  this:Show();
 end
 if ( event == "AUTOFOLLOW_END" ) then
  this.fadeTime = AUTOFOLLOW_STATUS_FADETIME;
  设定淡出时间,即停止跟随后文字将淡出屏幕
  AutoFollowStatusText:SetText(format(TEXT(AUTOFOLLOWSTOP),this.unit));
  AUTOFOLLOWSTOP显示为“已停止跟随”
  this:Show();
 end
 if ( event == "PLAYER_ENTERING_WORLD" ) then
  this:Hide();
  若跟随时发生PLAYER_ENTERING_WORLD,则隐藏文本
 end
end

function AutoFollowStatus_OnUpdate(elapsed)
elapsed为经过的时间,为上次OnUpdate到这次的间隔
 if( this.fadeTime ) then
  if( elapsed >= this.fadeTime ) then
   this:Hide();
  else
   this.fadeTime = this.fadeTime - elapsed;
   local alpha = this.fadeTime / AUTOFOLLOW_STATUS_FADETIME;
   this:SetAlpha(alpha);
  end
 end
end

总结一下

函数
GetZoneText()   得到当前【地域】
GetZonePVPInfo()  得到当前【pvp信息】
GetSubZoneText()  得到当前【地区】

常量
FACTION_CONTROLLED_TERRITORY “营地”
CONTESTED_TERRITORY    “争夺中的领土”
FREE_FOR_ALL_TERRITORY   “pvp区域”
AUTOFOLLOWSTART     “正在跟随”
AUTOFOLLOWSTOP     “已停止跟随”

事件
ZONE_CHANGED     【地区】变更
ZONE_CHANGED_INDOORS   进入城市
ZONE_CHANGED_NEW_AREA   【地域】变更
AUTOFOLLOW_BEGIN    自动跟随开始
AUTOFOLLOW_END     自动跟随停止
PLAYER_ENTERING_WORLD   进出游戏,进出副本,死亡或者复活

WOW原始UI代码分析【ZoneText】相关推荐

  1. UI界面:手写UI代码或者使用xib和StoryBoard制作UI界面的区别和分析

    UI: Code vs Xibs vs StoryBoard 最近接触了几个刚入门的iOS学习者,他们之中存在一个普遍和困惑和疑问,就是应该如何制作UI界面.iOS应用是非常重视用户体验的,可以说绝大 ...

  2. 你不知道的常用 代码分析 规范

    visual studio有个功能,代码分析,一般开发完毕后,除了处理常规的"错误列表"显示的"错误"和"警告",我们更加应该注意的是,运行 ...

  3. ping的实现和代码分析

    ping的实现和代码分析 一.介绍      ping命令是用来查看网络上另一个主机系统的网络连接是否正常的一个工具.ping命令的工作原理是: 向网络上的另一个主机系统发送ICMP报文,如果指定系统 ...

  4. 完整全面的Java资源库(包括构建、操作、代码分析、编译器、数据库、社区等等)...

    构建 这里搜集了用来构建应用程序的工具. Apache Maven:Maven使用声明进行构建并进行依赖管理,偏向于使用约定而不是配置进行构建.Maven优于Apache Ant.后者采用了一种过程化 ...

  5. 微信php实例代码_php微信公众平台示例代码分析(二)

    一.摘要 微信公众平台提供了一个简单的php示例代码,在做进一步开发之前,我们有必要将其详细了解一下. 二.获取代码 三.分析代码 完整代码如下: /** * wechat php test */ / ...

  6. c++代码健壮性_复活Navex-使用图查询进行代码分析(上)

    从了解到修复 Navex, 其中花了一年多, 从对自动化代码审计一无所知到学习PL/Static Analysis, 翻阅十几年前的文档, 补全Gremlin Step, 理解AST, CFG, DD ...

  7. 控制元素显示和隐藏的方式及区别、内容溢出处理(区域滚动)、透明性、字体图标、常见字体、自定义字体设计、网站图标、CSS代码分析

    元素的显示与隐藏: 常见控制元素的显示和隐藏的属性有display.visibility.overflow,需要清楚的理解三者之间的区别. display显示: 当值为none时为销毁对象,不保留原位 ...

  8. 使用VS2010代码分析功能增强ASP.NET应“.NET研究”用程序安全

    任何从事ASP.NET开发的人都不得不承认,在其职业生涯中曾经遇到过应用程序安全问题,开发人员常常被迫尽快交付代码,平台的复杂性和各种配置选项让应用程序的安全总达不到预期,此外,调试和生产环境的配置要 ...

  9. MTK 驱动(66)---Android recovery UI实现分析

    Android recovery UI实现分析 Android recovery模式为何物? 关于这个问题, baidu上已经有无数的答案,不理解的朋友先补习一下.从纯技术角度来讲, recovery ...

最新文章

  1. Java -- JDBC 学习--通过Statement进行数据库更新操作
  2. 第二届中国云计算与SaaS学术会议征文通知
  3. Spring Cloud 常见面试题及答案
  4. java、上转型对象
  5. MATLAB 图像函数(第三章) 图像基本处理
  6. Unity3D去掉全屏时的屏幕黑边
  7. 路由及iptables学习笔记
  8. 【转】Linux Posix Timer使用
  9. POJ 1042 Gone Fishing【枚举+贪心】
  10. java class 字符串_java基础知识四 math类 字符 字符串 控制台输入输出 StringBuilder与StringBuffer...
  11. C++ 处理异常相关
  12. 【Ajax】PHP中ajax的基本知识点
  13. C++基础::Stream(二)
  14. 用户,用户组,文件和目录权限详解
  15. C#轻松创建ModbusTCP服务器【Slave】,实现工业数据交换接口。
  16. 3-19日 游戏工坊博客
  17. 一个十人开发团队的人员安排
  18. biogeme-nest_logit-cnblog
  19. 日志数据如何同步到MaxCompute
  20. C++ Reference: Standard C++ Library reference: C Library: cmath: fma

热门文章

  1. 神之刃最新服务器,神之刃新开服务器 不删档测试开启
  2. 超级链接有哪些常见的表现形式?
  3. 主动式电容笔好用吗?平板电脑性价比电容笔测评
  4. 使用RoboStudio操控服务机器人Jupiter
  5. 编码的未来是根本不需要编码
  6. EZ-Cube驱动安装及拨码设置
  7. 知云界面怎么调?知云只翻译一句话怎么办?详解方案出炉
  8. Manx Telecom推出全球物联网连接品牌“OV”
  9. DockerKubernetes ❀ Docker镜像与容器相关操作基础命令详解
  10. 推荐近年来印象最深的几本书