|
|
|
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」を入れてみましたが、うまくいかなかったです。
どうやって、複数キーの判断をしたらよいでしょうか?
それではよろしくおねがいします><
| |
|
2010/2/6(Sat) 20:58:25|NO.30455
やりたい事だけが先行して、処理内容をあまり考えられてないような感じを受けます。
|
|
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 *最初
これがゲームならキャラクター(文字)の表示座標を
変数にして参照するようにしたほうが良いです。
場所が固定なら手順と結果をもう少し教えてくれないと、アドバイスが難しいかと…。
|
|
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
| |
|
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
| |
|
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))
>別の移動方法
>///////////
〜以下省略〜
おおー、すごいですね〜。
動ける範囲が決められていて、そこまでなら上下右左に動けますね。
このプログラムも理解するまで時間がかかりそうだ・・・
|
|