作者wa007123456 (大笨羊)
看板Programming
标题[心得] 浅学UI心得 Part1<革新二版>
时间Wed Feb 10 01:17:05 2010
※ [本文转录自 Test 看板]
作者: wa007123456 (大笨羊) 看板: Test
标题: [心得] 浅学UI心得 Part1<革新二版>
时间: Wed Feb 10 01:13:18 2010
※ [本文转录自 WOW 看板]
作者: wa007123456 (大笨羊) 看板: WOW
标题: [心得] 浅学UI心得 Part1<革新二版>
时间: Wed Feb 10 01:06:00 2010
一、简介:
魔兽世界(World of Warcraft)全球知名的线上游戏,除了
其独特的设计之外,也提供玩家自行设定介面的功能。本
篇文章重点都是关於魔兽世界的API Lua语法和XML的探讨,
希望这篇文章能抛砖引玉,主要针对没学过程式的人,吸引
台湾更多人来作魔兽世界的使用者介面。
二、如何安装插件
魔兽世界(以下简称wow)安装插件的位置是从你安装的路径
来判断,如果你下载了一个UI,他通常是一个资料夹,里面
包含了一些插件的档案(XML toc lua),首先复制或剪下插
件的资料夹,然後放到以下位置:
..\World of Warcraft\Interface\AddOns
之後打开wow,会发现在选择角色的的地方,左下角出现了
"插件"的按钮,打开他就可以看到有关於你插件的使用情形
,按下核取方块来启动你所安装的插件,然後点进入游戏
就可以看到此插件的情形了。
三、制造一个空的插件
首先在..\World of Warcraft\Interface\AddOns的位置下
面新增一个资料夹,把他取成你想要的插件名称,然後在
资料夹下面产生一个*.txt档案,并更改副档名为.toc,
之後利用记事本编辑页面内容
输入以下文字:
## Interface: 30300
## Title: 你想要的标题名称(美国)
## Title-zhTW:你想要的标题名称(台湾)
## Title-zhCN:你想要的标题名称(大陆)
## Author: 你的名称
## Version: 版本编号
## Notes-zhTW: 简介
## eMail: 你的的e-mail
## DefaultState: Enabled
## LoadOnDemand: 0
请注意,档案名称必须和资料夹名称一样,不然wow的系统
不会侦测到此插件,之後进入游戏,你就会发现你的插件
出现在插件管理器里面,这代表你成功的完成了一个空的
插件。
四、Lua语法快速导览
Lua是一种嵌入式的语言,他可以嵌入某些以编译好的程式
之中,由於他是直译式的语言,所以和C语言不太一样,不
需要宣布型别,以下开始介绍简单的Lua语法。
1.甚麽是变数?
变数是程式里面最基本的元件,如果没有他就无法跟程式
进行互动,在Lua里面由於变数不需要宣布型别,因此数字
可以轻松变成字串,而字串也可以变回数字。
所谓字串就是由多个char(字元)所构成的型体。
例如说:
str1="Welcome";
就代表说我宣告了一个叫做str1的字串,他的内容是"Welcome"
实际上在记忆体里面是'W' 'e' 'l' 'c' 'o' 'm' 'e'所连续构
成的,这也是为什麽他叫做字串的原因。
如果要输入数值型别
请造我这样做:
no=1;
这样就宣告一个叫做no的变数,他的内容是1
但是变数之所以可以称为变数,就是他的值可以任意改变。
我可以在同一个Lua档案里面写如下:
no=2;
此刻no的值就变成2了。
另外要注意的是,变数名称的合法性,也就是说不能输入有冲突的名字
开头不能是数字 不能是关键字(for function...etc)
关键字大全:
and break do else elseif
end false for function if
in local nil not or
repeat return then true until
while
不然直译的时候会发生错误。
另外有一件事情一定要记得,请为你的变数取有意义的名称,
这种方式叫做匈牙利命名法,尽量少使用像是a b c等让人无法看懂得变数
而是改成num sum current state count...等比较有意义的单字。
这样做可以帮助你Debug的时候更容易。
2.变数的基本运算
如果不能进行变数的计算,那得到的资料也无法产生结果。
我们先谈谈数值型别的加减
例如:
no1=5;
no2=5;
no3=no1+no2;
此刻no3的值会变成10
以下列出所有的运算子
+ :把两个数字或是变数进行相加的功能
- :把两个数字或是变数进行相减的功能
* :把两个数字或是变数进行相乘的功能
/ :把两个数字或是变数进行相除的功能(注意 / 後面不可以是0)
% :把两个数字或变数进行相乘後得到余数的功能
以下进行一个比较复杂的运算:
result=(1*2)%3+(9-4)/5;
之後result的值会是1,记住,要先计算的变数请括号起来,
不然程式会使用四则运算的方法来进行,可能会跟你预期的
内容不同。
3.字串
之前有提到字串是一组连续的char所构成
在Lua里面数值转字串是非常容易得一件事情
例如:
no1=123;
str1="The Num is:"..no1;
print(str1);
会在萤幕上面印出"The Num is:123"
注意两个字串或是字串跟数字的串连方法就是
使用 .. 运算子
.. :把两个字串连接起来
4.注解
要产生注解其实很简单,例如
no1=1 --宣告一个变数 内容为1
其中--後面的字不会被执行
为什麽要产生注解?
因为你写的程式别人未必会看得懂
而且可能时间一久你就忘了他是怎
麽运作的,养成写注解的习惯很重要。
5.资料与型别
虽然之前说,直译语言并不需要型别的宣告。
但是事实上'1'和1的内容并不相同,所以这
一小节简单介绍一些基本的资料型别。
nil:这代表是空的意思,通常是用来判断某些事情有没有成功
或是回传值的用法,如果物件没有宣告成功那就是一个nil值。
Boolean:中文译作布林,他只有两种值,一个是true(真)一个是false(假)
用来做一些逻辑运算。
Numbers:数值型别
String:字串型别
Table:物件型别,请你想像一张明信片上面,有人的名字 图片 地址 电话
等...资料,而物件型别就是一张明信片,里面有多个成员。
请看以下范例:
table1 = {} -- 产生一个物件
k = "x"
table1[k] = 10 -- 产生一个成员 key值是"x" 内容是10
a[20] = "great" -- 产生一个成员 key值是20 内容是"great"
print(a["x"]) -- 印出10
k = 20
print(a[k]) --> 印出great
table["x"] = table["x"] + 1 -- "x"成员加1
print(a["x"]) --> 11
范例中产生了一个table1物件 其中用k来当作关键值
并设定这个成员的内容为10 然後再设定20来当作关键
值然後产生一个成员内容是"great" 然後再分别印出他们。
6.函式
产生一个函式的方法为
function func_Name ()
end
为什麽要用函式?
其实函式跟数学上的函式非常相似
都是一连串的计算 然後回传某个值这样
只是数学上面的函式你必须还要自己算一遍
但是电脑上的函式 电脑会帮你运算
因为某些运算的事情可能比较复杂
也可能会一直重复如果没有使用函式
程式的开发速度就会变慢很多
我会在wow API中再度提到。
7.关系运算子
以下简列一些关系运算子
< :小於
> :大於
<= :小於等於
>= :大於等於
== :完全等於
~= :不等於
运算子会测验两个变数的关系
然後回传true或是false
8.逻辑运算子
and:且 运算子
or:或 运算子
这两个运算子有甚麽差别呢?
请看下面
a.andd运算子是说当两方都是真的时候
才会回传真
不然就回传假
b.or运算子是说两方只要有一个是真
就会传回真,只有两个都是假的时候
才会传回假。
9.全域变数和区域变数
在Lua中,可以宣告local让变数变成区域变数,
以避免重复的变数宣告。
甚麽叫做区域变数?
区域变数就是离开某个范围的时候 就会被释放掉的变数
这麽做是为了要让程式执行的速度更快更好
全域变数则是直到程式结束,才会释放掉的变数
10.流程控制
电脑中 总是避免不了一些逻辑判断
这个时候我们就需要一些流程控制的方法:
以下简介流程的结构
if:主判断式
elseif:附从判断式
else:最终附从判断式
让我举一个简单的例子:
if(no1==no2) then
print("no1 等於 no2");
elseif(no1~=no2) then
print("no1 不等於 no2");
else
print("这是甚麽?");
end
第一个判断式会判断no1是不是等於no2
第二个判断式会判断no1是不是不等於no2
第三个判断式则是上述都不成立的时候出现
利用判断式可以做很多事情,例如你希望
发生甚麽事情後 才会执行某个函式。
这都需要判断式的帮忙。
11.阵列
写程式的时候,难免会遇到要宣告很多变数的时候,
在变数少的时候或许还好,可是只要人一变多,就会
让你打到手痛。
让我们看看下面的例子
no1=1; --我宣告了一个变数
no2=2; --我又宣告了一个变数
no3=3; --我还是宣告了一个变数
no4=4; --奇怪我怎麽还在宣告变数
no5=5; --是不是快要宣告完了?
no6=6; --天阿 救救我离开这个无限宣告的定义...
.........
所以说我们需要一个东西,他叫作阵列
他的宣告方式如下:
no={1,2,3,4,5,6};
我可以很方便的取用各种数值
temp=no[2]; --temp=2
这是阵列很大的功用
当然你可以在[]里面加入变数或是字串
用动态的方式存取阵列
12.重复结构
有时候程式也需要某些重复运算的地方,
我们希望缩短程式码的长度
因此发明了重复结构
简单介绍两个常用的重复结构
while:当你不知道甚麽时候会结束的重复结构
for:你确定甚麽时候可以结束的重复结构
利用while举例:
local sum = 0,i=1
while i<=10 do
sum = sum + i;
i=i+1;
end
print(sum);
上述程式码在进行1+2+3...+10的事情
其结果为55
利用for举例:
for的样式是长这样:
for var=exp1,exp2,exp3 do
something();
end
会不断的执行something函式
其中用var当作基底值 跟 exp2比较
并相加exp3的值 在跟exp2比较
直到exp3传回真为止
例如:
local sum=0;
for i=1,i<=10,1 do
sum=sum+i;
end
print(sum);
其结果为55
=============================Part1 结束======================================
--
※ 发信站: 批踢踢实业坊(ptt.cc)
◆ From: 125.228.221.7
1F:推 Blacky1128:快推 虽然我看不懂 XD 02/10 01:08
2F:推 gg90052:其实这篇是共通的程式设计基础XD 02/10 01:10
3F:推 hhpsjoe:推你有心.. 02/10 01:10
4F:→ wa007123456:今天看起来无关...不过明天我会提WOW的API 02/10 01:11
5F:→ wa007123456:这篇是基础篇 可能跟魔兽没关系 囧 但是很重要 02/10 01:11
--
※ 发信站: 批踢踢实业坊(ptt.cc)
◆ From: 125.228.221.7
--
※ 发信站: 批踢踢实业坊(ptt.cc)
◆ From: 125.228.221.7
6F:→ WPC001:这似乎是LUA... 跟UI好像没太大的关系吧 123.195.63.235 02/11 00:48
7F:推 hacker10158:要等他讲到API那边0.0 140.112.218.77 02/11 14:18