| チェックポイント 今度は武器を追加してみましょう。 敵のUFOやプレイヤなどのキャラと同じように武器を作成します。 |
| ■プログラム |
0001 ' initialize |
では追加部分の説明を行います。
0001 ' initialize
0002 GOSUB @SYS_INI
0003 GOSUB @UFO_INI
0004 GOSUB @PLY_INI
0005 GOSUB @WPN_INI
0006 ' game loop
0007 @LOOP
0008 GOSUB @SYS_MAIN
0009 ' task
0010 GOSUB @UFO_TASK
0011 GOSUB @PLY_TASK
0012 GOSUB @WPN_TASK
0013 GOTO @LOOP
まずはメイン部分の変更です。
ここでは新たに武器の初期化と武器のタスク実行を追加してあります。
具体的な内容は後ほど!!
0062 @PLY_TASK
0063 LOCATE PLY_X,21
0064 PRINT "P"
0065 IF SYS_KEY AND 16 THEN GOSUB @WPN_FIRE
0066 ON PLY_F GOTO @PLY_STOP,@PLY_MVR,@PLY_MVL
0067 STOP
UFO部分では変更はありませんでした。
プレイヤ部分ではSYS_KEYに16をANDしてそれが0かそうでないか判断しています。
SYS_KEY変数はシステムがゲームループ1回につき一度BUTTON関数を呼び出しその値を保存しています。
ゲームループは1秒間に60回(理想的には)実行されます。
そのときのDSiのボタンの状態をSYS_KEY変数に保存しています。
16でANDするとAボタンが押されているかどうかが判定できます。
要するにここではAボタンが押されていたら@WPN_FIREサブルーチンを呼ぶことになります。
@WPN_FIREは武器の発射を行うルーチンです。
0096 @WPN_INI
0097 WPN__F = 0
0098 WPN_SY = 0.5
0099 RETURN
武器の初期化を行います。
WPN_Fが0のとき武器は発射されていない状態で発射されるのを待っています。
WPN_SYは武器のY方向の移動量です。
0101 @WPN_TASK
0102 ON WPN_F GOTO @WPN_WAIT,@WPN_MOVE
0103 STOP
0104 '
0105 @WPN_WAIT
0106 RETURN
0107 '
0108 @WPN_MOVE
0109 LOCATE WPN_X,WPN_Y
0110 PRINT "!"
0111 WPN_Y = WPN_Y + WPN_SY
0112 IF WPN_WPN_Y >= 0 THEN RETURN
0113 WPN_F = 0
0114 RETURN
ON WPN_F GOTO 文で武器が待ち状態か発射されて移動している状態か判断しています。
0103行のSTOPは普通は実行されません。
WPN_Fに不正なデータが入っているときストップします。
要するにバグチェック用のSTOPです。
@WPN_WAITは何もしません。
@WPN_MOVEは武器がY方向に移動します。
このときY方向の位置を保存しているWPN_Yが0以上の場合には画面ないですが
0未満のときは画面外となるため武器の状態を待ち状態にしています。
0116 @WPN_FIRE
0117 IF WPN_F THEN RETURN
0118 WPN_F = 1
0119 WPN_X ~ PLY_X
0120 WPN_Y = 20
0121 RETURN
Aボタンが押されたときに呼び出しているWPN_FIREは武器を発射状態にします。
ただし最初の0117行目はWPN_FをIF文で判断しています。
WPN_Fが0のとき武器は待ち状態なのでいつでも発射できますが、
WPN_Fが0以外のときは発射済みなので何もせず戻ります。
要するに武器は1個だけ使えるということです。
すでに武器を使用してる場合には新たに発射できません。(今回は!!)
発射できる場合まずフラグを発射状態に変更します。
次に武器の初期位置を初期化します。
プレイヤのY位置が21なのでひとつ上の位置ということでWPN_Yに20を設定しています。
発射した時のプレイヤのX方向の位置はPLY_Xが持っているのでその値をWPN_Xに代入しています。
これでプレイヤの横位置は同じで縦がひとつ上の位置に武器を表示できます。
ではなぜわざわざプレイヤのX方向の位置を入れるのでしようか?
そうです!!
プレイヤはあなたの操作で動いています。
もし武器がプレイヤのX座標を使って表示していたら…これは一回試してみてください。