|
|
|
2011/8/21(Sun) 18:35:54|NO.40751
まだまだ初心者なのでスクリプトが見にくいかったり、無知だったりすると思いますが質問させてください。
STGを作っているのですが、敵の処理がうまくできません。
frameが100になったら敵はストップし、そこからとりあえず、まっすぐ弾を撃つ、というようにしたいのですがうまくいきません。
敵はストップするのですが、そこから思ったように弾を発射してくれません。
あと、画面のちらつきも激しいです。
ご教授ください
frame=0
//自機座標
x=400
y=450
//自機弾初期化
tamax=10
dim tamaf,tamax//存在フラグ
dim tama_x,tamax
dim tama_y,tamax
dim tama_rx,tamax
dim tama_ry,tamax
dim tama_lx,tamax
dim tama_ly,tamax
//敵機座標
ex=400
ey=-50
etama_x=400
etama_y=100
etama_vx=15
etama_vy=-15
//敵機弾初期化
etamax=640
dim etamaf,etamax
dim etama_x,etamax
dim etama_y,etamax
dim etama_vx,etamax
dim etama_vy,etamax
ehp=1000
//メインループ
*main
redraw 0
color 255,255,255
boxf
frame=frame+1
pos 0,0
color 0,0,0
mes frame
pos 400,25
mes ehp
getkey zkey , 90
gosub*jikiidou
if zkey=1:gosub*jikishot
gosub*tekisyori
gosub*tekiatari
redraw 1
await 10
goto*main
*tekisyori
if frame>100 {
ey=ey+1
if ey>100:ey=100:etamaf=1:gosub*tekitama
pos ex-20,ey-20
gmode 2,40,40
gcopy 1,0,70
}
return
//敵弾処理
*tekitama
repeat etamax
etamaf(cnt)==1
etama_y(cnt)=etama_y+rnd(5)
pos etama_x(cnt),etama_y(cnt)
loop
gmode 2,45,40
gcopy 1,50,70
return
| |
|
2011/8/21(Sun) 20:50:44|NO.40757
この状態で載せられてもそのまま実行できないってことわかるよね?
こちらは何の予兆もなく書き込み見てるんだから載せるんだったら全部載せるか適当なうpろだに上げてくれ。
|
|
2011/8/22(Mon) 00:07:53|NO.40764
backdropさんすみませんでした。貼りなおさせていただきます。
dialog "フルスクリーンで起動しますか?",2,"Config"
if stat=6:screenmode=0
if stat=7:screenmode= 1
buffer 1
picload "player_sakuya.bmp"
mmload "graze.wav",1
mmload "nc899.wav" , 0
screen 0,800,600
frame=0
//自機座標
x=400
y=450
//自機弾初期化
tamax=10
dim tamaf,tamax//存在フラグ
dim tama_x,tamax
dim tama_y,tamax
dim tama_rx,tamax
dim tama_ry,tamax
dim tama_lx,tamax
dim tama_ly,tamax
//敵機座標
ex=400
ey=-50
etama_x=400
etama_y=100
etama_vx=15
etama_vy=-15
//敵機弾初期化
etamax=640
dim etamaf,etamax
dim etama_x,etamax
dim etama_y,etamax
dim etama_vx,etamax
dim etama_vy,etamax
ehp=1000
//メインループ
*main
redraw 0
color 255,255,255
boxf
frame=frame+1
pos 0,0
color 0,0,0
mes frame
pos 400,25
mes ehp
getkey zkey , 90
gosub*jikiidou
if zkey=1:gosub*jikishot
gosub*tekisyori
gosub*tekiatari
redraw 1
await 10
goto*main
*jikiidou
//自機移動処理
stick key,31
if key & 1:x-speed
if key & 2:y-speed
if key & 4:x+speed
if key & 8:y+speed
pos x-10,y-31
gmode 2,21,63
gcopy 1
//低速移動処理
stick tkey,64
if tkey=64 : speed=2
if tkey=0 : speed=8
*jikishot
//自機弾処理
if zkey=1 {
if shottime=0 {
shottime=5
repeat tamax
if tamaf(cnt)=0{
tama_x(cnt)=x
tama_y(cnt)=y-30
tama_rx(cnt)=x+20
tama_ry(cnt)=y-30
tama_lx(cnt)=x-20
tama_ly(cnt)=y-30
tamaf(cnt)=1
break
}
loop
} else {
shottime--
}
}
//自機弾の移動
repeat tamax
if tama_y(cnt) < 0 : tamaf(cnt) = 0
if tama_ry(cnt) < 0 : tamaf(cnt) = 0
if tama_ly(cnt) < 0 : tamaf(cnt) = 0
if tamaf(cnt)=1{
tama_y(cnt)-=10//弾同士の間隔が20ピクセル
tama_ry(cnt)-=10
tama_ly(cnt)-=10
if tama_y(cnt)<-1000{
tamaf(cnt)=0
}
}
loop
//自機弾表示
repeat tamax
if tamaf(cnt)=1{
pos tama_x(cnt)-4,tama_y(cnt)-14
gmode 2,12,16
gcopy 1,73,13
pos tama_rx(cnt)-4,tama_ry(cnt)-14
gmode 2,12,16
gcopy 1,73,13
pos tama_lx(cnt)-4,tama_ly(cnt)-14
gmode 2,12,16
gcopy 1,73,13
}
loop
redraw 1
return
*tekisyori
if frame>100 {
ey=ey+1
if ey>100:ey=100:etamaf=1:gosub*tekitama
pos ex-20,ey-20 gmode 2,40,40 gcopy 1,0,70
}
return
//敵弾処理
*tekitama
repeat etamax
etamaf(cnt)==1
etama_y(cnt)=etama_y+rnd(5)
pos etama_x(cnt),etama_y(cnt)
loop
gmode 2,45,40
gcopy 1,50,70
return
*tekiatari
edx = ex - tama_x(cnt) : edy = ey - tama_y(cnt)
edx*=edx : edy*=edy
if(edx + edy <=100){
tamaf(cnt)=0
ehp=ehp-5
}
if ehp<=0 {
ehp=0
mmplay 0
}
return
| |
|
2011/8/22(Mon) 14:41:39|NO.40770
どうもこんにちは。
1:
まず素で実行すると「pos ex-20,ey-20 gmode 2,40,40 gcopy 1,0,70」がおかしいせいで実行できません。
これは間に「:」を入れてないのが原因です。
2:
次に画像とサウンド?データがこちらに無いのでエラーが出ます。
「picload、mmload、mmload」の前に「//」などのコメントでエラーが出ないようにできるのですが・・・
それだと画面が真っ白になって何が起きているのかわからないので、自前の画像でなんとか処理を見れました。
もし他人に説明する場合は・・・
「color 255,255,255 : pos myx,myy : mes "自" 」
「color 255 : pos TKx,TKy : mes "敵"」
とかにすればわかりやすくなります。
3:
今は「自機移動」「自機弾」は必要がない情報なので(誰かに見せる場合は)消しておくとソースが見やすくなります。
後「*jikiidou」などのラベル名は日本語の方が見やすいです。
4:
自機の管理を「x=400」とかにしてしまうと、
何か不具合あったとき「x」を検索すると色々ひっかかるので別の変数名の方がいいです。
(コメント検索で「自機」とやっても「自機弾」とかにひっかかる)
>>あと、画面のちらつきも激しいです。
これはラベルにジャンプ後の終了時に「return」を入れてないからです(83行目)
>>そこからとりあえず、まっすぐ弾を撃つ、
これは「etama_x」に何も指定してないせいですね。
etama_x(cnt) = ex - 20 ;敵弾の位置
と置くだけで、敵の位置に弾が出ると思います。
|
|
2011/8/22(Mon) 21:02:35|NO.40796
>>まず素で実行すると「pos ex-20,ey-20 gmode 2,40,40 gcopy 1,0,70」がおかしいせいで実行できません。
これは間に「:」を入れてないのが原因です。
こちらのコピペミスでしたスミマセン
>>これはラベルにジャンプ後の終了時に「return」を入れてないからです(83行目)
そこにreturnを入れると弾が発射されませんでした。
ちらつくのは敵と敵弾だけなので、自機は関係ないと思います。
>>これは「etama_x」に何も指定してないせいですね。
etama_x(cnt) = ex - 20 ;敵弾の位置
と置くだけで、敵の位置に弾が出ると思います。
弾のx座標はうまくいきましたが、今度はy座標が敵の位置から発射されず、一番上から発射されてしまいます。
たびたびスミマセンが、ご教授ください。
|
|
2011/8/22(Mon) 22:34:12|NO.40805
もうこれでいいじゃん。
mpx=300.0
mpy=300.0
ddim mtx,30
ddim mty,30
ddim tpx,30
ddim tpy,30
mtw=10
repeat 10
mtx(cnt)=-100.0
mty(cnt)=-100.0
loop
repeat 30
tpx(cnt)=1.0*rnd(640)
tpy(cnt)=0.0-1.0*rnd(480)
loop
*main
redraw 1
await 20
redraw 0
color 0,0,0
boxf
color 255,255,255
stick ky,1+2+4+8+16
if (ky&1)=1{mpx-=4.0}
if (ky&2)=2{mpy-=4.0}
if (ky&4)=4{mpx+=4.0}
if (ky&8)=8{mpy+=4.0}
repeat 10
if (ky&16)=16 & mtw<0 & mty(cnt)<-20.0{
mtx(cnt)=mpx
mty(cnt)=mpy-10
mtw=10
}
mty(cnt)-=5.0
loop
mtw--
repeat 30
tpy(cnt)+=2.0
if tpy(cnt)>640.0{
tpx(cnt)=1.0*rnd(640)
tpy(cnt)=0.0-1.0*rnd(480)
}
loop
repeat 10:m=cnt
repeat 30:t=cnt
if mtx(m)<tpx(t)+20 & tpx(t)<mtx(m)+20 & mty(m)<tpy(t)+20 & tpy(t)<mty(m)+20 {
mty(m)=-200.0
mtx(m)=-200.0
tpx(t)=1.0*rnd(640)
tpy(t)=0.0-1.0*rnd(480)
SCORE+=10
}
loop
loop
pos mpx,mpy
mes "自"
repeat 10
pos mtx(cnt),mty(cnt)
mes "□"
loop
repeat 30
pos tpx(cnt),tpy(cnt)
mes "◎"
loop
pos 0,0
mes "SCORE:"+SCORE
goto*main
|
|
2011/8/23(Tue) 09:19:37|NO.40815
>>そこにreturnを入れると弾が発射されませんでした。
>>ちらつくのは敵と敵弾だけなので、自機は関係ないと思います。
あ、いやラベルが戻らないうちに、ラベルに入るのはよくないので「return」を入れたほうがいいという意味です。
っていうか自機弾あったんですね・・・最初気がついたのですが、消してしまったようです (´・ω・`)
} else {
shottim}
}
}
の後に「return」入れる。
>>*自機弾の移動
>>//自機弾の移動
>> repeat tamax
の上に「*自機弾の移動」などのラベルを入れる。
後は「gosub」を入れればチカチカしないはずだよ。
gosub*tekisyori
gosub*tekiatari
gosub*自機弾の移動
正常作動するかはわからんが(細かい不具合)とりあえずっということで。
>>弾のx座標はうまくいきましたが、今度はy座標が敵の位置から発射されず、
>>一番上から発射されてしまいます
あぁ・・・一番上から出るのが仕様かと思ってました。
「etama_x(cnt) = ex」
っというのは「敵の弾x = 敵の座高x」を入れてあげているのです。
敵の座高が400だった場合「敵の弾x = 400」が入るのをわかればYも出来るはずです。
ちなみにこのままやると、敵玉が下に動かないですね。
簡単ながらソースを元に改造してみた(ただし見せる用ではないので、見づらいはデフォ)
screen 0,800,600 ;ウィンドウを初期化
frame = 0 ;フレーム数
//自機座標
myx = 400 : myy = 450
//敵機座標
ex = 400 : ey = -50
//敵機弾初期化
etamax = 640
dim etamaf,etamax ;敵のフラグ
dim etama_x,etamax ;敵弾X
dim etama_y,etamax ;敵弾Y
;*************メインループ**************
*メイン
redraw 0 : color 0,0,0 : boxf
;**************カウンター***************
frame = frame + 1 ;フレーム数
color 255,0,0
pos 0,0 : mes "フレーム数 " + frame
pos 0,20 : mes "敵のy " + ey
;***************************************
gosub*敵の処理
;自機表示
color 255,255,255 : pos myx-10,myy-31 : mes "自" ;自機表示
redraw 1 : await 10
goto*メイン
;***************敵の処理****************
*敵の処理
if frame > 100 { ;フレーム数が100を超えたら、敵を表示
ey = ey+1 ;敵の移動スピード
;敵の座高が100行ったらそこでストップ : 敵フラグを立てる
if ey > 100 : ey = 100 : etamaf = 1 : gosub*敵弾処理
color 255 : pos ex-20,ey-20 : mes "敵" ;敵表示
}
return
;**************敵弾処理*****************
*敵弾処理
repeat etamax ;640
if etamaf(cnt) == 0 { ;敵のフラグ
etama_x(cnt) = ex - 20 ;敵弾のx位置
etama_y(cnt) = ey - 20 ;敵弾のy位置
etamaf(cnt) == 1 ;敵のフラグ
}
etama_y(cnt) += 1 ;敵弾のスピード
if etama_y(cnt) >= 600 : etama_y(cnt) = 0 ;敵弾が一番下までいったら、上に戻す
pos etama_x(cnt),etama_y(cnt) ;敵弾表示
loop
;敵弾描画
color ,255 : mes "敵弾" ;敵弾表示
return
| |
|
2011/8/26(Fri) 19:22:16|NO.40882
backdropさんは冷やかしだったみたいですね^^;
|
|
2011/8/26(Fri) 19:49:31|NO.40883
>>ぱれっとさん
自分が悪いんだろw
|
|
2011/8/26(Fri) 20:16:09|NO.40884
>backdropさんは冷やかしだったみたいですね^^;
久しぶりにイラっときた。
|
|
2011/8/27(Sat) 08:29:31|NO.40889
ところで解決したのですか?
ソース解読に時間がかかってたと思ってたのですが・・・
回答してくれた人たちがかわいそうですよ・・・(´・ω・`)
|
|
2011/8/27(Sat) 13:34:41|NO.40891
>>てれてれさん、whoさん
上のぱれっとは私ではありません。成りすましです。
>>ミントさん
諸事情で遅れました。すみませんでした。ミントさんが指摘してくれたところを修正してみました。
敵弾は敵の位置から発射されましたが、それとは別に弾が画面左からも発射されてしまいます。
また、2発目以降の敵弾が上から出てきてしまいます。
また、ちらつきのほうも
>>*自機弾の移動
>>//自機弾の移動
>> repeat tamax
>>の上に「*自機弾の移動」などのラベルを入れる。
>>後はgosubを使えばちらつかないはず
やってみましたがうまくいきませんでした。
ちらつきがどちらかというと悪化したようになりました。
最後に2度目になりますが上にある
>>ぱれっと
>>backdropさんは冷やかしだったみたいですね^^;
これは私ではありません。
返答遅れてしまいすみませんでした。
深くお詫び申し上げます。
|
|
2011/8/27(Sat) 14:11:49|NO.40892
>>最後に2度目になりますが上にある
分る人には分りますよ。
|
|
2011/8/30(Tue) 21:31:27|NO.40963
まだ解決できていないのでご教授お願いしたいです。
|
|
2011/8/30(Tue) 22:34:25|NO.40964
>まだ解決できていないのでご教授お願いしたいです。
なんでミントさんが素晴らしいサンプルを作ってくださったのに無視してるんですか?
というかなんでミントさんのレス全部スルーしてるんですか?
この素晴らしいスクリプトを参考にすれば実装はそんなに困難じゃないですよね?
スクリプトに理解できなかった部分があるなら
理解できなかった部分をもっと具体的に質問するべきじゃないんですか?
|
|
2011/8/31(Wed) 11:00:29|NO.40975
ぱれっとさんは自分で少しひねって考えたり工夫してみては?
皆さんのレスを読めば、よほど数学が苦手でない限りは分かると思います。
追記
i114-183-158-106.s05.a012.ap.plala.or.jp
上がってるスレッドから特定しようとしても見つからない(´・ω・`)
|
|
2011/8/31(Wed) 18:42:47|NO.40984
>>てれてれさん
ミントさんのスクリプは実行しましたし、ミントさんに返事も返しました。
上を見てください。
実行してみるとやはり敵が出てきて弾を発射するところでちらつきがひどくなります。
また、弾が敵からの発射とは別に画面左からも出てきてしまいます。
>>i114-183-158-106.s05.a012.ap.plala.or.jp
>>上がってるスレッドから特定しようとしても見つからない(´・ω・`)
どういうことでしょうか?
無知ですみません
|
|
2011/8/31(Wed) 21:36:08|NO.40987
>>ぱれっとさん #40984
>>>てれてれさん
>ミントさんのスクリプは実行しましたし、ミントさんに返事も返しました。
>(略)
そういう問題ではなくて、ミントさんたちがくれたヒントを元に自分でも考えろということではないでしょうか?
>>>i114-183-158-106.s05.a012.ap.plala.or.jp
>>>上がってるスレッドから特定しようとしても見つからない(´・ω・`)
>どういうことでしょうか?
なりすましの特定です。スルーでOKです
引用符多くなって見難くてすんません
|
|
2011/9/3(Sat) 03:56:02|NO.41034
>>れみはるさん
わかりました。皆さんの回答を下に自分でがんばってみます。ありがとうございました。
|
|