前往
大廳
主題

【 RPG Maker MV】 記憶翻牌遊戲2

蜜糖情人 | 2023-01-15 01:18:10 | 巴幣 0 | 人氣 215

繼續處裡
心好累,每天都在生氣
奈何生氣的對象永遠不知道為何我在生氣




2.第一次選取

卡組已經安排好了
接著就是翻牌
分成兩個部分
1.判定滑鼠選取的卡牌,並判定是否可以翻
2.將該卡牌從卡背變成卡面

第一階段的選取,用拼圖遊戲2一樣的方式判定
判斷滑鼠位置是否在圖片範圍內
圖片座標X <= 滑鼠座標X <= 圖片座標X+圖片寬度
TouchInput.x >= $gameScreen.picture(i)._x && TouchInput.x <= $gameScreen.picture(i)._x + $gameVariables.value(7)*$gameVariables.value(20)/100
圖片寬度的部分,因為版面排列的關係
卡片會有縮放問題,換算會很麻煩
所以我是用卡牌原始大小寬(變數7)乘上縮放比例(變數20)
但因為系統是%數,所以要除100才會正確
Y座標同理

如此我們可以知道我們選取到哪個位置
先把該位置存到暫存(變數15)
$gameVariables.setValue(15, i);

但因為如果已經翻到正面的卡牌是不能被選取的
所以我們要判斷該位置開關是否是關的
若開關(讀取變數15的值+10)不為開啟狀態
if(!$gameSwitches.value(($gameVariables.value(15)+10)))
+10是因為開關11開始才是位置驗證

如果是關的,將將該位置寫入選取1(變數10)
並且把該位置驗證開關它打開
$gameVariables.setValue(10, i);
$gameSwitches.setValue($gameVariables.value(10)+10,true);
如果是開的,選取1就不會被寫入位置

完整語法(綠色註解)
for (var i=$gameVariables.value(1)*$gameVariables.value(2);i>=1;i--){
//如果滑鼠座標在圖片i範圍內
if (TouchInput.x >= $gameScreen.picture(i)._x && TouchInput.x <= $gameScreen.picture(i)._x + $gameVariables.value(7)*$gameVariables.value(20)/100 && TouchInput.y >= $gameScreen.picture(i)._y && TouchInput.y <= $gameScreen.picture(i)._y +$gameVariables.value(8)*$gameVariables.value(20)/100){
//將i寫入暫存15
$gameVariables.setValue(15, i);
//如果開關i是關閉的
if(!$gameSwitches.value(($gameVariables.value(15)+10))){
//把i寫入選取1
$gameVariables.setValue(10, i);
//將開關i開啟
$gameSwitches.setValue($gameVariables.value(10)+10,true);
}}}

第二階段是把卡背翻成卡面
先前說過每個位置分配的卡牌編號存在變數21~40
因此我先將暫存12(變數12)寫入我們選取1位置的卡牌編號
$gameVariables.setValue(12, $gameVariables.value($gameVariables.value(10)+20));

而暫存13、14則是我拿來存位置座標的
這邊會面臨一個問題,之前用迴圈判斷位置時
橫i跟直j都是從1開始往上算到設定值
但這次我們是要把指定變數轉換回i跟j的數值
最基本的想法是直接用除跟餘數
以牌組3X2,位置5來舉例,橫i=2、直j=2

橫i的部分我用餘數,也就是i=5%3=2
1跟4餘數也會是1
可是!如果是位置3或6,餘數就會是0
所以我這邊做一個判定
如果選取1(變數10)的除牌組橫片(變數1)餘數為0
暫存13(變數13)寫入牌組橫片數-1
if($gameVariables.value(10)%$gameVariables.value(1) == 0){$gameVariables.setValue(13, $gameVariables.value(1)-1);}
假如上述不成立,也就是餘數不等於0的話
暫存13就寫入餘數-1
else{$gameVariables.setValue(13, $gameVariables.value(10)%$gameVariables.value(1)-1);};
這邊-1的原因是,因為暫存13是我之後要做卡牌間距的
之前說過因為第一張是貼著左邊界,所以沒有間距,會-1
我就直接減在這邊

直j的部分我用除,也就是5/3=1
可是碰到3的倍數會提早進位
所以這邊我把選取1(變數10)的值-1除牌組橫數,寫入暫存14(變數14)
$gameVariables.setValue(14, ($gameVariables.value(10)-1)/$gameVariables.value(1));
如此位置3就會是(3-1)/3=0
位置4就會是(4-1)/3=1 就沒問題了
而且這次不用預先-1,因為從0開始

這樣暫存13、14分別就是我們選取的位置座標
就可以直接帶入圖片顯示座標中
而圖片ID是選取1(變數10),圖片檔名編號則是暫存12

完整語法(綠色註解)
//選取1位置的卡牌編號寫入暫存12
$gameVariables.setValue(12, $gameVariables.value($gameVariables.value(10)+20));
//判斷選取1位置是否為牌組橫片數的倍數
//如果是則暫存13為卡牌橫片數-1
//如果不是則暫存13為餘數-1
if($gameVariables.value(10)%$gameVariables.value(1) == 0){$gameVariables.setValue(13, $gameVariables.value(1)-1);}else{$gameVariables.setValue(13, $gameVariables.value(10)%$gameVariables.value(1)-1);};
//暫存14寫入選取1位置-1再除卡牌橫片數
$gameVariables.setValue(14, ($gameVariables.value(10)-1)/$gameVariables.value(1));
//顯示圖片
$gameScreen.showPicture($gameVariables.value(10), $gameVariables.value(19)+$gameVariables.value(12), 0, $gameVariables.value(4)+$gameVariables.value(13)*$gameVariables.value(5), $gameVariables.value(3)+$gameVariables.value(14)*$gameVariables.value(6), $gameVariables.value(20), $gameVariables.value(20), 225, 0);

將上述內容通通以"滑鼠左鍵點一下"來觸發
最後來判斷選取1(變數10)是否為0
如果是,就讓遊戲進度(變數9)進入下一階段
為了怕連點造成錯誤,我添加10偵暫停



3.第二次選取

跟第一次選取一模一樣
把上面語法中的變數10全部替換成變數11就是了



4.判定

判定2次選取的卡牌編號是否一樣
是否配對成功?>(否)翻回卡背
       >(是)是否全卡牌配對完成?
           (是)>遊戲進度進入下階段
           (否)>回到翻牌階段    

先將選取1、2的位置的卡牌編號存入暫存13、14
假如暫存13不等於暫存14
則把選取1、2的位置開關關閉
並且把變數10~15歸0
最後讓遊戲進度回到翻回卡背的部分(變數9=1)

假如暫存13等於暫存14
先將驗證(變數16)+1,再判定驗證是否等於卡牌數
$gameVariables.value(16)==$gameVariables.value(1)*$gameVariables.value(2)/2
如果是,遊戲進度就再往下一階段
如果不是,也就是還沒翻完
則把暫存清空,並回歸進度1



5.遊戲結束

這邊就看結尾要怎麼做
基本上最後最後把開關、變數、圖片全淨空
就能重新開始遊戲


目前卡組有兩個限制
1.只能作完整四邊形的,也就是雙數組
2.只能做到10組20張
2的限制如果修改變數序列是可以擴充的
1的話就要大幅增加判斷了
老樣子附上 遊戲檔

創作回應

相關創作

更多創作