; シフトアップネット シューティングサンプル凝縮版 byハムおばさん ; (元のページへ戻るにはブラウザの「戻る」ボタンをお使いください) ; 下記コマンドのサンプル ; keydown hit region group weight /キー押下状態/画像スプライトの当たり判定/メインループの経過時間待ち ; 初期設定------------ FPS = 20 ; 通常のゲームは12フレーム(rate使わない時の初期値)、動きのあるアクション系は20フレームがいい rate FPS ; フレームレート指定 msg ロード中・・・ . ; 背景画像 load "fore1_1b" grpBack 100 fit grpBack paint grpBack ; 標的 SUU_TGT = 10;その画面最大10体 MAX_TGT < SUU_TGT - 1 wk2 = 1000;重ね順1000からMAX_TGT回分標的を作成してためる for i = 0 to MAX_TGT load "yadokari.png" grpTarget[i] wk2 group grpTarget[i] wk2 ; グループ指定 は重ね順にする region grpTarget[i] 40 40 ; 衝突サイズ指定 は画像の16%に wk2 + 1 endfor ; ショット noShot = 0 SUU_SHOT = 8;その画面最大8ショット分 MAX_SHOT < SUU_SHOT - 1 wk2 = 2000;重ね順2000からMAX_SHOT回分ショットエフェクトを画面外(0,-500からx方向へ-600、20タイム動かした後0,-500へ)に作成してためる for i = 0 to MAX_SHOT load "gun1.gif" grpShot[i] wk2 locateCenter grpShot[i] 0 -500 addAnimRotateLoop grpShot[i] 0 3 180 0 addAnimMove grpShot[i] 1 20 -600 0 addAnimLocate grpShot[i] 1 1 0 -500 group grpShot[i] wk2 ; グループ指定 は重ね順にする region grpShot[i] 50 50 ; 衝突サイズ指定 は画像の1/4に wk2 + 1 endfor ; 自機(狩人) load "0at.gif" grpShip 3000 move grpShip 200 0 SPD = 10 ; 移動スピード ; 爆発エフェクト SUU_BOMB = 10 MAX_BOMB < SUU_BOMB - 1 wk2 = 4000;重ね順4000からMAX_BOMB回分爆発エフェクトを画面外(-500,0)に作成してためる for i = 0 to MAX_BOMB load "circle.gif" grpBomb[i] wk2 locateCenter grpBomb[i] -500 0 addAnimAlpha grpBomb[i] 0 3 0;あらかじめ透明度を最も薄くしつつ addAnimZoom grpBomb[i] 1 3 150 150;大きさを150%にし、(ここまでかける時間は3フレーム) addAnimAlpha grpBomb[i] 0 1 100;透明度を最も濃くしつつ addAnimZoom grpBomb[i] 0 1 100 100;大きさを元の100%にしつつ addAnimLocate grpBomb[i] 1 1 -500 0;爆発エフェクトを1フレーム表示 wk2 + 1 endfor ; 効果音読み込み loads SE_ATK loads SE_POW ; プレイ方法説明------------ msg 0 *hitコマンド、keydownコマンド等のサンプル  移動:矢印キー ショット:Zキー  終了:スペースバー . ; ゲーム毎の初期化------------ *init cntMDown = 0; 連射間隔のカウントダウン用 maxCntMDown = 3 ; 連射間隔 clear paint grpShip;狩人表示 ; 標的の動き作成------------ wkX = 200 for i = 0 to MAX_TGT clearAnim grpTarget[i] rand 1 jouge if jouge = 0 then;1/2で上からか下からか wkY = -300 else wkY = 300 endif locateCenter grpTarget[i] wkX wkY;wkX=200、狩人初期位置と同じ wkYは画面上からか下からか rand 200 wkY2 wkY2 - 100 ; -100〜100で if jouge = 0 then wkTime < ( wkY2 - wkY ) / 10;上からなら else wkTime < ( wkY - wkY2 ) / 10;下からなら endif wkWait < i * 10 addAnimLocate grpTarget[i] 1 wkWait wkX wkY;10フレームおきに標的をスタートさせ addAnimLocate grpTarget[i] 1 wkTime wkX wkY2;wkTime時間かけて画面中央へ addAnimRotateLoop grpTarget[i] 1 20 60 jouge;20フレームで60度右回りか左回り回転後、 addAnimCruise grpTarget[i] 1 40 20;40フレームをスピード20で同じ角度のまま移動後 addAnimLocate grpTarget[i] 1 1 0 -600;画面外(0,-600)へ移動 wkX - 50 paint grpTarget[i] startAnim grpTarget[i] endfor music B16_079 ; メインループ(はじまり)------------ *loop gosub isOkFire; 発射可能か(ret=0,1) if ret > 0 then; 発射可能(ret=1)なら gosub lblFire; 発射 endif gosub idou; 狩人の上下移動 gosub ckAtari; 当たり判定 weight 1;経過時間待ち keydown 32 isDown ;キー32(スペースキー)が押されているかいないか if isDown = 0 goto loop;キー32がおされてなければメインループくりかえし、 ;押されていれば音楽止めて「もう一度」か「リロード」か ; メインループ(おわり)------------ stopm menu flgMode もう1度 リロード endmenu if flgMode < 1 goto init;「もう一度」選択ならゲーム毎の初期化 end;「リロード」選択ならゲーム終了 ; 当たり判定 ------------------------------------------------------------------------------------------ *ckAtari for j = 0 to MAX_SHOT ; 全てのショット hit grpShot[j] wk 1000 1999 ; grpShot[j]に衝突しているグループ1000〜1999までの画像(標的)をチェック if wk >= 0 then ; 衝突している場合、その画像(標的)のグループが戻り値。衝突していなければ-1 msg 当たり! group=$wk$ . sound SE_POW;当たった音を鳴らして ; 消滅アニメ getGrpPos # arg0 arg1 ; ※hitの結果の画像(標的)の識別名が#に gosub effectBomb; 指定位置に爆発エフェクト(引数:arg0=x、arg1=y) ; 標的を消す stopAnim # locateCenter # 0 -600 ; 爆発エフェクトを画面外へ移動 ; ショットを消す stopAnim grpShot[j] locateCenter grpShot[j] 0 -500 ; ショットの画像を画面外へ移動 endif endfor return ; 自機(狩人)の移動 ------------------------------------------------------------------------------------------ *idou getGrpPos grpShip x y;狩人の位置取得 keydown 38 isDown if isDown > 0 then;キー38↑が押されていれば y - SPD;上へ移動 if y < -200 then y = -200;上辺以上は移動できない endif endif keydown 40 isDown;キー40↓が押されていれば if isDown > 0 then y + SPD;下へ移動 if y > 200 then;下辺以下は移動できない y = 200 endif endif keydown 37 isDown;キー37←が押されていれば if isDown > 0 then x - SPD;左へ移動 if x < -300 then;左辺以下は移動できない x = -300 endif endif keydown 39 isDown;キー39→が押されていれば if isDown > 0 then x + SPD;右へ移動 if x > 300 then;右辺以上は移動できない x = 300 endif endif locateCenter grpShip x y;狩人の移動 return ; 発射可能か(ret=0,1) ------------------------------------------------------------------------------------------ *isOkFire;zキーを押し連射間隔3経過したら発射される ret = 0;発射不可の初期設定に keydown 90 isDown ; Zキー if isDown > 0 then;Zキーが押されていれば cntMDown - 1;連射間隔のカウントダウンをひとつ減らす if cntMDown < 0 then;カウントダウンがマイナス(Zキー押してる)なら ret = 1;発射可能にして cntMDown = maxCntMDown;連射間隔3をカウントダウンに入れる endif else cntMDown = 0;zキー押してなければカウントダウンを0の初期設定に endif return ; 発射 ------------------------------------------------------------------------------------------ *lblFire;ret = 1発射可能なら効果音鳴らしショットの発射の動き開始 ; 効果音 sound SE_ATK ; 狩人の位置を取得してそこへショットの位置をセット getGrpPos grpShip x y locateCenter grpShot[noShot] x y paint grpShot[noShot] ; ショットの発射の動きを開始 startAnim grpShot[noShot] if noShot = MAX_SHOT then noShot = 0 else noShot + 1 endif return ; 指定位置に爆発エフェクト(引数:arg0=x、arg1=y)------------------------------------------------------------------------------------------ *effectBomb;MAX_BOMB分爆発エフェクトを(-500,0)にためているのを順番に取り出して表示 arg2 = 0 for arg5 = 0 to MAX_BOMB;MAX_BOMB分爆発エフェクトを繰り返す getGrpPos grpBomb[arg5] arg3 arg4;爆発エフェクト画像の位置をarg3、arg4に取得 if arg3 <= -500 then;arg3=xが作成した位置でなければ arg2 = arg5;今の回数をarg2にうつして arg5 = MAX_BOMB;このifから抜ける endif endfor locateCenter grpBomb[arg2] arg0 arg1;hitの結果得られたx、yに爆発表示 paint grpBomb[arg2] startAnim grpBomb[arg2] return