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


HSPTV!掲示板


未解決 解決 停止 削除要請

2010
0206
ミント複数キーを判断する方法9未解決


ミント

リンク

2010/2/6(Sat) 20:47:43|NO.30454

お久しぶりです。そうでない方は始めまして。

タイトルに悩みましたが、やりたいことがうまくいかないのでお聞きしたいと思ったしだいです。



-------------
 -やりたいこと-
移動したい所を決定して、文字を動かす。
(例えば:1マスだけ動きたい、ユーザーが→を押す、決定ボタンを押して1マスだけ動く)
-------------
 -イメージ-
説明だけだとわかりにくいと思いますので、イメージとしては
「FFタクティクス」や「ファイアーエムブレム」などの
シュミレーションゲームを想像するとわかりやすいかもです。
-----------------------
--------------------------------------------------
 -プログラム-

*最初 ;初期化 qw=0 ;回数 mozi=0 ;表示 ;画面の設定 screen 0,600,500 ;ウインドウ0を600,550の大きさに color 0,0,0:boxf ;画面を黒で塗りつぶす ;キー認識 *キー ;繰り返し始め ;Zが押された場合 getkey zkey,90 ;zkey,Z if zkey:goto *画像 ;*に移動 wait 1 ;待つ goto *キー ;*に戻る *画像 ;画像の透明化 buffer 2 ;隠しスクリーン screen 0,600,500 ;スクリーンの設定 gmode 2 ;黒の透明化 ;以下ループ repeat ;繰り返しの始め redraw 2 ;ココから下は仮想画面に描く ;画面の設定 color 0,0,0:boxf ;画面を黒で塗りつぶす color 255,255,255 ;文字の色を白に font "MS 明朝",30,1 ;フォント"MS 明朝"大きさ,太文字 ;矢印 pos 299,231 ;文字の場所 if mozi>=1:pos 300,231 ;文字の場所 if mozi>=2:pos 300,231 ;文字の場所 if mozi==0:print "→" ;""の中身表示 if mozi==1:print "−→" ;""の中身表示 if mozi>=2:print "−−→";""の中身表示 ;A pos 264,231 ;文字の画像 if zkey:print "A" ;""の中身表示 ;B pos 396,231 ;文字の画像 if zkey:print "B" ;""の中身表示 ;宣言 stick key ;keyに押されたキー番号を入力 ;動いた回数 if key=4:qw=1+qw ;key4が押されたらqwに1を足す if key=4:mozi=qw ;key4が押されたらqwからmoziにデーターを渡す getkey xkey,88 ;zkey,X if xkey:goto *最初 ;*に移動 redraw 1 ;今まで仮想画面に描かれていたものをウインドウ0に描画 wait 1 ;待つ loop ;repeatへ戻る
----------------------------------------------
私としては・・・

> pos 264,231 ;文字の画像
> if zkey:print "A" ;""の中身表示

ここの間に「if (mozi==0)and(zkey):pos 294,231」を入れてみましたが、うまくいかなかったです。
どうやって、複数キーの判断をしたらよいでしょうか?


それではよろしくおねがいします><



この記事に返信する


Ve

リンク

2010/2/6(Sat) 20:58:25|NO.30455

やりたい事だけが先行して、処理内容をあまり考えられてないような感じを受けます。



Ve

リンク

2010/2/6(Sat) 21:28:39|NO.30456


;動いた回数 if key=4:qw=1+qw ;key4が押されたらqwに1を足す if key=4:mozi=qw ;key4が押されたらqwからmoziにデーターを渡す
 ↓

if key=4 : qw=1+qw : mozi=qw

こうすると1つに纏められます。


if xkey:goto *最初 ;*に移動

repeat〜loop内で処理を終えずに飛ばないほうがいいです。
どうしてもリピート内に記述するなら breakで一度終了させてからgotoですかね。

if xkey : break   :   : loop goto *最初


これがゲームならキャラクター(文字)の表示座標を
変数にして参照するようにしたほうが良いです。

場所が固定なら手順と結果をもう少し教えてくれないと、アドバイスが難しいかと…。



しきり2

リンク

2010/2/6(Sat) 21:51:23|NO.30458

説明不測でよく分からんがkouiuことか?





キーで移動、エンターで位置。

#enum left 1 #enum up #enum right #enum down //画面設定 screen 0,640,480 color:boxf font "MS 明朝",30,1 ;フォント"MS 明朝"大きさ,太文字 //キャラの座標設定 AX = 0 AY = 0 BX = 50 BY = 50 v_t = 0 repeat redraw 0 wait 1 //塗りつぶし color:boxf //オブジェクト描画 color 255,255,255 pos AX,AY mes "A" pos BX,BY mes "B" VX = AX VY = AY repeat v if cnt != 0:VX(cnt) = VX(cnt-1):VY(cnt) = VY(cnt-1) if vp(cnt) == left:VX(cnt) -= 30 if vp(cnt) == up:VY(cnt) -= 30 if vp(cnt) == right:VX(cnt) += 30 if vp(cnt) == down:VY(cnt) += 30 loop repeat v if (v-1) == cnt:break if (vp(cnt) == left)||(vp(cnt) == right){ pos VX(cnt),VY(cnt) mes "━" }else{ pos VX(cnt),VY(cnt) mes "|" } loop if v != 0{ pos VX(v-1),VY(v-1) if (vp(v-1) == right):mes "→" if (vp(v-1) == left):mes "←" if (vp(v-1) == up):mes "↑" if (vp(v-1) == down):mes "↓" } //キー取得 stick key if key&1:vp(v) = left:v++ if key&2:vp(v) = up:v++ if key&4:vp(v) = right:v++ if key&8:vp(v) = down:v++ if key&32:AX = VX(v-1):AY = VY(v-1):v = 0 title "x"+AX+"y"+AY redraw 1 loop // /*
・print → mes
・fontをループにはさむのはやめる。
・redraw 2 → redraw 0
・bufferは必要があるか?









createdevice ,D3DDEVTYPE_HAL//デバイスの作成
setaspect ginfo(12)*1000/ginfo(13)//画面の比率の設定

set3d 2,2,65536




Ve

リンク

2010/2/6(Sat) 22:23:52|NO.30459

こういう事なのかよくわからんけど…


/////////// ; 背景 ////////// sdim map map(0)="1111111111111111" map(1)="1000100000000001" map(2)="1000101000000001" map(3)="1000101000000001" map(4)="1101101000000001" map(5)="1000001111111011" map(6)="1000000000010001" map(7)="1111011101110001" map(8)="1000001000010001" map(9)="1000001002010001" map(10)="1000001000010001" map(11)="1000001111110001" map(12)="1000001000000001" map(13)="1000000000000001" map(14)="1000001000000001" map(15)="1111111111111111" buffer 2 color : boxf color 255,255,255 font "MS Pゴシック",16 y=0 repeat 16 l=strmid(map(y),0,strlen(map(y))) repeat 16 c=strmid(l,cnt,1) if c="1" : pos y*20,cnt*20 : mes "回" loop y++ loop /////////// ; 準備 ////////// gsel 0 dim x,2 dim y,2 x(0)=1 : y(0)=1 x(1)=13 : y(1)=13 /////////// ; 開始 ////////// *メイン gosub *描画 stick key,15 gosub *キー入力 if zkey { if key=1 : x(0)-- if key=2 : y(0)-- if key=4 : x(0)++ if key=8 : y(0)++ } await 1 goto *メイン *描画 redraw 0 ;背景 pos 0,0 gcopy 2,0,0,320,320 ;キャラクター pos x(1)*20,y(1)*20 : color 255 : mes "D" pos x(0)*20,y(0)*20 : color 0,255 : mes "@" if key=1 : pos (x(0)*20)-20,(y(0)*20) : mes "←" if key=2 : pos (x(0)*20),(y(0)*20)-20 : mes "↑" if key=4 : pos (x(0)*20)+20,(y(0)*20) : mes "→" if key=8 : pos (x(0)*20),(y(0)*20)+20 : mes "↓" redraw 1 return *キー入力 ;Zキー判定 getkey zkey,90 if zkey=0{ if z_chk=1:z_chk=0 }else{ if z_chk=1:zkey=0 z_chk=1 } return



Ve

リンク

2010/2/6(Sat) 23:07:33|NO.30460

別の移動方法


/////////// ; 背景 ////////// sdim map map(0)="1111111111111111" map(1)="1000100000000001" map(2)="1000101000000001" map(3)="1000101000000001" map(4)="1101101000000001" map(5)="1000001111111011" map(6)="1000000000010001" map(7)="1111011101110001" map(8)="1000001000010001" map(9)="1000001002010001" map(10)="1000001000010001" map(11)="1000001111110001" map(12)="1000001000000001" map(13)="1000000000000001" map(14)="1000001000000001" map(15)="1111111111111111" buffer 2 color : boxf color 255,255,255 font "MS Pゴシック",16 y=0 repeat 16 l=strmid(map(y),0,strlen(map(y))) repeat 16 c=strmid(l,cnt,1) if c="1" : pos y*20,cnt*20 : mes "回" loop y++ loop /////////// ; 準備 ////////// gsel 0 dim x,2 dim y,2 x(0)=1 : y(0)=1 x(1)=13 : y(1)=13 ;移動方向保存 dim cx,4 dim cy,4 dim cd,4 cx(0)=x(0) cy(0)=y(0) cd(0)=-1 ;移動範囲のカウンタ c=1 /////////// ; 開始 ////////// *メイン gosub *描画 gosub *移動範囲 gosub *キー入力 if zkey { ;一番最後の保存先を代入 c-1 x(0)=cx(c) y(0)=cy(c) ;初期化 dim cx,4 dim cy,4 dim cd,4 cx(0)=x(0) cy(0)=y(0) cd(0)=-1 ;移動範囲のカウンタ c=1 } await 1 goto *メイン *描画 redraw 0 ;背景 pos 0,0 gcopy 2,0,0,320,320 ;キャラクター pos x(1)*20,y(1)*20 : color 255 : mes "D" pos x(0)*20,y(0)*20 : color 0,255 : mes "@" ;方向 repeat c pos cx(cnt)*20,cy(cnt)*20 if cd(cnt)=1 : mes "←" if cd(cnt)=2 : mes "↑" if cd(cnt)=4 : mes "→" if cd(cnt)=8 : mes "↓" loop redraw 1 return *移動範囲 stick key if key&15 { if c<4 { if key=1 : cx(c)=cx(c-1)-1 : cy(c)=cy(c-1) : cd(c)=1 if key=2 : cx(c)=cx(c-1) : cy(c)=cy(c-1)-1 : cd(c)=2 if key=4 : cx(c)=cx(c-1)+1 : cy(c)=cy(c-1) : cd(c)=4 if key=8 : cx(c)=cx(c-1) : cy(c)=cy(c-1)+1 : cd(c)=8 c++ } } return *キー入力 ;Zキー判定 getkey zkey,90 if zkey=0{ if z_chk=1:z_chk=0 }else{ if z_chk=1:zkey=0 z_chk=1 } return



ミント

リンク

2010/2/7(Sun) 12:41:54|NO.30467

>>Veさん
>;動いた回数
> if key=4:qw=1+qw ;key4が押されたらqwに1を足す
> if key=4:mozi=qw ;key4が押されたらqwからmoziにデーターを渡す

> ↓
>if key=4 : qw=1+qw : mozi=qw
>こうすると1つに纏められます。
自分としては分解さてた方が見やすいもんで(´・ω・`)
でも、これもいいですね。


>if xkey:goto *最初 ;*に移動
>repeat〜loop内で処理を終えずに飛ばないほうがいいです。
>どうしてもリピート内に記述するなら breakで一度終了させてからgotoですかね。
なるほど。今までこうしてましたので直しときます。


>これがゲームならキャラクター(文字)の表示座標を
>変数にして参照するようにしたほうが良いです。
むむぅ。難しそうだがやってみます。

>場所が固定なら手順と結果をもう少し教えてくれないと、アドバイスが難しいかと…。
言葉足らずで申し訳ない。参考になりそうなものを今度から持ってきます。
アドバイスありがとうございます。



ミント

リンク

2010/2/7(Sun) 12:56:09|NO.30468

>>しきり2さん
>説明不測でよく分からんがkouiuことか?
今度から資料を持ってきたり、説明に工夫しよう・・・


>キーで移動、エンターで位置。
>#enum left 1
 〜以下省略〜

おおー、まさしくこれですね。
しかし今の私では「ぱっと見」で理解できなかったです(´・ω・`)

理解までにお時間をいただきたい。



>・print → mes
これは統一さえしてればよいのでは?っと思ったらmes推定って書いてあった・・・

>・fontをループにはさむのはやめる。
うっかりしてた。気をつけときます><

>・redraw 2 → redraw 0
理解までにお時間をください。

>・bufferは必要があるか?
このプログラムには必要ないと思うけど、
本当の方は画像があるので、ないとウインドウのサイズが変わってしまう・・・


アドバイスとプログラムの方ありがとうございます。



ミント

リンク

2010/2/7(Sun) 13:00:05|NO.30469

>Veさん
まず先に、2度のアドバイスありがとうございます。

>こういう事なのかよくわからんけど…
>///////////
 〜以下省略〜

思っている物に近いです><
参考になりそうなので、このプログラムも理解するまでにお時間をいただきたい・・・



ミント

リンク

2010/2/7(Sun) 13:04:27|NO.30470

>Veさん
3度目のアドバイスと、2つのプログラムありがとうございますペコリ(o_ _)o))

>別の移動方法
>///////////
 〜以下省略〜

おおー、すごいですね〜。
動ける範囲が決められていて、そこまでなら上下右左に動けますね。

このプログラムも理解するまで時間がかかりそうだ・・・



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