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


HSPTV!掲示板


未解決 解決 停止 削除要請

2015
0320
SADOUSonkeyとgetkeyどちらを使うほうが現実的??11解決


SADOUS

リンク

2015/3/20(Fri) 15:52:04|NO.67990

アクションやSTG等のゲームを作る際にキーコンフィグを実装しようとしています
情報工学?とか専門知識がゼロなので、内部的な処理には疎く、
同じような動作をさせてみようとしたもののドチラが良いのか。


一番初めに考えたのは
「キー操作を数パターン用意」
単純にgetkeyやstickで矢印キーマウスクリックその他を取得する。
しかし、getkeyやstickを多用するのは現実的ではないと聞いたことがあるし
すべての文字をgetkeyを使って取得するには無理があるので
いくつかのパターンを作ってプレイヤーに選ばせる

if keyconfig=0{ getkey p1... } if keyconfig=1{ getkey p1... }


次がonkeyで、
「onkeyでゲームのキー取得」
をしたことがないので不安が残ります。
こちらの方がカスタマイズ性が高いし、使えるようになるなら理解しておきたい…

... onkey 0 repeat *:keys(*)=0:loop onkey 1 await 16



今回作ろうとしているのは2DSTGで、onkeyを使う必要もなさそうだとは
思っているのですが、一応に意見を聞いておこうかなと思った次第です。



この記事に返信する


SADOUS

リンク

2015/3/20(Fri) 16:02:18|NO.67991

割り込み先は

*keyevent key=wparam repeat * if key=keyconfig(*) : keys(*)=1 loop return
のように考えています。
これについても意見をくだされば幸いです…



cats

リンク

2015/3/20(Fri) 19:23:47|NO.67992

ゲーム内ではgetkeyを使うほうがいいです。
ゲームはループするのでサブルーチンを走らせすぎるのは美しくありません。
あと

if keyconfig=0{ getkey p1... } if keyconfig=1{ getkey p1... }
このコードで何を分岐しているのがイマイチ分からないです。
「ジャンプ=Z, 攻撃=X」と「ジャンプ=A, 攻撃=Z」のような用意されたセットを切り替えているのですか。



暇人

リンク

2015/3/20(Fri) 20:06:29|NO.67993

デフォルトのキーを配列に入れてそれを変更出来る仕組みにすれば良い
inputの数値を他のキーコードに変えれば簡単に変更出来る

dim key_f,11 keyconfig=37,38,39,40,32,13,17,27,1,2,9//stickと同じ配置 keymes="左","上","右","下","スペース","Enter","Ctrl","ESC","左ボタン","右ボタン","TAB" repeat 11 mes keymes(cnt) input keyconfig(cnt),32,20,3 loop color 255 repeat redraw 0 gradf 200,200,200,200,1,$8844,$4422 pos 300,300 keybit=0 //stick互換用変数初期化 repeat 11 getkey key_f(cnt),keyconfig(cnt) if key_f(cnt) { mes keymes(cnt) keybit+=(key_f(cnt)<<cnt) //stick互換のキーデータ } loop pos 208,208 mes keybit redraw 1 await 16 loop



SADOUS

リンク

2015/3/20(Fri) 20:12:14|NO.67994

>catさん
はい
「用意されたセットを切り替えている」で合っています
とすると、下手にonkeyを利用しようとするよりも
いくつかのセットを用意して、ユーザーに選んでもらう方式が妥当なのでしょうか。


それと気になったのですが
>ゲームはループするのでサブルーチンを走らせすぎるのは美しくありません。
というのは、
リアルタイムで情報が流れるゲームにとって不都合な事がある ということですか?
プログラムを共有する上で、プログラマを困らせてしまう危険がある?

いずれにせよ、サークルで作業させていただいているので
catsさんの言うとおりサブルーチンは多様しないように心がけます



SADOUS

リンク

2015/3/20(Fri) 20:20:26|NO.67995

>暇人さん
助かります、いつもサンプルソースをありがとうございます!
配列を使ったキー変更、思いつきませんでした…

このソースを見ていなかったら、onkeyを馬鹿正直に使っていたかもしれない



SADOUS

リンク

2015/3/20(Fri) 20:36:51|NO.67996

このスレの問題は
暇人さんソースでどうにかなりそうなので解決にします

しかしビットシフトが何者なのかいまいちよくわからなくて
暇人さんのstick互換データをどうやって算出しているのかピンと来ないのが心残り。
stickみたいにif文の&で検出できるようにしてるのは凄いなと思いましたが、
ちょっと勉強不足でした。



cats

リンク

2015/3/20(Fri) 20:56:14|NO.67998

解決したようですがNO.67994には答えておきます。
>いくつかのセットを用意して、ユーザーに選んでもらう方式が妥当なのでしょうか。
作るゲームにもよりますが、私はおすすめしません。
各キーについて自由に設定できるのが望ましいでしょう。
>サブルーチンは多様しない
少し語弊がありましたね。gosubなどはコードを見やすくする点でも多様すべきです。
ただ、onkeyはキーの割り込みが発生したら必ずジャンプします。
普通ゲームではループ内でキーチェック用のサブルーチンを、例えば
計算→キーチェック→マップ描画→キャラ描画
のような決まった順番で繰り返し実行します。
onkeyにすると、例えばキャラ描画の後にジャンプするなど、製作者の予期できない場所からジャンプします。
これはエラーが発生したときなどのデバッグや、他のプログラマにフローチャートを書く上でも
厄介なことなのでおすすめしません、ということです。



暇人

リンク

2015/3/20(Fri) 21:11:40|NO.67999

>stick互換データをどうやって算出しているのかピンと来ないのが心残り。
二進数の表記は%0000(変数は4バイトで32ビットなので0が32個)になるんですが
stikcの場合例えば←キーが押された時は%0001となる
↑キーは%0010で右から2番目が1になる
で、getkeyの場合押されたかどうかだけなので1か0が返って来て
1は%0001で左に一つシフト(<<1)すると%0010に出来る
3番目は→キーで%0001<<2すれば%0100に出来るのでcnt分シフトすればそのまま使える

>keyconfig=37,38,39,40,32,13,17,27,1,2,9//stickと同じ配置
でstikcと同じ並び順にしてるのが重要



暇人

リンク

2015/3/20(Fri) 22:17:45|NO.68000

> keybit+=(key_f(cnt)<<cnt) //stick互換のキーデータ
ここは押された時しか実行されないから

keybit+=(1<<cnt)
でも良かったな・・・



SADOUS

リンク

2015/3/21(Sat) 09:23:42|NO.68005

>catsさん
たしかに、これには色々と対策を考えてみたのですがダメでした。
どうしても1フレーム分のラグができたりできなかったり…

>暇人さん
keybit+=(1<<cnt)
stickのキーコードの並びって・・・そうかだから&で検出できるんですね
理屈がなんとなくわかりました



掘木

リンク

2015/3/21(Sat) 18:08:22|NO.68008

・・・何を聞きたいのか分からないが、
性質上onkeyでよくある2DSTGのあの動きは不可能だと思いますよ・・・?
いや、質問者が思い浮かべている2DSTGとこちらの思い浮かべているものがそもそも違う説が濃厚か?
(こちらが素人という説もある)

onkeyは押し始めの検出に長ける一方で押しっぱなしの検出が苦手で、
同時押しの検出に至っては絶望的です。
この問題をクリアできるのであればやってみたらいいと思います。
少なくとも私なんかの能力では、onkeyのみでのキー検出でこれらを解決できませんでした。

逆に、押しっぱなしにした際の自動連打と、押し始めの検出に長ける性質上、
メニューのような操作には非常に強い。
但し、「キーの検出コード」を何種類もあるってのは管理が面倒なため、
結局ゲームではonkeyが使われないケースが多いんじゃないかなあ。


なお、onerrorを除くon系の割り込みは、特定の命令動作中でしか起こりません。
割り込み処理中に割り込みが発生しうる命令を避ければ大抵上手く行きます。
神経質になるべきはむしろoncmdの場合で、
onkeyでそこまで神経質になる必要があるかというとぶっちゃけ怪しいところ。(個人的意見)



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