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


HSPTV!掲示板


未解決 解決 停止 削除要請

2014
0719
linuxuserシューティングの弾を複数出す11解決


linuxuser

リンク

2014/7/19(Sat) 09:36:49|NO.62944

初心者でございます。
シューティングで弾を出す処理をしたいのですが、何故か1発しか弾が出ません。

screen 0,450,450
celload "自機.png",1
celload "弾.png",2
celdiv 2,16,16
//配列の作成
dim bullet,20
dim bx,20
dim by,20
x=190
y=390
gmode 2
//メインループ
*main
redraw 0
color:boxf
pos x,y
celput 1
//弾の描画
repeat 20
if bullet(cnt)=1{
pos bx,by
celput 2
}
loop
gosub*move
gosub*wall
gosub*b_check2
gosub*b_check3
redraw 1
await 10
goto*main

*move
//自機の移動
stick key,15
if(key=1):x-=10
if(key=2):y-=10
if(key=4):x+=10
if(key=8):y+=10
if(key=16):goto*b_check
return
*wall
//端まで行ったら止める
if(x<0):x=0
if(y<0):y=0
if(x>390):x=390
if(y>390):y=390
return
*b_check
//空いている弾の配列チェック
repeat 20
if bullet(cnt)=0{
bullet(cnt)=1
bx(cnt)=x+20
by(cnt)=y
break
}
loop
goto*main
*b_check2
//画面にある弾を動かす
repeat 20
if bullet(cnt)=1{
by(cnt)-=15
}
loop
return
*b_check3
//画面外の弾は元に戻す
repeat 20
if bullet(cnt)=1{
if by>510:bullet(cnt)=0
}
loop
return

間違いがあったらどんどんお願いします!
if文の使い方は気にしないでねw



この記事に返信する


リンク

2014/7/19(Sat) 10:27:39|NO.62947


//弾の描画 repeat 20 if bullet(cnt)=1{ pos bx,by celput 2 } loop
せっかく弾の座標を20個別々に取っているのに
pos bx,byではすべての弾の座標を
pos bx(0),pos by(0)としてしまっているのと同じです。



linuxuser

リンク

2014/7/19(Sat) 10:30:08|NO.62948

あ、ほんとだw

些細なミスでしたね
ありがとうございます!
ほんとありがとうございます!



linuxuser

リンク

2014/7/19(Sat) 10:48:57|NO.62949

すいません

それでやってみたのですが、弾が20発しか出ないんです、、、


//画面外の弾は元に戻す repeat 20 if bullet(cnt)=1{ if by>510:bullet(cnt)=0 } loop return

多分ここが問題なんですが...
いかんせん私の洞察力では分かりません
お願いします



ZAP

リンク

2014/7/19(Sat) 11:00:22|NO.62950

repeatの回数が20回で、20発分しかチェックしていないのだから
20発しか処理されませんよね。

さらにいえば

dim bullet,20
ご自身で最初から「最大数20発ぶん」で配列を確保してると思うのですが・・・



linuxuser

リンク

2014/7/19(Sat) 11:05:42|NO.62951

うーむ
もうちょっと勉強してみます...



リンク

2014/7/19(Sat) 11:38:06|NO.62953

多分20発撃った後弾が出なくなるとかそういう事だと推察しますが、
これも先ほどと似た理由ですね。

by>510と書くと、by(0)>510と同じ…以下略。



たんす

リンク

2014/7/19(Sat) 11:40:28|NO.62954

こうですかね?

*b_check3 //画面外の弾は元に戻す repeat 20 if bullet(cnt)=1{ ; if by>510:bullet(cnt)=0 if by(cnt)<-10:bullet(cnt)=0 ;配列でチェック。画面上にしか移動しない弾ならy座標マイナスで範囲外に。 } loop return



リンク

2014/7/19(Sat) 11:42:27|NO.62955

すいません、追記です。
さらに弾のy座標は時機の座標から上に飛んでいくので小さくなりますよね。
510より大きくなるという条件には絶対当てはまらないと思います。



linuxuser

リンク

2014/7/19(Sat) 11:50:04|NO.62956

もうほんと、、、
皆さんありがとうございます!



たんす

リンク

2014/7/19(Sat) 12:06:03|NO.62957

修正済みかもしれませんが、
弾を撃つ(スペースキーを押す)とgosub中にgotoで移動し、また*mainにgoto移動しています。
サブルーチンが増え続けてますね。

テストに使ったスクリプトを張っておきます。
screen 0,450,450
;celload "自機.png",1 //画像が無いのでコメントアウト ;celload "弾.png",2 ;celdiv 2,16,16 //配列の作成 dim bullet,20 dim bx,20 dim by,20 x=190 y=390 gmode 2 *main //メインループ redraw 0 color:boxf color 255,255,255 //文字で表示するために文字色を白く。 pos x,y ;celput 1 //自機表示 mes "△" //自機代理 pos 0,0:mes "sublev="+sublev //サブルーチンの深さを表示 mes strf("自機x=%3d\ty=%3d",x,y) //自機位置表示 repeat 20 //弾の描画 if bullet(cnt)=1{ pos bx(cnt),by(cnt) ; celput 2 //弾表示 mes ""+cnt //弾代理に弾Noを表示 } loop gosub *move //移動 gosub *wall //移動範囲判定 gosub *b_check2 //弾移動 gosub *b_check3 //弾の再利用判定 redraw 1 await 10 goto *main *move //自機の移動 stick key,15 ; if(key=1):x-=10 ; if(key=2):y-=10 ; if(key=4):x+=10 ; if(key=8):y+=10 if(key&1):x-=6 //=を&にして同時押し対応 if(key&2):y-=6 //移動量も控えめに if(key&4):x+=6 if(key&8):y+=6 ; if(key&16):goto *b_check if(key&16):gosub *b_check //gosub中にgotoは使わない。 return *wall //自機が端まで行ったら止める if(x<0):x=0 if(y<0):y=0 if(x>390):x=390 if(y>390):y=390 return *b_check //空いている弾の配列チェック repeat 20 if bullet(cnt)=0{ bullet(cnt)=1 bx(cnt)=x+20 by(cnt)=y break } loop ;goto *main return //goto→gosub変更の為returnで戻す *b_check2 //画面にある弾を動かす repeat 20 if bullet(cnt)=1{ ; by(cnt)-=15 by(cnt)-=1 //弾移動が速過ぎて確認できなかったので遅く。 } loop return *b_check3 //画面外の弾は元に戻す repeat 20 if bullet(cnt)=1{ ; if by>510:bullet(cnt)=0 if by(cnt)<-10:bullet(cnt)=0 //配列でチェック。画面上にしか移動しない弾ならy座標はマイナスで範囲外に。 } loop return



linuxuser

リンク

2014/7/19(Sat) 13:44:06|NO.62960

皆すごいなおい
たんすさん、スクリプト参考にさせていただきます



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