忍者ブログ
プログラミング初心者のゲーム創作過程の記録です。ソースも載せるかも…
×

[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
Name
Title
Mail
URL
Comment
Pass   Vodafone絵文字 i-mode絵文字 Ezweb絵文字
この記事へのトラックバック
この記事にトラックバックする:
[24] [23] [22] [21] [20] [19] [18] [17] [16
«  Back :   HOME   : Next  »
カレンダー
10 2024/11 12
S M T W T F S
1 2
3 4 5 6 7 8 9
10 11 12 13 14 15 16
17 18 19 20 21 22 23
24 25 26 27 28 29 30
プロフィール
HN:
すず
性別:
男性
自己紹介:
プログラムもSTGも初心者です(^_^;)
昔ツインビーやゼビウス、グラディウスを少し遊んでました。最近は東方を遊んで弾幕ゲーにカルチャーショックをw
現在友達とまったり製作中...
カテゴリー
最新コメント
ブログ内検索
バーコード
忍者ブログ [PR]