HSPポータル
サイトマップ お問い合わせ


HSPTV!掲示板


未解決 解決 停止 削除要請

2015
0829
pumpkinキー長押しで溜め攻撃4解決


pumpkin

リンク

2015/8/29(Sat) 06:49:15|NO.71104

要するに○○キーを2秒押せば□□、3秒押せば△△…という風に
アクションゲームなどで使われる溜め攻撃を作りたいです。

まだ命令の知識が少ない自分には難しくて… (;一_一)
getkeyじゃ出来そうになかったので。



この記事に返信する


あり

リンク

2015/8/29(Sat) 09:27:08|NO.71105

基本的な考え方は、キーを押している時間(フレーム数)を変数に保存しておき
その数値によって処理を振り分けます。
下のスクリプトでは変数chg1とchg2にキーを押した時間(処理上2ずつ増加)を保存しています。

*main getkey key1, 32 ; スペースキー入力受付 if key1 = 1 { chg1 = limit(chg1 + 2, 0, 255) ; ボタンを押しているフレーム数を保存 ; ↓ボタンを押したフレーム数によって処理を切り替え if chg1 >= 128 : cr1 = 0 : cg1 = 200 : cb1 = 0 if chg1 >= 255 : cr1 = 255 : cg1 = 0 : cb1 = 0 } else { chg1 = 0 : cr1 = 0 : cg1 = 0 : cb1 =255 ; ボタンを押してなければリセット } getkey key2, 13 ; エンターキー入力受付 if key2 = 1 { chg2 = limit(chg2 + 2, 0, 255) ; ボタンを押しているフレーム数を保存 } else : chg2 = limit(chg2 - 10, 0, 255) ; ボタンを押してなければフレーム数減少 redraw 0 color 200, 255, 255 : boxf ; 画面クリア color cr1, cg1, cb1 : boxf 0, 0, chg1 , 20 ; ゲージ表示 pos chg1, 0 : mes "" + chg1 color chg2, 0, 255 - chg2 : boxf 0, 40, chg2 , 60 ; ゲージ表示 pos chg2, 40 : mes "" + chg2 redraw 1 await 16 goto *main



KOMARI

リンク

2015/8/29(Sat) 12:00:29|NO.71107

単純なのでよければこんな感じで(・ω・)


#uselib "winmm.dll" #cfunc timeGetTime "timeGetTime" #const WM_KEYDOWN 0x0100 #const WM_KEYUP 0x0101 #const KEYCODE_ATTACK 'Z' #const TIME_CHARGEATTACK1 2*1000 //ため攻撃1に必要とする時間 #const TIME_CHARGEATTACK2 3*1000 //同上(攻撃2) dim keychargetime //ため攻撃のための時間をいれる oncmd gosub *l_keydn,WM_KEYDOWN oncmd gosub *l_keyup,WM_KEYUP //めいんるーぷ repeat wait 1 loop stop *l_keydn if ( wparam == KEYCODE_ATTACK ) { if ( lparam >> 30 ) : return //押し始めの時間だけとる keychargetime = timeGetTime() } return *l_keyup if ( wparam == KEYCODE_ATTACK ) { if ( keychargetime + TIME_CHARGEATTACK2 < timeGetTime() ) { mes "ためこうげき2" }else : if ( keychargetime + TIME_CHARGEATTACK1 < timeGetTime() ) { mes "ためこうげき1" }else{ mes "つうじょうこうげき?" } } return

とりあえずZキーを攻撃ボタンに割り当てましたが、適当に(getkeyのキーコード表を見て)キーを変えても動くと思います。
ところで、長押ししなかった場合はどうなるか分からなかったので、"つうじょうこうげき?"と書いておきました(・ω・;)



pumpkin

リンク

2015/8/30(Sun) 10:37:00|NO.71124

使いなれてない命令がたくさん…
完全に理解することは難しかったので、とりあえず頂いたサンプル見ながら自分なりにもやってみました。


*メイン getkey key,32 if key=1 { time = time+10 } if key=0:goto*判定 wait 1 goto *メイン *判定 if time >= 1 & time <= 200: mes "通常攻撃" // time が 1〜500 の時、通常攻撃 if time >= 201 & time <= 401 : mes "溜め段階1" // time が 501〜1000 の時、通常攻撃 if time >= 401 : mes "溜め段階2" // time が 1001以上 の時、通常攻撃 wait 1 time = 0 goto *メイン

簡単な命令ばかり使ってるので、簡単な仕組みになったので見れば理解できると思いますが…
要するにありさんの作ったものをそのままシンプルにした感じです。
一応これを応用してできると思いますが、問題点があったら言ってください。

ありがとうございました



ZAP

リンク

2015/8/30(Sun) 14:08:44|NO.71128

実際のゲームに組み込むにあたっては、ループの中のwaitの値を考慮する必要があります。
ゲーム内ではこの処理だけではなく、自分の移動や、ボタン制御、敵の移動、当たり判定、
そして画面の書き換えなどの諸々の処理も入ってくるわけですから。

通常、なめらかに動いている家庭用ゲームでも秒間60フレーム
(1フレーム辺りの所要時間 16.666ミリ秒)です。
今のプログラムだと、1フレーム辺り10ミリ秒しか待っていませんから、
1秒間に100回、メインループが廻ることになる計算ですが、
ゲーム内の処理がその時間内に間に合わなければ、単純に処理落ちしてしまいます。

それとwait命令はタイマーの精度が低いので、
アクションゲームであればawaitを使うことを推奨します。

ウェイトの値はゲーム全体のスピードを決定づける要素なので、早い段階で
決めてから作成しないと、後になって変更しようとするとキャラクターの移動速度を
全部見直さなければならず、修正がたいへんです。



ONION software Copyright 1997-2021(c) All rights reserved.