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


HSPTV!掲示板


未解決 解決 停止 削除要請

2014
0221
stickとgetkeyの使い分けについて13解決


リンク

2014/2/21(Fri) 09:18:24|NO.60163

HSPを触り始めた初心者です。宜しくお願いします。

現在stick命令を利用してゲームを作っているのですが、ヘルプを見たところ、取得できるボタンの数が少なく困っています。
1024 : TABキー までではなく、2048、4096…と増やしていくことは可能でしょうか?
(調べてみたところ、CK JOYFORCE DLLなるプラグインが見つかったのですが、可能であれば他のプラグインに頼らずHSP内で完結させたいです)
getkeyなら対応キー数は多いのですが、同時に複数入力されたキー情報を取得できない為一長一短のようで、
ゲーム制作においてはどちらの命令を使うのが一般的なのでしょうか?



この記事に返信する


リンク

2014/2/21(Fri) 10:41:06|NO.60164

getkeyを複数使うと、同時入力を検出することも可能です。


repeat getkey Shift,16 getkey Enter,13 if Shift=1&Enter=1:title "ShiftとEnterを同時に押しました。":else:title "" await loop



新入り

リンク

2014/2/21(Fri) 16:51:28|NO.60167

どういうゲームを作るかによりますよね。
例えばタイピングゲームなんかだと少なくともA〜Zまでのキーは全て使いますよね。
ですがタイピングゲームはキー押下の同時検出をする必要はありません。
最低でも人間のタイピングより速く検出出来ればいいわけです。


onkey gosub *inkey stop *inkey repeat 26 if(iparam = 65+cnt){ pos posx,posy : mes strf("%c",65+cnt) if(posx+ginfo(14)<ginfo_winx){ posx+=ginfo(14) }else{ posx=0 posy+=ginfo(15) } } loop return

それ以外で、例えばシューティングゲームなんかは同時検出が必要ですね。
私が今制作しているゲームは、シューティングゲームですがWASDでの移動方式を使っています(といってもHSPでの制作ではないのですが・・・)。
この場合はstick命令では検出が不可能ですので、getkey命令で複数のキー情報を取得するしかありません。


#const speed 5 #const size 10 repeat getkey A,65 getkey W,87 getkey D,68 getkey S,83 x+=(A*(-speed))+(D*(speed)) y+=(W*(-speed))+(S*(speed)) x=limit(x,size,ginfo_winx-size) y=limit(y,size,ginfo_winy-size) color 255,255,255 : boxf color : boxf x-size,y-size,x+size,y+size redraw 1 : redraw 0 : await 10 loop

しかし、基本的にタイピングゲーム以外で10個以上のキーを使うものは少ないです。
MMOオンラインRPGなどは使うかもしれませんが、個人制作のレベルであまりにキーが多いのは、プレイアビリティの面からみても避けるべきでしょう。
stick命令の方が書く量自体は少なく済むので、stickで済ませられるならstickで、無理ならgetkeyを使うだけで良いと思いますよ。



リンク

2014/2/21(Fri) 17:51:18|NO.60168

空さん、新入りさん、回答と解りやすいサンプルありがとうございます。

>空さん
if文やswitch文を利用すれば3つ以上の複数入力の検出も可能なんですね。
早速試してみようと思います。

>新入りさん
今製作中のゲームは横スクロールのアクションゲームです。
stick命令では少し数が足りないので、手間は増えてしまうようですが、今回はgetkey命令で挑戦してみようと思います。



テンクス

リンク

2014/2/21(Fri) 20:03:41|NO.60170

ゲットキーでスティックと同じ使い方ができるやつ


#deffunc getstick var howkey,int coad
getkey howkey,coad
if howkey=0:keycon(coad)=0
if howkey=1{
if keycon(coad)=1:howkey=0
keycon(coad)=1
}
return


これをつかいましょう。
keyconはdimで2まで配列変数を作ってください。
dim keycon,2
みたいに。
スクリプトエディタの下に貼ってください。
ゲットキーと使い方は一緒で、getkeyをgetstick の文字に変えれば使えます。
キーの押しっぱなしがきかないようになっています。
変数の名前が被らないように気を付けて。



ZAP

リンク

2014/2/21(Fri) 22:01:16|NO.60175

ハードウェアの仕様上、キーボードの種類によっては、
3種類以上のキーの同時入力を受け付けないのもあります。
従って、どんな環境でも対等な条件で遊んでもらうためには、
ゲームデザイン側で工夫が必要です。

3つ以上のキーを同時入力しないといけない局面があるゲームならば
ジョイパッド必須になってしまう可能性が高いかも。

「nキーロールオーバー」で調べてみてください。



リンク

2014/2/22(Sat) 17:57:21|NO.60195

>テンクスさん
回答ありがとうございます。
HSPに不慣れなせいで教えて頂いたコードが上手く扱えませんでした。申し訳ないです。
#deffunc命令というのがまだよく解ってないです。

>ZAPさん
回答ありがとうございます。
「nキーロールオーバー」で検索してみたところ、
http://hsp.tv/play/pforum.php?mode=pastwch&num=52577
こういった記事も見つかりました。
作っているのはアクションゲームなので、どうしても3つ以上のキーを同時入力する状況は出てくると思いますが、とりあえずはキーボードである程度動かせるところまで作って、余裕ができたらジョイパッドでも…と考えています。
joyGetPosEx命令というのも今知ったので、試しにヘルプに載っていたサンプルをコピーしてみたのですがエラーが出てしまったりとまだ解らないところが多いです。



(’’

リンク

2014/2/22(Sat) 19:23:20|NO.60197

端的に言います
・ジョイパッド対応とかはゲームが完成し始めてから考えるほうが良いです。
・キーの同時入力も同じです。
・stickは内部でgetkeyを繰り返してるようなものなので、stickの面倒な仕様を使う必要はないです

どうしてもgetkeyが面倒なら自動化もできますが、素直にgetkeyを使うのが数倍便利です。(初心者さんならなおさら)



ZAP

リンク

2014/2/23(Sun) 01:22:24|NO.60206

制作者さんがイメージしているものによると思いますが、作りたいものが
シビアなキー入力(例えば格闘ゲームの技コマンドのようなもの)を必要とする
アクションゲームや、ドット単位での避けが必要なシューティングなどであれば
最初から「パッド使用を前提とした」ゲームデザインもあり得ると思います。

もしそういうゲームを指向しているのであれば、そのようなゲームにおいては
インターフェイスはゲームの命、根幹になりますから、後付けよりも
最初にそこをガッチリ固めてから進めたほうがいいのではないでしょうか?

もちろん、作者さんが最後には決めることですが。



GENKI

リンク

2014/2/23(Sun) 03:19:03|NO.60207

使えるようになってくると分かるんですが、stickもgetkeyも実装作業にはあんまり影響しません。
後からでも変更はそう難しくはありません。

取り敢えずゲーム本編が動くものが出来てから(この方がモチベーションが維持しやすい)、キーボードを使うかゲームパッドを使うか選んでもいいと思います。
あ、でもstick命令使ってるならjstick命令に乗り換えてしまったほうが悩む必要なくていいかも。

#include "mod_joystick.as" *main redraw 1 : await 16 : redraw 0 : color 255, 255, 255 : boxf : color : pos 0,0 stick key, 2047 ;キーボード mes "key = " + key jstick jkey, 0 ;ジョイスティック(0) mes "jkey = " + jkey ; キーボードとジョイスティックの入力を混ぜる ;こうすればジョイスティックがないお家でも遊べます。後半キー足りないけど。 key = key | jkey ; 書き方色々 if key&1 : mes "←" if key&2 : mes "↑" if key&4 : mes "→" if key&8 : mes "↓" if key&16 : mes "ボタン1" if key&32 : mes "ボタン2" if key&64 : mes "ボタン3" if key&128 : mes "ボタン4" if key&0x100 : mes "ボタン5" if key&0x200 : mes "ボタン6" if key&0x400 : mes "ボタン7" if key&0x800 : mes "ボタン8" if key&1<<12 : mes "ボタン9" if key&1<<13 : mes "ボタン10" if key&1<<14 : mes "ボタン11" if key&1<<15 : mes "ボタン12" ; 同時押しを検出 if ((key&32)! 0) & ((key& 64)! 0) : mes "ボタン2と3" if ((key&64)=64) & ((key&128)=128) : mes "ボタン3と4" goto *main



GENKI

リンク

2014/2/23(Sun) 03:49:05|NO.60208

#deffuncはモジュールを自作するときに使用します。普段は使う必要ありません。
テンクスさんのサンプルはこのようにして使ってください。

#module  ココにテンクスさん(NO.60170)のサンプルをコピペ。 #global ここから下に普通にプログラムを書いてください。 getstickという命令が使えるようになっています。


> joyGetPosEx命令というのも今知ったので、試しにヘルプに載っていたサンプルをコピーしてみたのですがエラーが出てしまったりとまだ解らないところが多いです。

ヘルプの下に「備考 mod_joystick.asをインクルードすること。」とありますよね。
こういう記述がある命令はこのようにして使います。

#include "mod_joystick.as" ここから下にサンプルをコピペ


さて、getkey命令を取り入れた実装を思いついてしまったので書いておきます。
こういうのはビット演算になれると簡単です。

#include "mod_joystick.as" *main redraw 1 : await 16 : redraw 0 : color 255, 255, 255 : boxf : color : pos 0,0 ;キーボード ;nキーロールオーバーの問題あるけど取り敢えずこれでボタンは足りる。 key = 0 : k = 0 getkey k, 37 : key |= k ;← getkey k, 38 : key |= k<<1 ;↑ getkey k, 39 : key |= k<<2 ;→ getkey k, 40 : key |= k<<3 ;↓ getkey k, 'Q' : key |= k<<4 getkey k, 'W' : key |= k<<5 getkey k, 'E' : key |= k<<6 getkey k, 'R' : key |= k<<7 getkey k, 'A' : key |= k<<8 getkey k, 'S' : key |= k<<9 getkey k, 'D' : key |= k<<10 getkey k, 'F' : key |= k<<11 getkey k, 'Z' : key |= k<<12 getkey k, 'X' : key |= k<<13 getkey k, 'C' : key |= k<<14 getkey k, 'V' : key |= k<<15 mes "key = " + key ;ジョイスティック(0) ;ポート番号はプレイヤーが変えられるようにしとかないと困ることがあります。 jstick jkey, 0 mes "jkey = " + jkey ; キーボードとジョイスティックの入力を混ぜる ;こうすればジョイスティックがないお家でも遊べます。 key = key | jkey mes "押されたキー:" + key ; 書き方色々 if key&1 : mes "←" if key&2 : mes "↑" if key&4 : mes "→" if key&8 : mes "↓" if key&16 : mes "ボタン1" if key&32 : mes "ボタン2" if key&64 : mes "ボタン3" if key&128 : mes "ボタン4" if key&0x100 : mes "ボタン5" if key&0x200 : mes "ボタン6" if key&0x400 : mes "ボタン7" if key&0x800 : mes "ボタン8" if key&1<<12 : mes "ボタン9" if key&1<<13 : mes "ボタン10" if key&1<<14 : mes "ボタン11" if key&1<<15 : mes "ボタン12" ; 同時押しを検出 if ((key&32)! 0) & ((key& 64)! 0) : mes "ボタン2と3" if ((key&64)=64) & ((key&128)=128) : mes "ボタン3と4" goto *main

ところでこんな資料もありますが…小難しいのでいろいろ慣れた頃にでもどうぞ。
http://hspwiki.hinekure.net/%E5%B0%8F%E3%83%AF%E3%82%B6%EF%BC%8F%E3%82%B8%E3%83%A7%E3%82%A4%E3%82%B9%E3%83%86%E3%82%A3%E3%83%83%E3%82%AF.html



(’’

リンク

2014/2/23(Sun) 08:44:36|NO.60210

自分はgetkeyをこう使っています

getkey key,'z' : if(key){jumpkey++}else{jumpkey=0} //zキーが押されている場合、jumpkey変数は1ずつ増える //押されてない場合jumpkeyは0になる
こうすれば、"if(jumpkey==1)"とするだけでキーを押した瞬間の1フレームのみ反応できます。
また"if(jumpkey==1 || jumpkey>20)"で文字入力のキーのような感じ(ある程度長押しすると連続で反応する)にも出来ます

>>侍さん
#deffuncとはmes、colorのような物を作る時に使います
#deffunc 命令 str x
mes x return
とすれば命令はmesと同じ感じになります(mesは数値、変数を直接指定できるけどこれはできない)

他人の長いコードを使うのはあまりお勧めできません。(個人的な意見です)
自分はライブラリのようなしっかりしたヘルプが無い限り他人のコードは使いません。



テンクス

リンク

2014/2/23(Sun) 12:49:38|NO.60220

GENKIさん、使い方の説明ありがとうございます。



リンク

2014/2/23(Sun) 19:47:40|NO.60236

>(’’さん
アドバイスありがとうございます。
とにかく簡単な内容でいいので、一応完成と言えるところまで辿り着きたいです。
#deffuncの解説もありがとうございます。

>ZAPさん
アドバイスありがとうございます。
マリオ風の(とは言っても凝った仕掛け等はなく、ひたすら左のスタートから右のゴールに進むだけの)ジャンプアクションを作ろうとしています。
プログラミング言語というものに触れる事自体が初めてで、何をするにもまず何を覚えたらいいのかが解っていない状態なので、手探りで色々な解説サイトに目を通している段階です。
上手く言えないのですが、ちゃんとした返信にならなくてすみません。

>GENKIさん
丁寧なサンプルと解説ありがとうございます。
絵や音楽のような素材と違い、プログラミングは完成のゴールが凄く遠くて、すぐ素材作りに逃げたくなります。
仰る通りモチベーションの維持は重要ですね。

テンクスさんのサンプル使用方法とmod_joystick.asのご指摘ありがとうございます。
また1つ勉強になりました。



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