プログラミング初心者のゲーム創作過程の記録です。ソースも載せるかも…
×
[PR]上記の広告は3ヶ月以上新規記事投稿のないブログに表示されています。新しい記事を書く事で広告が消えます。
弾の挙動は以前にも書いたように角度で制御してるんですよ。
ただそれだと敵の移動が相対座標による指定だからあまり相性が良くないんですよね。
つまり、弾を発射する敵が移動方向も何も分かってないのに発射角度が定まらないわけで……
絶対角度や自機狙いで弾を発射してるんですが
相対角度で発射できないんですよね。
ていうか面倒なんだよね。
だから、この際敵の移動も移動方向を角度で指定しようかなと思ってるんですが……
それだと楕円軌道がなぁ……
って感じです……
ただそれだと敵の移動が相対座標による指定だからあまり相性が良くないんですよね。
つまり、弾を発射する敵が移動方向も何も分かってないのに発射角度が定まらないわけで……
絶対角度や自機狙いで弾を発射してるんですが
相対角度で発射できないんですよね。
ていうか面倒なんだよね。
だから、この際敵の移動も移動方向を角度で指定しようかなと思ってるんですが……
それだと楕円軌道がなぁ……
って感じです……
ひとまず弾の発射について
引数を記憶してる配列変数の列の定義定数は面倒だから省略。
敵の移動関数内にこの記述を追加。
//弾発射要するに以前弾を撃った時間から一定時間が経過すれば弾を発射。
if enemyShotStatus(i, ENEMY_SHOT_TIME_COL) > -1{
if enemyShotStatus(i, ENEMY_SHOT_TIME_COL) = 0{
es_get ex, enemyStatus(i, ENEMY_SPR_COL), ESI_POSX_INT : es_get ey, enemyStatus(i, ENEMY_SPR_COL), ESI_POSY_INT
ex += CHA_SIZE(enemyInitialize(i, ENEMY_INI_CHA_COL), CHA_W_COL) / 2
ey += CHA_SIZE(enemyInitialize(i, ENEMY_INI_CHA_COL), CHA_H_COL) / 2
if enemyShotStatus(i, ENEMY_SHOT_ANGLE_COL) = 360{
es_ang ex, ey, ox, oy : angle = stat
}else{
angle = enemyShotStatus(i, ENEMY_SHOT_ANGLE_COL)
}
gosub enemyShotPattern(i)
enemyShotStatus(i, ENEMY_SHOT_TIME_COL) = enemyShotStatus(i, ENEMY_SHOT_LAG_COL)
}else{
enemyShotStatus(i, ENEMY_SHOT_TIME_COL)--
}
}
それ以外なら時間を進める。
それから発射角度の引数が360なら自機狙いでちょっとここから反則技。
es_ang ex, ey, ox, oy : angle = stat
敵から自機方向の角度を求めるのがこの部分ですね。
要するにこれ以前の自機移動で使用した自機の座標(ox, oy)をそのまま使ってるだけ。
クラスを用いるような言語ならまず使えない方法ですね。
関数つかやぁいいんですけど、HSPの関数ってクセがあって使いづらいんよ……
でその前にかなり強引に中心座標を求めてますがそっちもご愛敬。
hspdxだと中心が把握しづらくて。そのへんはh3imgのほうが便利ですね。
それで弾発射サブルーチンがこっち
;--------------------弾発射サブルーチン------------------各サブルーチンで発射する弾の種類を選ぶサブルーチンに飛んでるところ以外はこの辺も特筆すべきところはないかな。
;--------------------Singleショット------------------
*no_shot//発射無
return
;--------------------Singleショット------------------
*single_shot//単発弾
//発射処理
a = angle
v = enemyShotStatus(i, ENEMY_SHOT_V_COL)
gosub enemyShotColor(i)
gosub *generate_bullet
return
;--------------------Scatterショット------------------
*Scatter_shot//ばらまき弾
//発射処理
a = angle + rnd(enemyShotStatus(i, ENEMY_SHOT_P1_COL)) - enemyShotStatus(i, ENEMY_SHOT_P1_COL) / 2
v = enemyShotStatus(i, ENEMY_SHOT_V_COL) + rnd(enemyShotStatus(i, ENEMY_SHOT_P2_COL)) - enemyShotStatus(i, ENEMY_SHOT_P2_COL) / 2
gosub enemyShotColor(i)
gosub *generate_bullet
return
;--------------------Wideショット------------------
*wide_shot//広範囲弾
//発射処理
a = angle - enemyShotStatus(i, ENEMY_SHOT_P1_COL)
v = enemyShotStatus(i, ENEMY_SHOT_V_COL)
repeat enemyShotStatus(i, ENEMY_SHOT_P1_COL)
a += 2
gosub enemyShotColor(i)
gosub *generate_bullet
loop
return
;--------------------N-Wayショット------------------
*nway_shot//N方向弾
//発射処理
a = angle - enemyShotStatus(i, ENEMY_SHOT_P1_COL)
v = enemyShotStatus(i, ENEMY_SHOT_V_COL)
a1 = enemyShotStatus(i, ENEMY_SHOT_P1_COL) * 2 / enemyShotStatus(i, ENEMY_SHOT_P2_COL)
repeat enemyShotStatus(i, ENEMY_SHOT_P2_COL)
a += a1
gosub enemyShotColor(i)
gosub *generate_bullet
loop
return
;--------------------Circleショット------------------
*circle_shot//円方向弾
//発射処理
a = angle
v = enemyShotStatus(i, ENEMY_SHOT_V_COL)
a1 = 360 / enemyShotStatus(i, ENEMY_SHOT_P2_COL)
repeat enemyShotStatus(i, ENEMY_SHOT_P2_COL)
a += a1
gosub enemyShotColor(i)
gosub *generate_bullet
loop
return
弾の挙動用サブルーチンは以前の敵毎の移動サブルーチンとほぼ一緒だから省略。
んでもって弾の生成処理。
;--------------------弾生成処理------------------
*generate_bullet//弾生成処理
//弾生成
bx = ex - CHA_SIZE(cha, CHA_W_COL) / 2
by = ey - CHA_SIZE(cha, CHA_H_COL) / 2
es_set enemyBulletSprNo, bx, by, cha
es_type enemyBulletSprNo, ENEMY_BULLET_G
j = enemyBulletSprNo - ENEMY_BULLET_SPR_NO
bulletStatus(j, BULLET_SPR_COL) = enemyBulletSprNo
//弾引数記憶
bulletStatus(j, BULLET_V_COL) = v
bulletStatus(j, BULLET_ANGLE_COL) = a
bulletStatus(j, BULLET_P1_COL) = enemyShotStatus(i, ENEMY_SHOT_BP1_COL)
bulletStatus(j, BULLET_P2_COL) = enemyShotStatus(i, ENEMY_SHOT_BP2_COL)
bulletTrack(j) = enemyShotTrack(i)
es_adir bulletStatus(j, BULLET_SPR_COL), bulletStatus(j, BULLET_ANGLE_COL), bulletStatus(j, BULLET_V_COL)
enemyBulletSprNo++
if enemyBulletSprNo = OWN_SPR_NO : enemyBulletSprNo = ENEMY_BULLET_SPR_NO
return
PR
Comment