先日はHSPで星もどきを多重スクロールするプログラムについて紹介しましたが、ああいうのはいかにも横シューの背景であるのでレーザーを撃てる自機を作ってみます。
とりあえず、以下のプログラムを実行してみてください。なお、今回は敵のプログラム部分は抜いてあります。
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 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 |
//Shooting Sample (C)2013 Eximradar.net ORGN-G dim laserPosX,10 dim laserPosY,10 dim laserLength,10 //ショットフラグ用変数 dim shotFlag,10 dim starPosX,60 dim starPosY,60 //自機の初期位置 mePosX = 240 mePosY = 400 for i,0,60,1 starPosX(i) = rnd(640) starPosY(i) = rnd(480) next *drowloop //画面初期化 cls 4 color 255,255,255 pos mePosX,mePosY mes meGrafx //キー入力判定 getkey keyRight,68 getkey keyLeft,65 getkey keyUp,87 getkey keyDown,83 stick shotKey,0 //ショットフラグを立てる if shotKey&16{ for i,0,7,1 if shotLimit=0 and shotFlag(i)=0:shotFlag(i)=1:laserPosX(i)=x:laserPosY(i)=y:shotLimit=1 next } shotLimit=0 //自機移動 meGrafx="^=--" if keyRight = 1 :if mePosX<=600 : mePosX = mePosX+4 : meGrafx = "^=--" if keyLeft = 1 :if mePosX>=10 : mePosX = mePosX-4 : meGrafx = "^=--" if keyUp = 1 :if mePosY>=10 : mePosY = mePosY-4 : meGrafx = "二>" if keyDown = 1 :if mePosY<=470 : mePosY = mePosY+4 : meGrafx = "二>" //レーザーの描画 foreach shotFlag if shotFlag(cnt) = 1{ if laserLength(cnt) < 100 : laserLength(cnt) + 10 : laserPosX(cnt) = mePosX + 28 : laserPosY(cnt) = mePosY line laserPosX(cnt),laserPosY(cnt)+6,laserPosX(cnt)+laserLength(cnt),laserPosY(cnt)+6 if laserLength(cnt) = 100 : laserPosX(cnt) = laserPosX(cnt) + 10 if laserPosX(cnt) >= 640 : shotFlag(cnt) = 0 : laserLength(cnt) = 0 : nfst(cnt) = 1 } loop //背景スクロール foreach starPosX if 0 <= cnt and cnt <= 19 : starPosX(cnt) - 2 :color 253,255,100 if 20 <= cnt and cnt <= 39 : starPosX(cnt) - 3 :color 255,146,100 if 40 <= cnt and cnt <= 60 : starPosX(cnt) - 5 :color 255,255,255 if starPosX(cnt) < 0:starPosX(cnt) = 641 : starPosY(cnt) = rnd(480) pset starPosX(cnt),starPosY(cnt) loop //画面に反映 redraw 1 wait 1 redraw 0 goto *drowloop |
動作イメージがわかったところで各セクションについて説明を加えていきます。
各命令についてはHSPの命令リファレンスなどを参照してください。
//ショットフラグ用の変数
・この配列変数には、「レーザーが画面に表示されているか」のフラグが格納されます。
・上のサンプルでは配列が10ですので、画面上には同時に10本のレーザーが表示できます。
//画面初期化
・次フレーム描画のためにここで画面を一度まっさらな状態にしています。
//キー入力判定
・getkey及びstick命令でキー入力を取得しています。
・stick命令は同時押し判定が必要な時に便利です。
//ショットフラグを立てる
・スペースキーが押された場合にショットフラグを立てます。配列の若い方が優先されます。
・shotLimitで1フレーム中にフラグを立てられる数を1つに制限しています。
//自機移動
・キー入力に基づいて自機を移動します。サンプルでは上下左右ともに移動速度は4ドット/フレームです。
//レーザー描画
・ショットフラグに基づいてレーザーを描画します。
・サンプルではlaserLength(レーザー長)は100です。自機の前に突然長さ100のレーザーが現れるのは不自然ですから、64行目で自機からレーザーが伸びる処理をしています。レーザー長が100に達するまではレーザーの始点は自機に追従します。
・レーザーは10ドット/1フレームの速度で発射されます。
・65行目は実際にline命令でレーザーを描画しています。
・66行目ではlaserLengthが100に達したレーザーを画面右にスクロールしています。レーザ長や速度を変更する場合は、64行目のlaserLengthとlaserPosXに数値を一致させなければなりません。
・67行目では、画面外に出たレーザーのショットフラグを解除(下ろす)しています。
//背景スクロール
前述の通り、前回のプログラムを使用しています。
//画面に反映
・試してもらえばわかりますが、redraw部分がないと画面がちらつきます。
ざっと説明させてもらいましたが、不明な点などはコメント欄にお寄せいただければ可能な限りお答えいたします。
それでは今回はこの辺で。