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


HSPTV!掲示板


未解決 解決 停止 削除要請

2019
0116
hutanaシューティングゲーム3解決


hutana

リンク

2019/1/16(Wed) 09:39:07|NO.86330

シューティングゲームにタイムをつけてタイムアタック風にしたいのですが
参考書等で調べてもどこにどうやって付け加えたらいいのかわからないので教えてください


ーーーーーーーーーーーーーー以下コードですーーーーーーーーーーーーーーーー
*Init
;弾丸の管理
dim tamaF,10
dim tamaX,10
dim tamaY,10
;敵機の管理
dim enemyF,50
dim enemyX,20
dim enemyY,20
*Main
screen 0,1000,400,SCREEN_FIXEDSIZE
font MSGOTHIC,50
randomize
repeat
redraw 0
stick key,%11111
gosub *EnemyBirth
gosub *FightDraw
gosub *EnemyDraw
gosub *TamaDraw
redraw 1
await (1000/30)
loop
stop
;自機操作
*FightDraw
if(key&1):x-=5:if(x<0):x=0
if(key&2):y-=5:if(y<0):y=0
if(key&4):x+=5:if(x>970):x=970
if(key&8):y+=5:if(y>370):y=370
if(key&16):gosub *TamaBirth
color $00,$00,$00:boxf
color $00,$FF,$00:pos x,y:mes "自"
return
;弾の発生
*TamaBirth
if(tamaTrigg):tamaTrigg--:return
foreach tamaF
if(tamaF(cnt)==0){
tamaF(cnt)=1
tamaX(cnt)=x
tamaY(cnt)=y
break
}
loop
tamaTrigg=8
return
await
;弾の軌道
*TamaDraw
foreach tamaF
if tamaF(cnt){
tamaX(cnt)+=10:if(tamaX(cnt)>1000):tamaF(cnt)=0:continue
pos tamaX(cnt),tamaY(cnt)
color $FF,$FF,$00:mes "弾"
}
loop
return
;敵の発生
*EnemyBirth
if(enemyCycle):enemyCycle--:return
foreach enemyF
if(enemyF(cnt)==0){
enemyF(cnt)=1
enemyX(cnt)=1000
enemyY(cnt)=rnd(1000/50)*50
break
}
loop
enemyCycle=3
return
;敵の軌道
*EnemyDraw
foreach enemyF
if enemyF(cnt){
enemyX(cnt)-=20:if(enemyX(cnt)<0) :enemyF(cnt)=0:continue
if FightCrash(enemyX(cnt),enemyY(cnt)) :enemyF(cnt)=0:continue
if TamaCrash(enemyX(cnt),enemyY(cnt)) :enemyF(cnt)=0:continue
pos enemyX(cnt),enemyY(cnt)
color $00,$FF,$FF:mes "敵"
}
loop
return
;敵判定(自機)
#defcfunc FightCrash int _x_,int _y_
if(abs(x-_x_)<30)and(abs(y-_y_)<30){
fight--
return 1
}
return 0
;敵判定(弾)
#defcfunc TamaCrash int _x_,int _y_
n=0
foreach tamaF
if tamaF(cnt){
if(abs(tamaX(cnt)-_x_)<50)and(abs(tamaY(cnt)-_y_)<50){
tamaF(cnt)=0
n=1
break
}
}
loop
return n
ーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーー
よろしくお願いします



この記事に返信する


Makoto

リンク

2019/1/16(Wed) 19:33:40|NO.86332

このプログラムでしたら、以下の部分に少し追加するだけで基本的な仕組みはできます。

TIME=1000 ;残り時間 repeat redraw 0 stick key,%11111 gosub *EnemyBirth gosub *FightDraw gosub *EnemyDraw gosub *TamaDraw TIME -- ;残り時間を減らす pos 0,0:color 255,255,255:mes "TIME:"+TIME ;時間表示 if TIME<0 : goto *TIMEUP ;時間切れ redraw 1 await (1000/30) loop stop -------------------- *TIMEUP ;時間切れ後の処理(追加場所は適当な位置に) stop
この例では単純にループ回数をカウントしているだけですが、
正確に時間を計測したいという場合には
・gettime
・d3timer (d3module)
・hggettime (hgimg3)
等を使う必要があります。

いずれにしても、時間のカウントが条件を満たしたら
ループを抜けるとか、時間切れ後の処理に切り替えるとか
といった形になります。



Makoto

リンク

2019/1/16(Wed) 21:10:40|NO.86333

すみません。とんでもない初歩的なミスをやらかしてしまいました。
repeat-loop から goto で抜けるのは厳禁ですね。
こちらに訂正します。


TIME=1000 ;残り時間 TIMEUP= 0 ;時間切れフラグ repeat redraw 0 stick key,%11111 gosub *EnemyBirth gosub *FightDraw gosub *EnemyDraw gosub *TamaDraw TIME -- ;残り時間を減らす pos 0,0:color 255,255,255:mes "TIME:"+TIME ;時間表示 if TIME<0 { TIMEUP=1 : break } ;時間切れ redraw 1 await (1000/30) loop if TIMEUP=1 { ; 時間切れ後の処理 stop } stop



hutana

リンク

2019/1/18(Fri) 14:35:57|NO.86336

ありがとうございます
上手く動作しました



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