Contents
- 1. 목ì �
- 2. ê³¼ì •
- 2.1. Lua 설치 � 셋팅
- 2.2. �바�서 초성빼오기
- 2.3. 첫 와우 Addon 만들기
- 2.4. WOW API를 �용해서 아�템 �름� 불러오�!
- 2.5. Lua�서 초성빼오기
- 2.6. WOW Slash Command
- 2.7. CommandMessageParsing
- 2.8. FrameEventHandling
- 2.9. ìž�ë�™ Update함수 ì°¾ê³ timer찾기
- 3. ë‚¨ê¸°ê³ ì‹¶ì�€ ë§�
2.1. Lua 설치 ë°� 셋팅 ¶
WOWì�˜ ì• ë“œì˜¨ì�€ Lua나 Ruby와 ê°™ì�€ 스í�¬ë¦½íЏ 언어를 사용하는것으로 ì•Œê³ ìžˆë‹¤.
그래서 Programming in Luaë�¼ëŠ” ì±…ì�„ ë�„서관ì—�서 ë¹Œë ¤ì™”ë‹¤. 아마 ë¹Œë ¤ì˜¨ì§€ 1주ì�¼ì�€ ë�¬ê² ì§€.
Lua 개발환경ì�„ 셋팅하는ë�° 좀 ê±¸ë ¸ë‹¤.
Lua-Eclipse를 받아서 ê¹”ê³ . (LunarEclipseë�¼ëŠ” 것ë�„ 있단다)
Eclipseì—�서 Java외ì�˜ 다른것ì�„ ë�Œë¦¬ë ¤ë©´ 당연 ì�¸í„°í”„리터나 컴파ì�¼ëŸ¬ë¥¼ 설치해주어야 한다. 그래서 Lua를 ì„¤ì¹˜í•˜ë ¤í–ˆë‹¤. LuaProfiler나 LuaInterpreter를 설치해야한다는ë�° ë�„통 ì˜�어를 못ì�½ê² 다 나ì�˜ 무ì‹�함ì�´ 들어났다.
여튼 어찌어찌해서
5.1.4-35 2010-04-07 13:09
LuaForWindows_v5.1.4-35.exe
LuaForWindows_v5.1.4-35.exe
�호. 설치.
설치ë�œê²½ë¡œë¥¼ ë”°ë�¼ Eclipseì�˜ Profilerë§�ê³ Interpreter로 lua.exe로 path를 ì„¤ì •í•´ì£¼ë©´ Eclipseì—�서 Project를 ë§Œë“ ë’¤ ì¶œë ¥ë�˜ëŠ” Lua파ì�¼ì�„ 볼수 있다.
2.2. ìž�ë°”ì—�서 초성빼오기 ¶
WOWì• ë“œì˜¨ 초성퀴즈를 만들기위함ì�´ê¸° 때문ì—�.
당연히 한글� 초성� 빼올수 있어야한다.
그래서 찾아봤ë�”니 UTF-8ë°©ì‹�으로 빼올수 ìžˆë‹¤ê³ í•œë‹¤.
근� ��한� UNICODE�서 계산해서 빼오�구만.
추가 : ì•Œê³ ë³´ë‹ˆ UNICODE를 í�¬í•¨í•˜ëŠ” ë°©ì‹�중 하나ë�¼ê³ 한다. ê·¼ë�° ë�” ëª¨ë¥´ê² ëŠ”ë�°... U-00000800 - U-0000FFFF 범위ì—� ë“¤ì–´ê°„ë‹¤ê³ í•˜ëŠ”ë�°??
ì•„ì•… ëª¨ë¥´ê² ì–´!! 그래서 추가로 ë§�í�¬ë¥¼ 걸어본다.
추가 : ì•Œê³ ë³´ë‹ˆ UNICODE를 í�¬í•¨í•˜ëŠ” ë°©ì‹�중 하나ë�¼ê³ 한다. ê·¼ë�° ë�” ëª¨ë¥´ê² ëŠ”ë�°... U-00000800 - U-0000FFFF 범위ì—� ë“¤ì–´ê°„ë‹¤ê³ í•˜ëŠ”ë�°??
ì•„ì•… ëª¨ë¥´ê² ì–´!! 그래서 추가로 ë§�í�¬ë¥¼ 걸어본다.
http://blog.naver.com/declspec?Redirect=Log&logNo=10092640244
http://divestudy.tistory.com/8
��가 안없어지길.
http://divestudy.tistory.com/8
��가 안없어지길.
ìš°ì„ ìž�ë°” 코드는 다ì�Œê³¼ 같다.
/////////////////////////////////////////////
package utfencoding;
/////////////////////////////////////////////
package utfencoding;
public class UtfEncoding {
final static char[] first = {
final static char[] middle = {
final static char[] last = {
/**
}'ㄱ','ㄲ','ㄴ','ㄷ','ㄸ','ㄹ','�','ㅂ','ㅃ','ㅅ','ㅆ','o','ㅈ','ㅉ','ㅊ','ㅋ','ㅌ','�','ㅎ'
};final static char[] middle = {
'ã…�','ã…�','ã…‘','ã…’','ã…“','ã…”','ã…•','ã…–','ã…—','ã… ','ã…˜','ã…›','ã…™','ã…š','ã…œ','ã…�','ã…ž','ã…Ÿ','ã…¡','ã…¢','ã…£'
};final static char[] last = {
'\0','ㄱ','ㄲ','ㄳ','ㄴ','ㄵ','ㄶ','ㄷ','ㄹ','ㄺ','ㄻ','ㄽ','ㄾ','ㄿ','ㅀ','�','ㅂ','ㅄ','ㅅ','ㅆ','o','ㅈ','ㅊ','ㅋ','ㅌ','�','ㅎ'
}; /**
- @param args
- /
////////////////////////////////////////
ë³´ë©´ ì•Œê² ì§€ë§Œ ìž�ë°”ì—�서 작성ë�˜ëŠ”ê±´ UNICoDEì�´ë‹¤(아마ë�„?)
현재 Eclipse개발환경중 문� Encoding� UTF-8방��다.
거기서 한글ì�„ 빼온후 UTF-8ì—� ë”°ë�¼ 0xACC00 (<- UTF-8시작) ì�„ ë¹¼ê³ ì´ˆì„± 중성 종성ì�„ 다ì�Œìœ¼ë¡œ 빼온다
거기서 한글ì�„ 빼온후 UTF-8ì—� ë”°ë�¼ 0xACC00 (<- UTF-8시작) ì�„ ë¹¼ê³ ì´ˆì„± 중성 종성ì�„ 다ì�Œìœ¼ë¡œ 빼온다
초성 = (�문� /21 /28)
중성 = ( (�문�%(21*28))/28)
종성 = ( a%28)
중성 = ( (�문�%(21*28))/28)
종성 = ( a%28)
ì�´ë ‡ê²Œ í•˜ê³ ë¬¸ìž� 규칙ì—� ë”°ë�¼ 빼온다.
규칙� 위� 코드를 보면 알수 있다.
규칙� 위� 코드를 보면 알수 있다.
2.3. 첫 와우 Addon 만들기 ¶
천리길ë�„ Hello World!부터ë�¼ëŠ” ì§€ë¡ ì—� ë”°ë�¼
어떻게 ì—°ë�™ë�˜ëŠ”ì§€ë¥¼ ì‚´íŽ´ë³´ê² ë‹¤.
어떻게 ì—°ë�™ë�˜ëŠ”ì§€ë¥¼ ì‚´íŽ´ë³´ê² ë‹¤.
기본 프로그램 ì •ë³´ë¥¼ ë‹´ê³ ìžˆëŠ” *.toc파ì�¼.
ê·¸ë¦¬ê³ UI와 LUA를 Mapping 시켜주는 *.xml
ê·¸ë¦¬ê³ ì—°ì‚°ì�„ 해주는 *.lua
ê·¸ë¦¬ê³ UI와 LUA를 Mapping 시켜주는 *.xml
ê·¸ë¦¬ê³ ì—°ì‚°ì�„ 해주는 *.lua
작성� 해보�
기본ì �으로 "/World of Warcraft/interface/addons/ì• ë“œì˜¨ëª…" 으로 í�´ë�”ê°€ ë§Œë“¤ì–´ì ¸ìžˆì–´ì•¼í•œë‹¤.
ê·¸ë¦¬ê³ HelloWoW.toc으로 ê¸°ë³¸ì„¤ì •ì�„ 잡아야하ê³
tocì—� ì •ë³´ë¥¼ 넣어주어야한다.
HelloWoW.toc
tocì—� ì •ë³´ë¥¼ 넣어주어야한다.
HelloWoW.toc
Interfaceì—�는 현재 ë²„ì „ ì •ë³´ê°€ 들어가있다.
http://www.wowwiki.com/Getting_the_current_interface_number
로 현재 ì�¸í„°íŽ˜ì�´ìФ ì •ë³´ë¥¼ 알아볼수 있다.
ë‚´ê°€ 작성하는건 4.2니까 40200ì�´ê² ì§€ ì�¸í„°íŽ˜ì�´ìФ ì •ë³´ë¥¼ ê°±ì‹ ì•ˆí•´ë†“ìœ¼ë©´ 와우 ì• ë“œì˜¨ 로드시 'êµ¬ë²„ì „'으로 ì œëŒ€ë¡œ 로드가 안ë� 수 있다.
http://www.wowwiki.com/Getting_the_current_interface_number
로 현재 ì�¸í„°íŽ˜ì�´ìФ ì •ë³´ë¥¼ 알아볼수 있다.
ë‚´ê°€ 작성하는건 4.2니까 40200ì�´ê² ì§€ ì�¸í„°íŽ˜ì�´ìФ ì •ë³´ë¥¼ ê°±ì‹ ì•ˆí•´ë†“ìœ¼ë©´ 와우 ì• ë“œì˜¨ 로드시 'êµ¬ë²„ì „'으로 ì œëŒ€ë¡œ 로드가 안ë� 수 있다.
Titleì�€ ì§�작대로ê³
노트는 그냥 설명ì�´ê³
Author� 있�.
노트는 그냥 설명ì�´ê³
Author� 있�.
HelloWoW.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">
<script file="HelloWoW.lua"/>
<Frame name="HelloWoWFrame">
<Scripts>
</Frame>
</UI>
<script file="HelloWoW.lua"/>
<Frame name="HelloWoWFrame">
<Scripts>
</Frame>
</UI>
HelloWoW.lua
ì�´ë ‡ê²Œ 작성하면 Hello WOW!ê°€ 뜬다.
2.4. WOW API를 ì�´ìš©í•´ì„œ ì•„ì�´í…œ ì�´ë¦„ì�„ 불러오ìž�! ¶
WOW는 WOW API를 소개해주는 wiki를 ê°€ì§€ê³ ìžˆê³ API를 가보면 다양한것들ì�´ 있다.
http://www.wowwiki.com/World_of_Warcraft_API
ë˜�한 Widgetê³¼ LuaFunctionì�˜ ì‚¬ìš©ì •ë³´ë¥¼ 볼수 있다.
http://www.wowwiki.com/World_of_Warcraft_API
ë˜�한 Widgetê³¼ LuaFunctionì�˜ ì‚¬ìš©ì •ë³´ë¥¼ 볼수 있다.
여기서 ì•„ì�´í…œ 초성 퀴즈ì�˜ 기본ì�€ ì•„ì�´í…œ ì�´ë¦„ DB를 ê²€ìƒ‰í• ìˆ˜ 있어야한다. ê·¼ë�° WOWì•„ì�´í…œì�€ 현재 ì•„ì�´í…œ 넘버만 7ë§Œì�„ 넘는다. 중간중간 비어있는 indexë�„ 있다. ì�´ê²Œ ë¥ë¯¸. 아마 suffix때문ì�¼ê²ƒìœ¼ë¡œ 예ìƒ�ë�œë‹¤. suffix란 ì•„ì�´í…œì—� 부가ì �으로 ë¶™ì�€ 옵션ì�„ item indexì—�수치화 한것ì�„ 부르는 ë§�ì�¸ë�° 그것ì—� ë”°ë�¼ ì•„ì�´í…œì�˜ indexê°€ ê²°ì •ë�˜ëŠ”ê²ƒ ê°™ë�”ë�¼. (ì•„ì§� ì •í™•ížˆëŠ” 모른다)
ê·¸ë¦¬ê³ ì•„ì�´í…œ 리스트를 한꺼번ì—� 뽑는것ì�„ ì§€ì›�해주는 것ì�´ 아니ë�¼ì„œ 누구드ëž�, 블루아ì�´í…œ ê°™ì�€ ì• ë“œì˜¨ì�€ 심지어 ì•„ì�´í…œ ID와 ìº�시 ì •ë³´ê¹Œì§€ êµ¬í•´ë†“ê³ ìžˆë�”ë§Œ.. ê¹Œë³´ê³ ë†€ëž�네.
와우 ê²Œìž„ì •ë³´ ê³µì‹� 사ì�´íЏì—� 가면 ì•„ì�´í…œì�€ 50760ê°œë�¼ê³ 나와있다.
4.2 ì „ìœ¨í•˜ëŠ” 불ì�˜ë•…ì�˜ ì•„ì�´í…œì�´ 공개 후ì—� ì—…ë�°ì�´íЏ ë�œê²ƒì�´ë‹¤.
4.2 ì „ìœ¨í•˜ëŠ” 불ì�˜ë•…ì�˜ ì•„ì�´í…œì�´ 공개 후ì—� ì—…ë�°ì�´íЏ ë�œê²ƒì�´ë‹¤.
ì € 번호ì—� ì•„ì�´í…œ 넘버를 넣으면 해당 ì•„ì�´í…œ ì •ë³´ê°€ 들어가있는 페ì�´ì§€ë¡œ ì�´ë�™í•˜ê²Œ ë�œë‹¤. DB를 WOW안ì—�서와 웹페ì�´ì§€ 똑같ì�´ 관리 하는것 ê°™ì�€ë�° ì�´ë ‡ê²Œ 똑같ì�´ ë�˜ìžˆìœ¼ë‹ˆê¹Œ 좋다. 사실 Addonì—�서 페ì�´ì§€ì—�서 하나 빼오는걸로 ìƒ�ê°�했지만 가장 ì¢‹ë‹¤ê³ ìƒ�ê°�하는것ì�€ 블루아ì�´í…œê³¼ 누구드ëž�처럼 ì•„ì�´í…œ ì�´ë¦„ì�„ ë³´ê´€í•´ë†“ê³ Addonì�„ ë�Œë ¤ë³´ëŠ”ê²ƒì�´ ì •ì‹ ê±´ê°•ì—� ì�´ë¡œìš¸ê²ƒì�´ë�¼ê³ ìƒ�ê°�했다.
ì•„ì§� WOW addonì—� 대해서 모르는것ë�„ ìžˆê³ . WOWì—�서 사용하는 몇몇 ìž�료구조가 특ì�´í•œê±´ ì•Œê² ë‹¤. ì 장. Itemì—� ë” ë¶€ê°€ì •ë³´ê°€ ê·¸ë ‡ê²Œ ë§Žì�´ 붙어!! 여튼 그것ì—� 대해서는 한번 다시 ë‹¤ë£¨ì–´ë³´ì•„ì•¼ê² ë‹¤.
HelloWoW를 ìˆ˜ì •í•´ì„œ ë§Œë“ ê²ƒì�„ 한번 다시 ë³´ìž�
function HelloWoW_ShowMessage()
local baseName
local count = 1
local base = {}
baseName = GetItemInfo(25)
for i=25, 70000 do
end
for i = 1, #base do
endlocal count = 1
local base = {}
baseName = GetItemInfo(25)
for i=25, 70000 do
end
for i = 1, #base do
print(basei)
endìš°ì„ ì�¼ë‹¨ ì•„ì§� ì•„ì�´í…œ 번호는 7ë§Œì�„ 넘지 않는다 wowì•„ì�´í…œì •ë³´ì—� 관한건 나중ì—� 조사하기로 í•˜ê³ ê·¸ëž˜ì„œ i 는 와우 ì�¼ë°˜ itemì�˜ 최소 시작값ì�¸ 'ë‚¡ì�€ì‡¼íŠ¸ë‹¨ê²€' 25부터 시작해서 1만개ì�˜ ì•„ì�´í…œì�„ 검색해서 baseí…Œì�´ë¸”ì—� 한개씩 ì €ìž¥í•´ì„œ ì¶œë ¥í•œë‹¤.
결과는 잘ë�œë‹¤. 조금 ëŠ�ë¦¬ê² ì§€ë§Œ ì�´ê±¸ DB화해서 ì €ìž¥í•´ë†“ì•˜ë‹¤ê°€ í•´ë�„ 좋ì�„듯 한다. 최ì �화따윈 ìš°ì„ ë²„ë¦¬ê³ í•´ë³´ìž�.
ìˆ˜ì • 했다
ì•„ì�´í…œ ì •ë³´ 25번 부터 7ë§Œ 사ì�´ì�˜ ëžœë�¤ë³€ìˆ˜ë¥¼ 불러와서
ì•„ì�´í…œ ì •ë³´ê°€ 나온다면 ì¶œë ¥!
ì•„ì�´í…œë“¤ì�„ 모ë‘� ê°€ì ¸ì˜¤ëŠ”ê²ƒ 보단 ë¹ ë¥´ë‹¤. ì•ˆì „í•˜ì§„ 않지만..
ì•„ì�´í…œ ì •ë³´ê°€ 나온다면 ì¶œë ¥!
ì•„ì�´í…œë“¤ì�„ 모ë‘� ê°€ì ¸ì˜¤ëŠ”ê²ƒ 보단 ë¹ ë¥´ë‹¤. ì•ˆì „í•˜ì§„ 않지만..
function HelloWoW_ShowMessage()
local baseName = nil
repeat
until baseName ~= nil
print(baseName)
endrepeat
until baseName ~= nil
print(baseName)
� 그럼 파싱� 해보�
2.5. Luaì—�서 초성빼오기 ¶
ê²°êµ ì´ˆì„±ì�„ 빼오게 ë�˜ì—ˆë‹¤
황현ì�´ 준 UTF-8로 첫 ë°”ì�´íŠ¸ë¡œ ë’¤ì—� 몇바ì�´íŠ¸ë¥¼ 차지하는 문ìž�ì�¸ì§€ 보여주는 ë�„표를 ê°€ì§€ê³ Lua로 바꾸어보았다.
황현ì�´ 준 UTF-8로 첫 ë°”ì�´íŠ¸ë¡œ ë’¤ì—� 몇바ì�´íŠ¸ë¥¼ 차지하는 문ìž�ì�¸ì§€ 보여주는 ë�„표를 ê°€ì§€ê³ Lua로 바꾸어보았다.
헤� 바�트� 값� 범위로 한 UTF-8 글�� 바�트 수 알아내기 00000000 ~ 01111111 : 1 byte (0 ~ 127) 11000000 ~ 11011111 : 2 bytes (192 ~ 223) 11100000 ~ 11101111 : 3 bytes (224 ~ 239) 11110000 ~ 11110111 : 4 bytes (240 ~ 247) 11111000 ~ 11111011 : 5 bytes (248 ~ 251) 11111100 ~ 11111101 : 6 bytes (252 ~ 253)
아래 함수는 문ìž�ì—´ì�´ 들어오면 몇 byte를 차지해주는지 ì•Œë ¤ì£¼ëŠ” 함수ì�´ë‹¤
function charLen(str) calc = string.byte(str:sub(1,1)) --lua�서 byte로 char형� 변환하면 0��� 나온다. if(calc >= 0 and calc <= 127) then return 1 elseif(calc >= 192 and calc <= 223) then return 2 elseif(calc >= 224 and calc <= 239) then return 3 elseif(calc >= 240 and calc <= 247) then return 4 elseif(calc >= 248 and calc <= 251) then return 5 elseif(calc >= 252 and calc <= 253) then return 6 else return 0 end end
다시한번 �하�면 한글� 3byte�다.
ì�´ì œ 3byte를 ì°¾ì�„수 있으니 ì˜�문과 특수문ìž�ê°€ 섞여있어ë�„ 초성만 뽑아내는ë�°ëŠ” 아무 ë¬¸ì œ ì—†ì�„것ì�´ë‹¤.
ìž� ì�´ì œ 한글ì�„ 받아와서 초성만 뽑아 ë³´ìž�.
ì�´ì œ 3byte를 ì°¾ì�„수 있으니 ì˜�문과 특수문ìž�ê°€ 섞여있어ë�„ 초성만 뽑아내는ë�°ëŠ” 아무 ë¬¸ì œ ì—†ì�„것ì�´ë‹¤.
ìž� ì�´ì œ 한글ì�„ 받아와서 초성만 뽑아 ë³´ìž�.
~lua
Chosung = {"ㄱ","ㄲ","ㄴ","ㄷ","ㄸ","ㄹ","�","ㅂ","ㅃ","ㅅ","ㅆ","o","ㅈ","ㅉ","ㅊ","ㅋ","ㅌ","�","ㅎ"};
Middle = {"ã…�","ã…�","ã…‘","ã…’","ã…“","ã…”","ã…•","ã…–","ã…—","ã… ","ã…˜","ã…›","ã…™","ã…š","ã…œ","ã…�","ã…ž","ã…Ÿ","ã…¡","ã…¢","ã…£"};
Last = { "\0","ㄱ","ㄲ","ㄳ","ㄴ","ㄵ","ㄶ","ㄷ","ㄹ","ㄺ","ㄻ","ㄽ","ㄾ","ㄿ","ㅀ","�","ㅂ","ㅄ","ㅅ","ㅆ","o","ㅈ","ㅊ","ㅋ","ㅌ","�","ㅎ"};
function samplingFirst(str)
-- 1110xxxx 10yyyyzz 10zzwwww
local first = string.byte(str:sub(1,1)) - 224 -- 1110xxxx
local second = math.floor((string.byte(str:sub(2,2)) - 128)/4)
local third = math.floor((string.byte(str:sub(2,2))%4)*4 + (string.byte(str:sub(3,3)) - 128)/16)
local fourth = math.floor(string.byte(str:sub(3,3))%16)
local unicode = first * 16* 16* 16 + second * 16 * 16 + third * 16 + fourth
unicode = unicode - 0xAC00
local cho = math.floor(unicode / 21/ 28)
local goong = math.floor((unicode % (21*28))/28)
local jong = math.floor((unicode % 28))
return Chosung[cho+1];
end
ì�´ì œ 한글 문ìž�ì—´ì�„ 집어넣는다면 초성만 빼와주는것ì�„ ë°œê²¬í• ìˆ˜ 있다. Luaì—�서 초성 ㄱì�€ 3byte로 ì�¸ì‹�ë�˜ê¸° 때문ì—� ìº�ë¦í„°í˜• 'ㄱ'으로 ê°�싸면 환경ì—� ë”°ë�¼ ì—�러가 ë‚ ìˆ˜ 있다. ë”°ë�¼ì„œ 문ìž�ì—´ " "로 ê°�싸주었다.
ì�´ì œ ì�´ê²ƒì�„ ì�´ìš©í•˜ì—¬ "카르가스\:ì–¼ë�¼ì�´ì–¸ìФ\:Aldiana"를 한글ì�€ 초성만 ë½‘ê³ ê·¸ 외는 그냥 보존해서 ì¶œë ¥í•´ 보는것ì�„ 연습해보ìž�
~lua
function cstc(len, str)
return {type = len, body = str};
end
function makingTable(str)
stringtable = {}
for i = 1, #str do
len = charLen(str:sub(i,i))
if len ~= 0 then -- �거 안좋��..
stringtable[#stringtable+1] = cstc(len, str:sub(i,i+len-1))
end
end
chosungtable = {}
for i, v in ipairs(stringtable) do
if v.type == 3 then
chosungtable[#chosungtable+1] = cstc(v.type, samplingFirst(v.body))
else
chosungtable[#chosungtable+1] = cstc(v.type, v.body)
end
end
return stringtable, chosungtable
end
local a = "카르가스\:얼��언스\:Aldiana"
t,x = makingTable(a)
for i, v in ipairs(t) do
print(v.type .. " " .. v.body)
end
for i, v in ipairs(x) do
print(v.type .. " " .. v.body)
end
ì¶œë ¥ê²°ê³¼ :
카르가스:얼��언스:Aldiana
ㅋㄹㄱㅅ:ㅇㄹㅇㅇㅅ:Aldiana
ìž� ì•„ì�´í…œ 목ë¡�ë�„ ë¶ˆëŸ¬ì™”ê³ ì´ˆì„±ë�„ 빼왔으니 합치는걸로 가보ìž�
2.6. WOW Slash Command ¶
와우ì—�는 SlashCommandê°€ 있다. 그게 ë�ëƒ�ë©´..
/ëª…ë ¹ì–´ 란 것ì�´ë‹¤.
Addonì�„ ë§Œë“¤ê³ ì´ˆì„±í€´ì¦ˆëŠ” SlashCommand로 시작하게 í• ë ¤ê³ í•œë‹¤.
/초성퀴즈 시작 30
하면 30ê°œì�˜ ë¬¸ì œê°€ ì§„í–‰ë�œë‹¤.
하면 30ê°œì�˜ ë¬¸ì œê°€ ì§„í–‰ë�œë‹¤.
ì�´ì™¸ì—�ë�„ 기본셋팅ì�´ 필요하기ë�„ í•˜ê³ ì§„í–‰ 시나리오ë�„ 짜야하지만 ìš°ì„ SlashCommand로 ìž‘ë�™ì‹œì¼œë³´ìž�.
SlashCommand� 등�시키는것� 알아보�.
SLASH_ì• ë“œì˜¨ëª…# = '/명ì¹'으로 변수를 ì„¤ì •í•´ì£¼ë©´
WOWì—�서 '/명ì¹' ëª…ë ¹ì–´ëŠ” msg를 ë“¤ê³ function으로 들어가게 ë�œë‹¤.
~lua
function HelloWoW_OnLoad(self)
SLASH_HelloWoW1 = '/hiw';
SLASH_HelloWoW2 = '/hellow';
SLASH_HelloWoW3 = '/HelloWOW';
SlashCmdList["HelloWoW"] = function (msg)
HelloWoWF(msg)
end
end
function HelloWoWF(msg, editbox) -- 4.
print("Hello WOW")
end
와우 ìž…ë ¥ :/hiw
와우 시스템 ì¶œë ¥ : Hello WOW
SlashCmdList["ì• ë“œì˜¨ëª…"] = function(msg) 를 í•˜ê³ SLASH_ì• ë“œì˜¨ëª…# = '/명ì¹'으로 변수를 ì„¤ì •í•´ì£¼ë©´
WOWì—�서 '/명ì¹' ëª…ë ¹ì–´ëŠ” msg를 ë“¤ê³ function으로 들어가게 ë�œë‹¤.
위ì�˜ ì˜ˆì œì—�서는 3ê°œì�˜ 명ì¹ì�´ 있는것ì�´ë‹¤
�� 실행하면 같� 결과가 나오는것� 알수 있다.
다ì�Œì—� í• ì�¼ì�€ String 파싱으로 시나리오를 꾸며보ìž�.
2.7. CommandMessageParsing ¶
ìž� 슬래시 커맨드를 통해 받아온 msg를 ì¶œë ¥í•´ë³´ê³
parsing해서 �하는 문�만 뽑아보�.
parsing해서 �하는 문�만 뽑아보�.
실행 ë�¬ì�„때를 위해서 실행ë�˜ê³ 있는지 않는지ì—� 대한 flag를 넣어봤는ë�°
Addonì�´ ì �재ë�˜ë©´ 해당 프로그램 ì „ì²´ê°€ 올ë�¼ê°„것ì�´ê¸° 때문ì—� WOW 메모리ì—� í• ë‹¹ì�´ ë�˜ìžˆë‹¤. ë”°ë�¼ì„œ Addonì—�서 flag는 따로 메모리를 í• ë‹¹ 받았다는 얘기. ë”°ë�¼ì„œ ì „ì— ë³€ìˆ˜ëŠ” addonì�˜ 함수 ì–´ë””ì„œë“ ì ‘ê·¼ì�´ 가능하단 소리가 ë�œë‹¤.
Addonì�´ ì �재ë�˜ë©´ 해당 프로그램 ì „ì²´ê°€ 올ë�¼ê°„것ì�´ê¸° 때문ì—� WOW 메모리ì—� í• ë‹¹ì�´ ë�˜ìžˆë‹¤. ë”°ë�¼ì„œ Addonì—�서 flag는 따로 메모리를 í• ë‹¹ 받았다는 얘기. ë”°ë�¼ì„œ ì „ì— ë³€ìˆ˜ëŠ” addonì�˜ 함수 ì–´ë””ì„œë“ ì ‘ê·¼ì�´ 가능하단 소리가 ë�œë‹¤.
~lua
SLASH_HelloWoW1 = '/hiw';
SLASH_HelloWoW2 = '/hellow';
SLASH_HelloWoW3 = '/HelloWOW';
flag = false;
function HelloWoW_ShowMessage()
SlashCmdList["HelloWoW"] = function (msg)
HelloWoWF(msg)
end;
end
function HelloWoWF(msg, editbox)
print(msg)
local x;
if string.find(msg,"시작") then
if flag == false then
x = msg:match("시작%s(%d+)$");
print(x)
flag = true;
if x then
print("초성퀴즈 시작 " .. x .. " ë¬¸ì œ!");
else print("초성퀴즈 기본 시작 10 ë¬¸ì œ!");
end
else
print("초성퀴즈가 �미 실행중입니다");
end
elseif msg:find("종료") then
if flag == true then
print("초성퀴즈를 종료합니다");
flag = false;
else
print("초성퀴즈가 실행중�지 않습니다");
end
end
end
WOW ìž…ë ¥ : /hiw 종료
WOW ì¶œë ¥ : 초성퀴즈가 실행중ì�´ì§€ 않습니다
WOW ìž…ë ¥ : /hiw 시작 50
WOW ì¶œë ¥ : 초성퀴즈 시작 50 ë¬¸ì œ!
WOW ìž…ë ¥ : /hiw 종료
WOW ì¶œë ¥ : 초성퀴즈를 종료합니다
WOW ìž…ë ¥ : /hiw 종료
WOW ì¶œë ¥ : 초성퀴즈가 실행중ì�´ì§€ 않습니다
WOW ìž…ë ¥ : /hiw 시작
WOW ì¶œë ¥ : 초성퀴즈 기본 시작 10 ë¬¸ì œ
WOW ìž…ë ¥ : /hiw 시작 50
WOW ì¶œë ¥ : 초성퀴즈가 ì�´ë¯¸ 실행중입니다
string.find(msg,"시작")ì�€ msgì—�서 "시작"ì�´ëž€ 단어가 시작ë�˜ëŠ”ê³³ê³¼ ë��ì�„ 다중 ì�¸ìž�로 2ê°œ 넘겨주며 ê°’ì�´ ì—†ì�„때는 nilì�„ 리턴한다. ë”°ë�¼ì„œ, if문ì—�서 ì“°ë©´ luaì—�서는 nilì�„ ì œì™¸í•œ ëª¨ë“ ê°’ì�€ (심지어 0ê³¼ 공백스트ë§�""ë�„) true로 ì�¸ì‹�한다.
처ì�Œì—� ë¬¸ì œê°€ ìƒ�겼었는ë�° Eclipseì—�서 테스트하ë�˜ string.find(msg,"시작")ì�´ WOWì—�서 글씨가 깨지며 ì •ìƒ� ìž‘ë�™í•˜ì§€ 않았다. ê·¸ ì�´ìœ 는 무엇ì�´ëƒ� 하면 WOW Addoní�´ë�”ì—�서 lua파ì�¼ì�„ ìž‘ì—…í• ë•Œ 메모장ì�„ ì—´ê³ ìž‘ì—…í–ˆì—ˆëŠ”ë�° 메모장ì�˜ 기본 글ìž� Encoding타입ì�€ 윈ë�„ìš°ì—�서 ANSIì�´ë‹¤. ê·¸ë ‡ê¸° 때문ì—� WOWì—�서 쓰는 UTF-8과는 매ì¹ì�´ 안ë�˜ëŠ”ê²ƒ! ë”°ë�¼ì„œ 메모장ì—�서 새로 ì €ìž¥ -> ì €ìž¥ 버튼 ë°‘ì—� Encoding타입ì�„ UTF-8로 해주면 ì •ìƒ�ìž‘ë�™ 한다. ì�´ëž˜ì €ëž˜ 힘들게 한다.
x = string.match(msg,pattern) 는 patternì—� ë”°ë�¼ msg를 매ì¹í•´ì£¼ê³ 서브 패턴ì—� 맞는 ì�¸ìž�를 assign ì—°ì‚°ìž�(=)를 통해 넘겨주게 ë�œë‹¤.
위� 코드�서는
x = msg:match("시작%s(%d+)$");
으로 í•´ì„�하ìž�ë©´ 시작 다ì�Œì—� 공백ì�´ í•˜ë‚˜ìžˆê³ ìˆ«ìž�ì§‘í•© 다ì�Œì—� 문ìž�ì—´ì�´ ë��나는 문ìž�ì—´ì—�서 숫ìž� ì§‘í•©ì�„ x로 ê°€ì ¸ì˜¤ëž€ 소리다.
위� 코드�서는
x = msg:match("시작%s(%d+)$");
으로 í•´ì„�하ìž�ë©´ 시작 다ì�Œì—� 공백ì�´ í•˜ë‚˜ìžˆê³ ìˆ«ìž�ì§‘í•© 다ì�Œì—� 문ìž�ì—´ì�´ ë��나는 문ìž�ì—´ì—�서 숫ìž� ì§‘í•©ì�„ x로 ê°€ì ¸ì˜¤ëž€ 소리다.
패턴 매ì¹ì�€ 여기 있다. Luaì—�서 Sub patternì—� ì�˜í•´ 변수를 ê°€ì ¸ì˜¤ëŠ”ê±´ ë�” 찾아ë´�야한다.
ì�¼ë‹¨ ì�´ëŸ° ì €ëŸ° 것ì�„ 참조하면 하나 하나 ì™„ì„±í•˜ê³ ìžˆë‹¤.
ì§œì¦� : 테스트 ì¼€ì�´ìŠ¤ë¥¼ 와우ì—� 가서 ì�¼ì�¼ì�´ ìž…ë ¥í•˜ëŠ”ê²ƒë�„ 지겹다!!!
쉬운방법없나? ë�”러운 코드!! ì²ì†Œí•´ì¤˜!!
쉬운방법없나? ë�”러운 코드!! ì²ì†Œí•´ì¤˜!!
다ì�Œ : 채팅창과 lua파ì�¼ì�„ ì—°ë�™í•´ì„œ ëª¨ë“ ë©”ì‹œì§€ë¥¼ 처리하는걸 ë³´ìž�.
2.8. FrameEventHandling ¶
가장 빡센 공부가 ë� 걸로 ìƒ�ê°�ë�œë‹¤.
í•ìƒ� UI를 만지는ë�° ì–´ë ¤ìš´ê±´
�기화, Event Handling, UI꾸미기니�
WOW API를 ë’¤ì§€ê³ ë’¤ì ¸ì„œ ìš°ì„ Frameì�„ ì£¼ê³ Frameì—� DefaultChatWindowì—�서 메시지를 받아야 í• ê²ƒ 같다.
ìš°ì„ Luaì—�서 Frameì�„ ë¶ˆëŸ¬ì˜¤ë ¤ë©´ CreateFrameì�„ í•´ë´�ì•¼ê² ì§€
frameType
Frame 타입ì—� ë”°ë�¼ ìƒ�성ë�˜ëŠ”ê²Œ 달ë�¼ì§„다 "EditBox","Button"등 UIObject를 String 타입으로 넣어 ì„¤ì •í•´ì£¼ë©´ 타입ì�´ ê²°ì •ë�œë‹¤
Frame 타입ì—� ë”°ë�¼ ìƒ�성ë�˜ëŠ”ê²Œ 달ë�¼ì§„다 "EditBox","Button"등 UIObject를 String 타입으로 넣어 ì„¤ì •í•´ì£¼ë©´ 타입ì�´ ê²°ì •ë�œë‹¤
frameName
�름� 주면 �다 String타입.
�름� 주면 �다 String타입.
parentFrame
부모님ì�„ ì§€ì •í•´ì¤€ë‹¤.
부모님ì�„ ì§€ì •í•´ì¤€ë‹¤.
inheritsFrame
ìƒ�ì†�í• Frameì�„ ì§€ì •í•˜ëŠ”ê²ƒ ê°™ì�€ë�° 없으면 ìƒ�ì†� 안ë�œë‹¨ë‹¤. ì�´ëŸ°..
ìƒ�ì†�í• Frameì�„ ì§€ì •í•˜ëŠ”ê²ƒ ê°™ì�€ë�° 없으면 ìƒ�ì†� 안ë�œë‹¨ë‹¤. ì�´ëŸ°..
newFrame:setScript("OnLoad",funcname)
ì�´ë ‡ê²Œ 하면 OnLoadë�¼ëŠ” ì�´ë²¤íŠ¸ë•Œ funcnameì�´ 실행ë�œë‹¤.
http://www.wowwiki.com/WoW_constants
와우ì—�서 ìƒ�수값으로 ê°€ì§€ê³ ìžˆëŠ” 값들ì�€ 여기 나와있다.
와우ì—�서 ìƒ�수값으로 ê°€ì§€ê³ ìžˆëŠ” 값들ì�€ 여기 나와있다.
여기서 MainFrame� 찾아보�.
ì˜ˆì œë¡œ 들ì�€ê²Œ ë�ëƒ�하면 ë�„시ì—�서만 2. 거래 채ë„�ì�„ ì‚¬ìš©í• ìˆ˜ 있는ë�° ë°–ì—� 나갔ì�„때 ì�´ 채ë„�ì�´ 활성화ë�˜ìžˆì§€ë§Œ. CHAT_MSG_CHANNEL ì�´ë²¤íŠ¸ë¥¼ ë�”ì�´ìƒ� 서버ì—�서 ë³´ë‚´ì§€ 않는다는것ì�´ë‹¤.
여튼 메시지를 받으면 ë°œìƒ�ë�˜ëŠ” ì�´ë²¤íŠ¸ëž€ ì†Œë¦¬ê² ì§€.
다ì�Œì�˜ ì—�ì œëŠ” 기본 í”„ë ˆìž„ì—� RegisterEvent를 ìž…ë ¥ì‹œí‚¤ê³ ì±—ì�´ 들어올때마다 ì¶œë ¥í•˜ëŠ”ê²ƒì�´ë‹¤.
function HelloWoW_ShowMessage()
DEFAULT_CHAT_FRAME:RegisterEvent("CHAT_MSG_CHANNEL");
local function eventHandler(self, event, ...)
if (event == "CHAT_MSG_CHANNEL") then
local arg1, arg2, arg3, arg4, arg5, arg6, arg7, arg8, arg9 = ...;
print(arg1);
end
end
DEFAULT_CHAT_FRAME:SetScript("OnEvent", eventHandler);
end
ì–´ë µë‹¤.ìž� ì�´ì œ 채팅 메시지를 다 ë½‘ì•„ë²„ë ¤ë³´ìž�.
ì�´ê³³ì—� 가면 커뮤니케ì�´ì…˜ ì�´ë²¤íŠ¸ë¥¼ 볼수 있는ë�° ë‚´ê°€ ì�´ë²ˆì—� 대ìƒ�으로 하는 ì�´ë²¤íŠ¸ëŠ” 채팅 ê´€ë ¨ìœ¼ë¡œ "파티","길드","ì�¼ë°˜","공격대"로 해당 Chatì�´ ë°œìƒ�í• ë•Œë§ˆë‹¤ ë‚ ì•„ì˜¤ëŠ” Event를 캣치해서 ê°€ì ¸ì˜¨ë‹¤.
frameì�„ 만들어 놓으면 Eventê°€ ë°œìƒ�해서 받는 대ìƒ�ì—� ìƒ�관없ì�´ ëª¨ë“ ì�´ë²¤íŠ¸ê°€ ë‚ ì•„ì˜¤ê²Œ ë�œë‹¤.
�.. 다시 xml로 �아가 보�.
HelloWoW.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"> <script file="HelloWoW.lua"/> <Frame name="HelloWoW"> <Scripts> <OnLoad> HelloWoW_ShowMessage(self) </OnLoad> </Scripts> </Frame> </UI>self로 바꼈다!! self는 Frame ìž�ì‹ ì�„ ì�¼ì»«ëŠ”ë‹¤.
On_loadê°€ ë�˜ë©´ ìž�기 ìž�ì‹ ì�„ 넘겨서 HelloWoW를 실행시킨다.
HelloWoW.lua
function HelloWoW_ShowMessage(self)
local frame = self;
frame:RegisterEvent("CHAT_MSG_CHANNEL");
frame:RegisterEvent("CHAT_MSG_SAY");
frame:RegisterEvent("CHAT_MSG_PARTY");
frame:RegisterEvent("CHAT_MSG_YELL");
frame:RegisterEvent("CHAT_MSG_GUILD");
print("Load OK")
local function eventHandler(self, event, ...)
if (event == "CHAT_MSG_CHANNEL" or event == "CHAT_MSG_SAY") then
local arg1, arg2, arg3, arg4, arg5, arg6, arg7, arg8, arg9 = ...;
print(arg1);
print(arg2);
end
end
frame:SetScript("OnEvent", eventHandler);
end
ì�´ë ‡ê²Œ 하면 ì�´ë²¤íЏ 등ë¡�한것ì�€
frame:RegisterEvent("CHAT_MSG_CHANNEL");
frame:RegisterEvent("CHAT_MSG_SAY");
frame:RegisterEvent("CHAT_MSG_PARTY");
frame:RegisterEvent("CHAT_MSG_YELL");
frame:RegisterEvent("CHAT_MSG_GUILD");
다섯가지지만 CHAT_MSG_CHANNEL CHAT_MSG_SAY ì�´ê²ƒ ë‘�가지만 ì¶œë ¥í•˜ëŠ”ê²ƒì�„ 알 수 있다.ìž� ì�´ì œ ì�´ê²ƒì�„ 실행하면 로드가 ë�˜ë©´ Load_OKë�¼ê³ 하면서 ì§„í–‰ë�œë‹¤.
ì�´ì œ 채팅창ì—� 올ë�¼ì˜¤ëŠ” ëª¨ë“ ë¬¸ìž�를 print해준다.
eventHandler(self, event, ...)
self는 ì�´ë²¤íŠ¸ë¥¼ ë°›ì�€ frameì�´ë‚˜ ê°�체를 ë§�í•˜ê³ event는 해당 ì�´ë²¤íЏ. ê·¸ë¦¬ê³ ê°€ë³€ ì�¸ìž� ... ì—�서 뽑아온 arg1~arg9는 Communication Eventê°€ ë°œìƒ�ë� 때 건네주는 ì�¸ìž�를 받아와주는것으로 대체ì �으로 arg1ì—�는 msg arg2ì—�는 authorê°€ 들어가 있다.
ì�´ì œ 다ì�Œì—�는 타ì�´ë¨¸ë¥¼ 쓰는것ì�„ 배워보ìž�.
2.9. ìž�ë�™ Update함수 ì°¾ê³ timer찾기 ¶
여행갔다와서 다 까먹�다�� 하는 Addon만들기.
Timer는 어떻게 만들까?
ìš°ì„ WOW APIì—�서 ì§€ì›�해주는것ì�€ getTime()..
ì¶œë ¥ì�€ 잘ë�œë‹¤.
ì¶œë ¥ì�€ 잘ë�œë‹¤.
~lua
seconds = GetTime();
print("Current system uptime is: "..seconds.." seconds!");
ìš°ì„ ì™€ìš°ì—�서는 API설명ìƒ�. Addonì—� Sleepì�„ 걸어놓으면 ì „ì²´ 시스템ì�´ 멈추는것으로 ë�˜ì–´ìžˆë‹¤. ê·¸ë ‡ë‹¤ë©´ ì“°ë ˆë“œë¥¼ 만들어서 Sleepì�„ 했다가. 복귀하면 하는건 어떨까? ìš°ì„ Sleepì�„ Luaì�˜ System함수 패키지ì�¸ OSì—�서는 ì§€ì›�해주지 않는다.
그래서 Lua 홈페ì�´ì§€ì—�서 ì°¾ì•„ë³´ê² ë‹¤.
�곳�서는 Lua로 작성� 다양한 환경� sleep� 볼수 있다.
Coroutineì�„ ì�´ìš©í•´ì„œ 만드는듯 한ë�° ë”ê°€ ì�´ìƒ�하다.
Coroutineì�´ 다른 ì“°ë ˆë“œë¥¼ 하는건가? ì�´ìƒ�하다. Busy Wait로 ë§Œë“ Sleepì�„ 해서 하는건ë�° Thread해서 다른 타ì�´ë°�ì—� 나오는것 같지가 않다???
ë�ì—¬ ì�´ê±°.
~lua
local clock = os.clock
function sleep(n) -- seconds
local t0 = clock()
while clock() - t0 <= n do end
end
co = coroutine.create(function()
print("what")
sleep(5)
end
)
print("what")
print("main",coroutine.resume(co));
ì�´ê±¸ 실행하면 whatì�´ ë¨¼ì €ë‚˜ì˜¤ëŠ”ê²ƒ 맞다.ê·¸ë¦¬ê³ sleep(5)를 하면 5초뒤ì—� 실행ì�´ë‹¤. 주ì�˜. Millisecondê°€ 아니다.
시뮬ì�„ ë�Œë ¤ë³¸ ê²°ê³¼ Coroutineì�€ 다른 Thread 단위로 ë�Œì•„가는것ì�´ 아니ë�¼ mainì—�서 ê°™ì�´ ë�Œì•„가는것으로 나왔다. ì�´ê±° ì§„ì§œ 어떤경우ì—� 쓰는건지.. 여튼.
2주를 찾아서 ��으로 0.1초나 0.2초사�� ��으로 Check를 해주는 함수를 찾아해매었다.
그러다가 OnUpdate�는 Event를 발견하게 �는� 설명� 보�
{{{
How Often Is It Called
The game engine will call your OnUpdate function once each frame. This is (in most cases) extremely excessive.
Ctrl + R to see the FPS on screen.
}}
FPS... Frame Per Second마다 불린단다. 그러니까 대략 1/60초 마다 한번 불린단다.
그래서 OnUpdate를 Frameì—� 등ë¡�í•˜ê³ ì‚¬ìš©í•´ë³´ì•˜ë‹¤.
{{{
<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">
<script file="HelloWoW.lua"/>
<Frame name="HelloWoW">
<Scripts>
<OnLoad>self.TimeSinceLastUpdate = 0 </OnLoad>
<OnUpdate function="HelloWoW_OnUpdate"></OnUpdate>
</Scripts>
</Frame>
</UI>
}}}
ìž� Frameì—� OnUpdateë�¼ëŠ”ê²Œ ìžˆê³ OnUpdateê°€ 실행ë� 때마다 HelloWoW_OnUpdateë�¼ëŠ” 함수를 실행해준다.
근� 실행해보면..?
{{{
function HelloWoW_OnUpdate(self, elapsed)
self.TimeSinceLastUpdate = self.TimeSinceLastUpdate + elapsed;
if (self.TimeSinceLastUpdate > MyAddon_UpdateInterval) then
--
-- Insert your OnUpdate code here
--
TimeSet();
self.TimeSinceLastUpdate = 0;
end
end
function TimeSet(){
seconds = GetTime();
print("Current system uptime is: "..seconds.." seconds!");
}
}}}
근�...
실행� 안�다?
ì�´ìœ 를 보니ê¹�.
{{{
When Is It Called Edit
OnUpdate is not called on any hidden frames, only while they are shown on-screen. OnUpdate will also never be called on a virtual frame, but will be called on any frames that inherit from one.
}}}
ê°€ìƒ� Frameì—�ì„ ì•ˆë�Œì•„간다는것ì�´ë‹¤. ì•„ìš°.. ì§�ì ‘ Frameì�„ 나오게 í•˜ê³ ë§Œë“¤ì–´ì•¼ ë�œë‹¤.
그래서 나는 ì˜ˆì œë¡œ 배우는 프로그래ë°� 루아 ë�¼ëŠ” ì±…ì�„ ë�„서관ì—�서 ë¹Œë ¤ì„œ WOW Addon Studio를 깔게 ë�˜ì—ˆë‹¤.
WOW Addon Studio는 WOW Addonì�˜ UIë””ìž�ì�¸ê³¼ ì�´ë²¤íЏ 헨들ë§�ì�„ ë�„와주는 ìœ ìš©í•œ 툴ì�´ë‹¤.
Addon Studio는 �게 V1.0.1과 V2.0으로 나눌수 있는�
1.0.1ì�€ Visual Studio 2008ì�„ ì§€ì›�í•˜ê³ V2.0ì�€ Visual Studio 2010ì�„ ì§€ì›�한다 당연히 V2.0ì�´ ì§€ì›�하는 기능ì�€ ë�” ë§Žë‹¤ê³ ì�¨ìžˆë‹¤.
사�트는 http://www.codeplex.com/WarcraftAddOnStudio �서 다운 받� 수 있다.
Basic Addon UI나 ACE UI를 지�해준다.
Project를 Visual Studioì�˜ 기본과 ê°™ì�´ 만들으면 Frameì�´ 하나 ëœ¨ê³ Frameì�„ 누르게 ë�˜ë©´ 우측 하단ì—� Propertiesì—�서 EventHandlingì�„ 하게 ë�œë‹¤.
ë„£ê³ ì‹¶ì�€ ì�´ë²¤íŠ¸ë¥¼ ëˆ„ë¥´ê³ Create버튼ì�„ 누르면 Functionì�„ ì œìž‘í• ìˆ˜ 있게ë�˜ê³ Lua파ì�¼ì—� ìž�ë�™ìœ¼ë¡œ Scriptê°€ 등ë¡�ë�˜ê²Œ ë�œë‹¤.
ë� 그래서..
OnUpdateì—� ì �ìš©í• í•¨ìˆ˜ë¥¼ ë§Œë“¤ê³ ê°€ìƒ� í”„ë ˆìž„ì�´ 아닌 ì‹¤ì œ í”„ë ˆìž„ì�„ 툴로 만들어 ìƒ�성하게 하면
{{{
Frame.xml
<Ui xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns="http://www.blizzard.com/wow/ui/">
<Script file="Frame.lua" />
<Frame name="Frame1" parent="UIParent" toplevel="true" movable="true" enableMouse="true">
<Size>
<AbsDimension x="359" y="303" />
</Size>
<Anchors>
<Anchor point="TOPLEFT">
<Offset>
<AbsDimension x="100" y="-47" />
</Offset>
</Anchor>
</Anchors>
<Scripts>
<OnUpdate>Frame1_OnUpdate();</OnUpdate>
<OnMouseDown>self:StartMoving();</OnMouseDown>
<OnMouseUp>self:StopMovingOrSizing();</OnMouseUp>
</Scripts>
<Backdrop bgFile="Interface\DialogFrame\UI-DialogBox-Background" edgeFile="Interface\DialogFrame\UI-DialogBox-Border" tile="true">
<BackgroundInsets>
<AbsInset left="11" right="12" top="12" bottom="11" />
</BackgroundInsets>
<TileSize>
<AbsValue val="32" />
</TileSize>
<EdgeSize>
<AbsValue val="32" />
</EdgeSize>
</Backdrop>
</Frame>
</Ui>
}}}
ì�´ë ‡ê²Œ 만들어주게 ë�œë‹¤.
{{{
Frame.lua
-- Author : June
-- Create Date : 2011-08-12 ì˜¤ì „ 2:23:05
function Frame1_OnUpdate()
--put your event handler logic here
seconds = GetTime();
print("Current system uptime is: "..seconds.." seconds!");
end
}}}
{{{
## X-AutoGenerated: true
## X-GeneratorComment: Basic project properties and project files will be automatically added during deployment. Properties added by the user will be copied without changes.
## Interface: 40200
## Title: WowAddon1
## Notes: Basic WoW Addon
## Author: June
## Version: 0.1Beta
Frame.xml
Frame.lua
}}}
ì�´ë ‡ê²Œ ìž�ë�™ìƒ�성ë�œë‹¤.
해당 해드온� �리면 초당 60회씩 Time� 채�하는걸 볼수 있다.
ì�´ì œ..
ëª¨ë“ ì¤€ë¹„ê°€ 맞춰졌다!!!
다ì�Œì—� í• ì�¼ : 프로그램 시나리오 ë°� 구성
== ë‚¨ê¸°ê³ ì‹¶ì�€ ë§� ==










