2015年10月10日 星期六

光暈路亞研究所

路亞修行是光暈單人練習的模式之一,玩家可以自己寫程式控制自己的角色在戰場作戰。


※ 徵求光暈路亞研究網站 : 可在底下留言板或嘎姆小哈片刻的留言板推薦,我會將完整易懂的網站列在文末以及遊戲中。

>> 光暈路亞API: 來這邊可以流覽所有me的資料和可控制的動作
>> 如何利用遊戲中下載的『光暈路亞偵錯環境』
>> 光暈路亞程式範例

系統介紹:

在路亞修行的模式中,進入遊戲前會先自動開啟一個「路亞檔案管理員」,用來增加/更新/刪除你的路亞檔案。其中一個最重要的檔案叫 main.lua ,這是遊戲中會不斷去執行的路亞檔,你可以在這個檔案裏依不同的情況,控制角色攻擊、移動或說話。

如果 main.lua 裏面內容太多,你也可以將各種情況分類後,將程式寫在不同的檔案裏,然後在 main.lua 中依情況決定去執行別的檔案,比如說,除了 main.lua ,你還可以增加 spirit.lua,如果你發現目前角色已變成靈體,就改去執行 spirit.lua ,這樣就可以把程式邏輯分類管理,才不會看到一個超大的檔案讓你頭痛。

第一次進入遊戲,系統會先送你一組程式檔案,你不用改動任何程式就可以進去遊玩。對照程式內容和遊戲體驗,就會發現路亞的強大與趣味。

路亞介紹:

路亞(Lua)是當今最受歡迎的程式語言之一,許多遊戲裏都有利用路亞設計關卡的機關、魔王的智慧、遊戲的視窗介面等,學會路亞對於未來想從事遊戲設計的同學們絕對有幫助。

路亞就如同其他的程式語言一樣,都是人類說話給電腦聽的方法,以下我們會從一行程式開始,慢慢熟悉路亞這個語言。

請開啟光暈的路亞修行,在路亞檔案管理員中點選 main.lua, 這樣就可以在遊戲中快速編輯程式。

首先把 main.lua 清空,一個字都不要留。(可以在路亞檔案管理員,刪除 main.lua 將其還原成光暈初始的檔案內容)
然後在第一行寫下

me.talk("你好!")

這就是一行程式了,你可以進入戰鬥玩看看,然後再繼續編輯 main.lua。
現在來解釋一下這行程式是在搞什麼鬼。

首先,在光暈的路亞裏,有兩個重要的物件:
一個是 me (玩家自己) - 用來控制自己的角色
一個是 game (遊戲) - 用來取得戰場上的狀況
me 後面的小數點,是用來取得 me 裏面的資料,也包括 me 可以做的動作。
talk 是me可以做的動作之一,中文叫「說話」
talk 後面的括號就是用來輸入要講的內容
如果要講的內容是一串字,就要加上引號(") (不然電腦會以為那一串字是一個物件)

接下來你可以試試這一行

me.talk(me.info.name)

me裏面有一個物件叫做 info,而 info 裏又有一個物件叫 name, 這個name物件剛好是一個字串,所以可以輸入給 me.talk() 使用。

me.talk() 這就相當於一個光暈同人陣裏的一個「動作」。接下來我們就要來看看相當於同人陣裏的「事件」和「檢查」是怎麼一回事。

路亞的事件和同人陣不一樣,是有好幾個種類的,主要有以下四種
我們先研究 if then else end, 在路亞修行中,90%都是在用它

if ... then ... else ... end 翻成中文就是: 如果(if) ... 就(then) ... 否則就(else) ...。(end)
最後的句點很重要,這樣電腦才看得懂這個事件是從 if 開始到 end 結束
我們在 main.lua 裏的第二行開始寫下面的這段話

if me.hp < me.hpMax then
  me.talk("我受傷了!")
else
  me.talk("滿血狀態!")
end

首先有注意到我們會控制程式碼的縮排嗎? me.talk的前面都有空格,這是因為這樣比較好看,一眼望去就能理解這段話的內容和結構。
以下逐行翻譯:

--如果(if) 我的血量比我的最大血量少 就(then)
if me.hp < me.hpMax then
  --說話
  me.talk("我受傷了!")
--否則(else)就
else
  --說話
  me.talk("滿血狀態!")
--句點結束
end

這樣就相當於一個同人陣的事件,裏面有
me.hp < me.hpMax 這個檢查
以及
me.talk() 這些動作

>> 光暈路亞 API : 來這邊可以流覽所有 me 的資料和可控制的動作


接下來另一個很重要的事件是 for ... do ... end
這個翻成中文就是 對於每個(for) ... 都要做(do) ... 。(end)
這個可能比較難理解,我們用實際的例子來說明。

首先要介紹一下 game.events 這個可以在光暈路亞中取得的事件列表,這裏面是一串剛發生的事件,不過通常裏面沒有資料,在程式的術語裏叫空陣列(empty array)
但如果有發生特殊事件時,我們就可以根據這個事件列表來做出反應。
以下範例:

--在列表前加一個#符號,就會取得這個列表裏有多少筆資料
--所以下面這一行意思就是,如果突發事件列表裏有多於0筆資料時,我們就...
if #game.events > 0 then
 --重點來了
 --這句話翻成中文就是
 --把game.events的每一筆資料都拆成 i(順序編號) 和 event (事件資料)
 --並對每筆資料進行以下檢查與動作
 for i, event in ipairs(game.events) do
  --如果有一個事件是我被攻擊了的話就
  if event.type == "beingAttacked" then
   --大叫「痛啊」
   me.talk("痛啊~")
   --然後轉頭到攻擊過來的角度
   me.turnTo(event.angle)
   --按一下滑鼠反擊
   me.triggerMouse()
  --如果有一個事件是我的武器被打落了
  elseif event.type == "weaponKnockedOff" then
   --按一下esc切換回預設武器
   me.triggerKeyboard("esc")
  end
 end
end

你可以將這段程式貼在main.lua中,看看他的效果如何。

更多路亞資源



※ 徵求光暈路亞研究網站 : 可在底下留言板或嘎姆小哈片刻的留言板推薦,我會將完整易懂的網站列在這裏以及遊戲中。

26 則留言:

  1. 二香
    我懂這個惹!!

    回覆刪除
  2. 作者已經移除這則留言。

    回覆刪除
    回覆
    1. 一個直接寫程式語一個是利用已經做好的插件做任務根本不一樣,如果沒有同人陣要做任務就只能自己打程式語設計插件

      刪除
    2. 可能對有些人而言沒差吧...

      刪除
  3. 能這樣寫同人的話限制會少很多
    檢查的延遲也會改善
    連AI都可以自己寫
    大推!

    小一留

    回覆刪除
  4. 好!希望能把狙擊槍英文附上!接下來我就OK

    回覆刪除
  5. 如果我懂路亞而又有機會進入嘎呣,我一定會把以前林家文寫過的蛙人套裝編出來。

    回覆刪除
  6. 能否多出點新任務和新模式阿.....

    回覆刪除
  7. 請告訴我 找最近的槍 怎嚜翻

    回覆刪除
  8. 如果消耗2條生命

    要怎麼翻???

    回覆刪除
    回覆
    1. 可能就要扣100%再扣100%吧..

      刪除
  9. 作者我的嘎姆登不進去耶 0~0

    回覆刪除
  10. 從國小玩到現在高中資訊科感謝光暈給我一個很好的管道練習寫程式

    回覆刪除
  11. 這不就是要製造出最強的電腦馬ouo

    回覆刪除
  12. 我不小心把開頭的字刪掉嘞!!請問前面的字是什ㄇ??

    回覆刪除
  13. 設定技能的等級是在什麼情況用?

    回覆刪除
  14. me.fineClosestItem()找最近的道具
    me.fineClosestItem("彈匣")找最近的彈匣
    me.findClosestItem("大刀","狙擊槍")找最近的大刀或狙擊槍
    請問這邊是錯誤嗎? 上面2個是fine 第3個是find 還是要找的物品不同的關係?

    回覆刪除
    回覆
    1. 尋找的英文是find,另外我不認為程式會懂中文所以可能要找正式的武器代碼甚麼的
      me.findClosestItem(XXX)

      刪除
    2. 其實find是「找到」的意思喔。

      刪除
  15. 請問 路亞檔案管理員 要怎還原成光暈原始檔

    回覆刪除
  16. 我的AI不會打人了 怎麼讓我打人?
    怎麼還原阿~~~

    回覆刪除
  17. 作者已經移除這則留言。

    回覆刪除