[心得] 淺學UI心得 Part1<革新二版>
※ [本文轉錄自 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
推
02/10 01:08,
02/10 01:08
推
02/10 01:10,
02/10 01:10
推
02/10 01:10,
02/10 01:10
→
02/10 01:11,
02/10 01:11
→
02/10 01:11,
02/10 01:11
--
※ 發信站: 批踢踢實業坊(ptt.cc)
◆ From: 125.228.221.7
--
※ 發信站: 批踢踢實業坊(ptt.cc)
◆ From: 125.228.221.7
→
02/11 00:48, , 1F
02/11 00:48, 1F
推
02/11 14:18, , 2F
02/11 14:18, 2F