[回到版面]
回應模式
名 稱
E-mail
標 題
內 文
附加圖檔[] []
刪除用密碼(刪除文章用。英數字8字元以內)
  • 可附加圖檔類型:GIF, JPG, PNG, JPEG,瀏覽器才能正常附加圖檔
  • 附加圖檔最大上傳資料量為 10000 KB。當回文時E-mail填入sage為不推文功能
  • 當檔案超過寬 125 像素、高 125 像素時會自動縮小尺寸顯示
  • 程式碼可使用 [code][/code] 以 google-code-prettify 標亮 (程式自動判斷語言類別)

  • 公告、舉報、建議請向DB管理室辦理。
  • 本板討論遊戲製作為主,改造方面也可討論,但如果牽涉到版權,請自重。
  • 3D建模請至3D板, 3D遊戲製作(Ex.怎麼用DirectX跑3D?)則可在這討論。
  • 本板為一般向板面,禁止張貼上車圖。

檔名:1460383145479.jpg-(70 KB, 1280x720) [以預覽圖顯示]
70 KB無標題 名稱: 無名氏 [16/04/11(一)21:59 ID:uvOujaLA] No.11932  
想請問萬能的島民

方向鍵的←跟↑同時按住時,按下空白鍵不會有任何反應是正常的嗎

檢查了很多次Code都沒看到問題....
無標題 名稱: 無名氏 [16/04/11(一)22:01 ID:uvOujaLA] No.11933   
補充一下

開發環境是VS,引擎是Unity,語言是C#

方向鍵的←跟↑同時按住時角色會往左上方移動(利用變動座標實現)

按下空白鍵時會攻擊

其他方向都沒問題,就只有←↑會有問題...
無標題 名稱: 無名氏 [16/04/11(一)22:04 ID:uvOujaLA] No.11934 1推  
https://gist.github.com/wannasaynone/5470b7b4278704ed81e1e831c0b4c757

補上相關段落

宣告變數的部分就原諒我不附上了Orz

先感謝幫忙的島民
無名氏: (´・ω)漏了一行attackTimer -= Time.fixedDeltaTime; (uvOujaLA 16/04/11 22:07)
無標題 名稱: 無名氏 [16/04/11(一)22:46 ID:Tl3IWAdc] No.11935   
if攻擊
if移動

執行完攻擊後的移動蓋掉前面的動作(程式)
沒做混接導致
應該是這樣的問題
無標題 名稱: 無名氏 [16/04/11(一)22:48 ID:Tl3IWAdc] No.11936   
補個測試法
令一個變數a
if攻擊{
a = 0;
}
if移動{
a = 1;
}
然後去顯示a的值看看
無標題 名稱: 無名氏 [16/04/12(二)00:30 ID:.ipodUGo] No.11940 1推  
 檔名:1460392202864.png-(392 KB, 599x761) [以預覽圖顯示] 392 KB
>>Tl3IWAdc

先感謝回答,我是uvOujaLA

這個測試法我已經試過了TT,我是用Unity內建的DeBug.Log

但還是找不出問題

其他移動方向(上、下、左、右、右上、右下...等等)都很正常

只有左上這個方向會出問題

現在的情形是只要左和上同時按著,空白鍵的if(Input.GetKeyDown(KeyCode.Space))
打死就是不通過

但其他組合就沒問題Orz

我也試著在移動的各個方向if判斷加入else讓他互斥,結果也沒有用

原本以為可能會是動畫插入Funtion導致,但發現如果只是面向左上方(不按著按鍵)就沒問題

所以我自己試了半天判定是Unity自己的問題

換成if(Input.GetKeyDown(KeyCode.X))果然就沒問題了Orz......

順便分享給大家,Unity現在一直在改版,5.2.1各種不穩,但升版又更抖啊...
無名氏: 你打開editor 去按一下左上跟空白鍵 就知道了 (SxnpLWNE 16/04/12 01:32)
無標題 名稱: 無名氏 [16/04/12(二)01:29 ID:SxnpLWNE] No.11942 1推  
你知道PS2鍵盤有一個大限制嗎
有同時多鍵輸入限制..因為Keyboard Martix架構問題
叫鍵盤的鍵位衝突(Ghost Key)

USB鍵盤有6鍵上限設計 因為8 Byte封包關係

除非你拿電鍵鍵盤有支援N-key roll over 才能不卡鍵
無名氏: ゚Å゚)超級長知識.. (sdgp3Q1o 16/04/18 00:10)
無標題 名稱: 無名氏 [16/04/19(二)00:40 ID:BgRLdiE6] No.11957 1推  
借問一下
如果要設成格鬥遊戲的招式鍵
要怎麼作?
(我只會↑+A是↑&&A)
無名氏: 用狀態機紀錄目前按到哪個階段的按鈕狀態 (C3kcsOGU 16/04/19 00:58)
無標題 名稱: 無名氏 [16/04/19(二)01:01 ID:IrPgco5o] No.11958 8推  
>> BgRLdiE6

分享一下我上一款試作品的做法
基本上概念是抄LF2的XDDD
而且有點土法煉鋼,期待板上大神提供更好的做法

我那時是用int紀錄按鍵順序

第一次按鍵 += 百位數
第二次 += 十位數
第三次 += 個位數

所以第一次按鍵時一定要同一個鍵起手(像LF2必定是D起手)
不然會沒辦法判斷「現在是不是要開始放招了?」這件事情

另外宣告Timer限制指令輸入時間,時間到讓該int = 0,等於輸入失敗

然後Update()去抓
當玩家指令 == 設定好的指令的時候執行Animator.SetTrigger(string name)

他就會放招了XD
無名氏: 你用這邏輯還是能判斷開始放招,沒有首按鍵一定要同一個鍵起手吧? (C3kcsOGU 16/04/19 01:07)
無名氏: 不過int有長度限制,還是學著拿個list或stack存指令吧 (C3kcsOGU 16/04/19 01:10)
無名氏: 每按一個按鍵 >>一次 + Math.floor(a) 嗎 謝謝 又學到了 (j.r.b9gE 16/04/19 18:14)
無名氏: (゚∀゚)<用LIST好像也不錯,下次試試看 (IrPgco5o 16/04/19 21:57)
無名氏: (゚∀゚)<不強制起手的話,會有「攻下下防前攻」這種東西,如果不用「防」讓程式知道玩家要準備放招了 (IrPgco5o 16/04/19 21:58)
無名氏: (゚∀゚)<紀錄按鍵會出問題 (IrPgco5o 16/04/19 21:58)
無名氏: 紀錄按鍵會出問題>>我看不出問題,可能對我來說很容易解決,但對你來說會卡住 (yHm99bwE 16/04/19 22:03)
無名氏: 先確定起手再儲存指令 比你浪費資源把一堆指令都存下來聰明多了 (3kRKVBG. 16/04/20 15:56)
無標題 名稱: 無名氏 [16/04/20(三)16:14 ID:ChHlPyC2] No.11961   
>無名氏: 先確定起手再儲存指令 比你浪費資源把一堆指令都存下來聰明多了 (3kRKVBG. 16/04/20 15:56)
存這種東西不會耗多少資源
除非你對資源斤斤計較到整個專案用組語寫
不然根本不用在這種小地方節省
更別說你固定了第一個指令後還是要把第二個以後的指令都存起來

LF2會統一使用防做為指令開頭,我個人認為是跟動作表現有關
防是一個很「保守」的行為
他對場面影響很小、幾乎不會牽動其他物件的行為
而且又有一段延遲時間,把第二個以後的指令本身的行為無效掉
一個防上跳的招,你實際上會看到角色做出「防→出招」的行動
若是上跳防,則會看到「上移一步→起跳→出招」,相對來說比較不順暢
而且出招瞬間角色有高機率是起跳後的狀態
若該招是個該站穩在地上使用的招式就會造成問題
你是該把角色強迫拉回地表?還是讓他站立在空中出招?
此外還有可能因為上移一步而踩到別人的攻擊

這也是為什麼絕大多數的拷招遊戲都不會把跳放在最後一個以外的位置的原因
無標題 名稱: 無名氏 [16/04/20(三)16:25 ID:nYTxMHnk] No.11962 1推  
>>No.11958
>>不強制起手的話,會有「攻下下防前攻」這種東西,如果不用「防」讓程式知道玩家要準備放招了

也來土砲一個解決這個問題的方法,用你這個概念去解決。

<html>
<head>
<script type="text/javascript" language="javascript">

var MovementStart,ClearMoves;
var Moves = 0;

function MovesDown(event) {
//假設有防跳攻上下左右七顆鍵
var e = event.keyCode; //按鍵

clearTimeout(ClearMoves); //停止招式紀錄

if (Moves > 10) {
Moves = Moves / 10; //招式技路往右遞移並無條件捨去
Moves = Math.floor(Moves);
}

if (e == 38) Moves += 10000; //上,預設最高紀錄五鍵
if (e == 40) Moves += 20000; //下
if (e == 37) Moves += 30000; //左
if (e == 39) Moves += 40000; //右
if (e == 90) Moves += 50000; //Z防
if (e == 88) Moves += 60000; //X跳
if (e == 67) Moves += 70000; //C攻

//防前攻
if ((Moves >= 74500 && Moves <= 74599) || (Moves >= 73500 && Moves <= 73599)) MovementStart = setTimeout("Flying()",500);
//防前跳
if ((Moves >= 64500 && Moves <= 64599) || (Moves >= 63599 && Moves <= 63599)) MovementStart = setTimeout("FlyingKick()",500);
//防上攻
if (Moves >= 71500 && Moves <= 71599) MovementStart = setTimeout("JumpKick()",500);
//防上跳
if (Moves >= 61500 && Moves <= 61599) MovementStart = setTimeout("Bomb()",500);

ClearMoves=setTimeout("ClearMovement()",3000); //開始計時招式紀錄的時限

document.getElementById("MoveMove").innerHTML=Moves;

}

function Flying() {document.getElementById("Movement").innerHTML="飛刀";}
function FlyingKick() {document.getElementById("Movement").innerHTML="飛踢";}
function JumpKick() {document.getElementById("Movement").innerHTML="跳踢";}
function Bomb() {document.getElementById("Movement").innerHTML="爆炸";}
function ClearMovement() {Moves = 0; document.getElementById("MoveMove").innerHTML=Moves;}

</script>
</head>
<body onkeydown="MovesDown(event)">
<div id="Movement">1</div><div id="MoveMove">1</div>
</body>
</html>

無名氏: 用網頁做遊戲不會吐血嗎... (j/yMp85g 16/04/27 13:03)
無標題 名稱: 無名氏 [16/04/20(三)17:32 ID:ChHlPyC2] No.11963 3推  
判斷招式基本上有兩個方向
其中之一是以按鍵為主體
記錄下按過的按鍵順序並拿去跟招式表比對
就像對發票一樣,一個個比對看中了哪個獎
const int keyLogIndexMax=200,orderMax=10;//假設所有指令最長為9個按鈕
int keyLog[keyLogIndexMax],keyLogIndex=orderMax;
const int fireBallOrder[orderMax]={KEY_DEF,KEY_UP,KEY_ATK,KEY_END};//防上攻
const int fireWallOrder[orderMax]={KEY_DEF,KEY_RIGHT,KEY_JUMP,KEY_END};//防前跳
const int meteorStrikeOrder[orderMax]={KEY_ATK,KEY_DOWN,KEY_DOWN,KEY_DEF,KEY_RIGHT,KEY_ATK,KEY_END};//攻下下防前攻

void inputInit()
{
for(int i=0;i<orderMax;i++)
keyLog[i]=0;
}

void inputProcess()
{
//把按鍵記錄起來
if(keyDown(KEY_UP))
keyLog[keyLogIndex++]=KEY_UP;
if(keyDown(KEY_DOWN))
keyLog[keyLogIndex++]=KEY_DOWN;
if(keyDown(KEY_RIGHT)||keyDown(KEY_LEFT))//左跟右都視為前
keyLog[keyLogIndex++]=KEY_RIGHT;
if(keyDown(KEY_DEF))
keyLog[keyLogIndex++]=KEY_DEF;
if(keyDown(KEY_JUMP))
keyLog[keyLogIndex++]=KEY_JUMP;
if(keyDown(KEY_ATK))
keyLog[keyLogIndex++]=KEY_ATK;

//一個個跟招式比對
for(int i=0;;i++)
if(fireBallKey[i]==KEY_END)//全部比完都對就放招並離開
{
action(fireBall);
break;
}
else if(fireBallKey[i]!=keyLog[keyLogIndex-1-i])//其中一個按鍵不對就停止比對
break;
for(int i=0;;i++)
if(fireWallKey[i]==KEY_END)
{
action(fireWall);
break;
}
else if(fireWallKey[i]!=keyLog[keyLogIndex-1-i])
break;
for(int i=0;;i++)
if(meteorStrikeKey[i]==KEY_END)
{
action(meteorStrike);
break;
}
else if(meteorStrikeKey[i]!=keyLog[keyLogIndex-1-i])
break;

//Buffer滿了就清一下,不是重點
if(keyLogIndex>=keyLogIndexMax-6)
{
memmove(keyLog,keyLog+keyLogIndex-orderMax,orderMax*sizeof(int));
keyLogIndex=orderMax;
}
}


另一種是以招式為主體
每個招式有自己的完成度,按對就+1按錯就=0
進度湊滿了就是指令完成
const int fireBallOrder[orderMax]={KEY_DEF,KEY_UP,KEY_ATK,KEY_END};//防上攻
int fireBallOrderIndex=0;
const int fireWallOrder[orderMax]={KEY_DEF,KEY_RIGHT,KEY_JUMP,KEY_END};//防前跳
int fireWallOrderIndex=0;
const int meteorStrikeOrder[orderMax]={KEY_ATK,KEY_DOWN,KEY_DOWN,KEY_DEF,KEY_RIGHT,KEY_ATK,KEY_END};//攻下下防前攻
int meteorStrikeOrderIndex=0;

void inputProcess()
{
//先取得唯一的一個按鍵
int key=0;
if(keyDown(KEY_UP))
key=KEY_UP;
if(keyDown(KEY_DOWN))
key=KEY_DOWN;
if(keyDown(KEY_RIGHT)||keyDown(KEY_LEFT))
key=KEY_RIGHT;
if(keyDown(KEY_DEF))
key=KEY_DEF;
if(keyDown(KEY_JUMP))
key=KEY_JUMP;
if(keyDown(KEY_ATK))
key=KEY_ATK;
if(key==0)//沒按鍵就不更新狀態
return;

//一個個跟招式比對
if(key!=fireBallOrder[fireBallOrderIndex])//不是現在該按的鍵,進度就歸零
fireBallOrderIndex=0;
else//是該按的鍵就進度+1
{
fireBallOrderIndex++;
if(fireBallOrder[fireBallOrderIndex]==KEY_END)//進度達到100%就放招並把進度歸零
{
action(fireBall);
fireBallOrderIndex=0;
}
}
if(key!=fireWallOrder[fireWallOrderIndex])
fireWallOrderIndex=0;
else
{
fireWallOrderIndex++;
if(fireWallOrder[fireWallOrderIndex]==KEY_END)
{
action(fireWall);
fireWallOrderIndex=0;
}
}
if(key!=meteorStrikeOrder[meteorStrikeOrderIndex])
meteorStrikeOrderIndex=0;
else
{
meteorStrikeOrderIndex++;
if(meteorStrikeOrder[meteorStrikeOrderIndex]==KEY_END)
{
action(meteorStrike);
meteorStrikeOrderIndex=0;
}
}

}


不管是那種,在程式上都沒有把指令開頭固定成某個鍵的必要

※以上code沒有編譯測試過,不保證沒Bug,僅供邏輯參考
※實作上的小細節不要太在意,重點是註解提到的程式邏輯本身
提問者: 感謝 (.yaippKs 16/04/20 20:50)
無名氏: (゚д゚≡゚д゚)我都不知道K倒可以直接貼Code (pm8HyJRM 16/04/21 01:07)
路過的小七店員: (〃∀〃)o彡゚最近也在找這種邏輯的程式碼,太感謝了 (i8C8om2s 16/05/07 07:45)
無標題 名稱: baka [16/04/21(四)11:38 ID:VoIm7MN2] No.11964 5推  
 檔名:1461209926515.jpg-(205 KB, 1920x1080) [以預覽圖顯示] 205 KB
>>No.11961
現在叫我寫
我也會用list裝起指再check招式表
主要是比較好追回記錄
因為我以前玩capcom vs marvel hero(非圖中遊戲)
trainning mode也有這種圖中顯示入力表的功能
所以我會先入為主用list
baka: |д゚)<阿?在討論LF2類型嗎....抱歉我好像扯遠了....... (VoIm7MN2 16/04/21 11:41)
無名氏: 請問一下list是什麼? google的是array (xa.VndvI 16/04/21 12:26)
無名氏: LF2跟格鬥遊戲概念上差不了多少啦 (msnpkckU 16/04/21 12:37)
無名氏: 用簡單的說法,list算是可動態增減的array (eDXX/CTs 16/04/21 17:00)
無名氏: (*´д`)謝謝樓上講解 能插入拔出的感覺真好 (r8dquGsM 16/04/21 21:38)

【刪除文章】[]
刪除用密碼:
第一頁[0] 最後一頁