創作內容

0 GP

(雜聊)不為誰而做的遊戲--從零到8.7,我在RMVA嘗試地圖對戰的故事

作者:SleepyZz│RPG 製作大師 VX│2018-08-07 20:47:57│巴幣:0│人氣:101
簡言之,這篇文章是我做遊戲的一些心路歷程,中段會提到我嘗試在RMVA實踐ARPG的指令碼(不用程式語言,故我不說它是程式碼)

話說大家好,我是Zz,如果你有看過我這篇文,或者聽過我一些Murmur,或者你認識三次元的我本人,或許聽過我開發過RM的故事。

想看程式實作請直接CTRL+F 懶人包

原先,它應該是要做為我們社團成果出展,但因為一連串又臭又長的原因,簡言之做RPG的事情只是我的一頭熱,原先在去年暑假,大家約定要分擔工作來開發這款遊戲,在我可愛又可悲的社員拖泥帶水、推卸責任、逃避現實、屢屢爽約之後,這款遊戲有8.7成可以說都是我在開發(8.7成還算客氣了,或許也能說將近十成)

搞得我後來大學要跟人家合作,不是叫對方先把錢拿來、就是叫對方先拿五成左右的成品給我看,不然我是不屑一顧的。
人情是我看過大學生最廉價的東西沒有之一,反正也不常見面、沒人會譴責這些,時間到了就逃跑了,沒有強制力的事情還是少幹的好,反正「計畫」要做的事情,不管今天是通識課、社團、系會還是啥的,沒拿出來的東西,就先押它辦不到。
還有不拿成文契約、不犯法、不知道就都不要碰,被利用這種事情,永遠不知道會在哪一天發生

好啦,抱怨就先在這裡打住,從合作夥伴到看到Zz我本人就急著跑,之中到底發生尛複雜的事情,哪天有機會再去講吧

我的科系沒有說很偏重程式語言這一塊,雖然發文當下我才大二,但以本系未來出路加上程式語言多半為選修課來看,其實我不懂多數程式語言。

接著,當初在碰RPG Maker VA的時候,我以為像"野比大雄的BIO"那種遊戲靠內建系統設定就可以簡單做出來,實際碰了才知道,多數要靠程式語言去實踐,而且每一代的RM用的Ruby語法都不一樣,聽說最新一代適用JAVA來著,看到頭就痛起來。

我嘗試拆包去改別人的語法,結果怎麼改系統都卡死,就這麼持續了大約兩三週吧,實在是受不了了,於是嘗試用內部語法去實踐這個系統

其實說是ARPG,我也只實踐到能夠在地圖上拿刀砍敵人如此爾爾,還沒有做到像野比大雄那般可以按鍵切換武器,也沒有拿槍遠程攻擊,當初有想到「可能性」但沒有實測。

還好有巴哈RM版的資料,還有一個對岸已經倒掉的論壇(聽說有再復活啦),看到人家的提點才想出這個寫法,不會說這寫法是我原創的,假設你覺得這篇文章對你寫「地圖內戰鬥」有幫助的話,你就拿去用吧,我想全力衝「寫小說」方面,短時間內不想再碰RM了。



-----------閒聊到此結束,下方為介紹-----------




(建議用公共事件寫,標準執行即可)

首先呢,如果要在地圖上戰鬥,你要先判斷主角的位置、敵人的位置,當主角面對敵人的時候,他可以攻擊;反之他如果背對敵人就不能打啦,主角拿刀讓他只砍得中前方的敵人。

敵人也是同理,讓他們設定成只能攻擊前方的敵人。

如此我們必須判定主角、敵人方位,於是我們設定變量:

1.主角的X軸=玩家的地圖X軸
2.主角的X軸=玩家的地圖Y軸
3.敵人的X軸=本事件的地圖X軸
4.敵人的X軸=本事件的地圖Y軸

接著,就可以來寫判定主角和敵人面向的部分啦

這是一張簡潔有力的示意圖,假設玩家是黑圓(左),敵人是紅圓(右)


這是主角面向左邊的時候,那他們的Y座標會是一樣的
但以X座標來看,左小右大,所以主角的X座標會<敵人X座標

所以可以先試著寫判別式:

IF(本事件 面向左邊)
(↑讓事件成立)
{
先做變量操作:
事件Y軸-主角Y軸
事件X軸-主角X軸

IF(事件X軸<=1)
(↑理論上它要是等於1,如果間隔2就攻擊不中了)
{
IF(事件X軸>=0)
(↑站主角左邊不會觸發,因為現在敵人面向左)
{
IF(事件Y軸==0)
(↑不能讓同X軸Y軸不等,也就是站上或站下不能成立)
{

如此判定完以後就可以讓主角直接扣血嗎?可惜,它是錯的!

如此寫完如果你直接補上扣血變量會有個嚴重BUG,你會發現你這麼寫明明理論上沒什麼錯,但NPC不管走路多快都能"隔山打牛"。

以下是我的揣測,我不確定真實原因:
理由大概是因為電腦判定XY軸時,都是取整數導致,你從座標1到座標2之間會有個時間差,程式並不會判定為座標1.5或座標1.3之類等,不確定式無條件捨去還是四捨五入,反正中間理論上會有延遲時間。

再加上,常玩遊戲的你應該有感,如果對手要發動攻擊前,應該會有警告音(敵人的叫聲)或者出招動作,如果沒做類似警告的動作動畫,給人感覺就像一張紙晃過來、一如往常晃過來你就莫名被揍了。

這邊因為我不會畫RM的動作圖,所以我把程式碼用"顯示心情"

{
顯示心情:本事件,憤怒
設定移動路線:本事件(等待結束)
朝向玩家
等待:10幀(1/6秒)

好,那把警告寫完、延遲設計等待時間,就可以扣血了嗎?
還是錯的。

同上述推測,我並不明確知道座標判定的時間會幾秒"掃描一次",對我們肉眼看到的畫面可能它只在一瞬間碰到我,但程式已經反覆掃描過四五次,上面的寫法,會讓等待時間變成"扣血觸發的剎那要在幾秒後發生"而不是"延遲幾秒扣掉玩家的血"

這邊就是筆者開發失敗卡很久的地方,網路上的教學我印象中只說到這裡,然後我搬他的邏輯進去寫,寫到這裡我卡快十個小時不思其解。

沒關係,那到這邊我們讓程式重新判定一次。

因為第一次是警告,第二次才是實際攻擊,所以再把開頭部分複製貼上一次,讓程式重新判定:
{
主角的X軸=玩家的地圖X軸
主角的X軸=玩家的地圖Y軸
敵人的X軸=本事件的地圖X軸
敵人的X軸=本事件的地圖Y軸

因為程式前半已經把這四個數字改掉,非當前的XY軸,所以重新設置
然後我們再包一層一模模一樣樣的程式碼:

事件Y軸-主角Y軸
事件X軸-主角X軸

IF(事件X軸<=1)
{
IF(事件X軸>=0)
{
IF(事件Y軸==0)
{
至此,就可以代入主角扣血受傷的部分:

顯示動畫:玩家,受傷
增減體力值:全體(或指定主角應該也行啦),-N

但,它還是會有一個問題,就是敵人在打你的時候會是N連擊,只要程式判斷到,就會往你臉上一直毆,身為玩家的我們沒有喘息的空間。
為了避免這種狀況,好比說楓之谷,玩家受傷時腳色會閃爍、擊退、進入短暫的無敵狀態,好讓我們的對手不要老是平砍連擊帶順劈。
順便,讓這整個程式不要卡死在最後一段程式語言,每次主角遇到敵人應該被重新判定,而不是沿用第一個判定結果。
印象中這是"沉默的小鎮"作者那位巴友提點的,就是你要設定一個"無敵開關"的存在,當這個開關打開,我們的角色無敵一小段時間;關閉的話讓主角繼續受傷。

所以改寫程式碼如下,

事件Y軸-主角Y軸
事件X軸-主角X軸

IF(事件X軸<=1)
{
IF(事件X軸>=0)
{
IF(事件Y軸==0)
{
開關操作:XXXX 開啟
顯示動畫:玩家受傷
增減體力值:全體,-N




這是其中一個方位的寫法,當你完成四個方位以後,再在最外圍用:
IF開關 XXXX 被關閉
包住所有程式碼

相反再寫一個
IF開關 XXXX 被開啟

等待:N幀(看你想無敵多久)
開關操作 XXXX 關閉

那麼這整個事件就大功告成啦!如此便完成主角撞到怪物會扣血的公共事件。
主角如果要他攻擊,同理就把判定方向對調即可(主角O軸-事0件的O軸、如果主角面向事件......)

但不同的點是,當我們按下攻擊按鈕,才可以觸發用武器攻擊,除非你想做自動撞怪這種功能啦。
因為判定是由"玩家按下按鈕後觸發",不會有無限判定的可能,所以要在程式碼中安插"等待N幀"來作為主角的攻擊延遲。

還有一點,怪物是有血量設定的(除非你想設計不死啦,但不死玩家攻擊他心酸的啊?),所以判別式勢必要建立於怪物的血量>0的情況,每個怪物......我沒有實測過,但應該是"不能共用變量",否則一隻怪死全部倒光光,BUT如果在不同地圖可以考慮用上一張地圖的變量(同編號的),因為切換地圖剛開始時可以重設一次變量。

一樣以玩家面向左側攻擊敵人做示範,則程式會變成:

IF 變量[怪物血量] > 0{
IF按鈕C被按下時(設定哪一個你可以開RM遊戲按F1,裡面會有按鍵對照鍵盤的對照表,我個人是設定成C=鍵盤Z鍵){

(↑包最外面把四個方位的判別式夾起來)

IF 玩家面朝左{
主角的X軸=玩家的地圖X軸
主角的X軸=玩家的地圖Y軸
敵人的X軸=本事件的地圖X軸
敵人的X軸=本事件的地圖Y軸

主角Y軸-事件Y軸
主角X軸-事件X軸
IF(事件X軸<=1)
{
IF(事件X軸>=0)
{
IF(事件Y軸==0)
{

如上打完後,利用等待幀數來決定延遲,呃這邊個人經驗是你實際玩一次來決定延遲如何是合理的,跟怪物撞人一樣要寫兩圈,外圈會感應你按下按鍵後要過多久會判定,內圈會在扣血後決定你過多久可以再砍下一刀。

故我把外圈設短、內圈設長,做個範例:

等待:5幀
(再做一圈)
主角的X軸=玩家的地圖X軸
主角的X軸=玩家的地圖Y軸
敵人的X軸=本事件的地圖X軸
敵人的X軸=本事件的地圖Y軸

主角Y軸-事件Y軸
主角X軸-事件X軸
IF(事件X軸<=1)
{
IF(事件X軸>=0)
{
IF(事件Y軸==0)
{
顯示動畫:[怪物](顯示的對象),砍人
變量操作:怪物血量,-=N
等待:45幀

END

最後幫大家做個懶人包,統整全部的程式碼,因為我原始的程式碼不知為何有多幾行,故我放上程式碼截圖,如果你看得懂,或者我上述解說有錯不知道為何寫不出來,也可以直接參考。

事件:怪物攻擊人類

IF開關 XXXX 被關閉{
IF(本事件 面向左邊){
變量操作:主角的X軸=玩家的地圖X軸
變量操作:主角的X軸=玩家的地圖Y軸
變量操作:敵人的X軸=本事件的地圖X軸
變量操作:敵人的X軸=本事件的地圖Y軸
事件Y軸-=主角Y軸
事件X軸-=主角X軸
IF(事件X軸<=1){
IF(事件X軸>=0){
IF(事件Y軸==0){
顯示心情:本事件,憤怒
設定移動路線:本事件(等待結束)
朝向玩家
等待:10幀(1/6秒)
變量操作:主角的X軸=玩家的地圖X軸
變量操作:主角的X軸=玩家的地圖Y軸
變量操作:敵人的X軸=本事件的地圖X軸
變量操作:敵人的X軸=本事件的地圖Y軸
事件Y軸-=主角Y軸
事件X軸-=主角X軸
IF(事件X軸<=1){
IF(事件X軸>=0){
IF(事件Y軸==0){
開關操作:XXXX 開啟
顯示動畫:玩家受傷
增減體力值:全體,-N
END(以下省略,就只是IF的END連發)
}
IF開關 XXXX 被開啟{
等待:N幀(看你想無敵多久)
開關操作 XXXX 關閉
}
以上只是一個方位的語法,剩下三方位全部打出來文章要爆字了故省略

事件:人類攻擊怪物:

IF 變量[怪物血量] > 0{
IF按鈕C被按下時{
IF 玩家面朝左{
變量操作:主角的X軸=玩家的地圖X軸
變量操作:主角的X軸=玩家的地圖Y軸
變量操作:敵人的X軸=本事件的地圖X軸
變量操作:敵人的X軸=本事件的地圖Y軸

主角Y軸-=事件Y軸
主角X軸-=事件X軸
IF(事件X軸<=1)
{
IF(事件X軸>=0)
{
IF(事件Y軸==0)
{
等待:5幀
變量操作:主角的X軸=玩家的地圖X軸
變量操作:主角的X軸=玩家的地圖Y軸
變量操作:敵人的X軸=本事件的地圖X軸
變量操作:敵人的X軸=本事件的地圖Y軸

主角Y軸-=事件Y軸
主角X軸-=事件X軸
IF(事件X軸<=1)
{
IF(事件X軸>=0)
{
IF(事件Y軸==0)
{
顯示動畫:[怪物](顯示的對象),砍人
變量操作:怪物血量,-=N
等待:45幀

END(以下省略,就只是IF的END連發)
同上只是一個方位的語法,剩下三方位全部打出來文章要爆字了故省略







最後,倘若你對我當初遊戲開發到哪裡有感興趣(我大概只完成遊戲本體的10%吧),你可以點這裡下載,我用我的雲端空間,可能不知道哪天會刪掉它

如有不合理的部分,歡迎在下面流言指正我,但如果有問題,因為最近無心這方面,所以可能也是愛莫能助。

以上,是我去年努力一個半月完成的成果,但一切都付諸流水了......

這是不為誰而做的遊戲,連自己都不是。
引用網址:https://home.gamer.com.tw/TrackBack.php?sn=4085790
All rights reserved. 版權所有,保留一切權利

相關創作

同標籤作品搜尋:日常|RPG Maker|RPG 製作大師 VX|地圖上戰鬥

留言共 0 篇留言

我要留言提醒:您尚未登入,請先登入再留言

喜歡★a8702191234 可決定是否刪除您的留言,請勿發表違反站規文字。

前一篇:[實況](垃圾話多)心跳... 後一篇:Dream Chaser...


face基於日前微軟官方表示 Internet Explorer 不再支援新的網路標準,可能無法使用新的應用程式來呈現網站內容,在瀏覽器支援度及網站安全性的雙重考量下,為了讓巴友們有更好的使用體驗,巴哈姆特即將於 2019年9月2日 停止支援 Internet Explorer 瀏覽器的頁面呈現和功能。
屆時建議您使用下述瀏覽器來瀏覽巴哈姆特:
。Google Chrome(推薦)
。Mozilla Firefox
。Microsoft Edge(Windows10以上的作業系統版本才可使用)

face我們了解您不想看到廣告的心情⋯ 若您願意支持巴哈姆特永續經營,請將 gamer.com.tw 加入廣告阻擋工具的白名單中,謝謝 !【教學】