2012年9月20日投稿 / 投稿者 : 江戸八 / タグ : 投稿プログラム ゲーム シューティングゲーム mkII専用 移植
ゲーム開始時にハイスコアの入ったMEMファイルを読みに行きます。
初回プレイ時はそんなものないので、エラーが出ますが無視してください。
ゲーム終了時(タイトルでXボタン)にMEMファイルにハイスコアを保存します。
いわゆるミサイルコマンド的なやつです。
オリジナルはトラックボールでカーソルを移動し、3つのボタンを駆使して3箇所のミサイル基地から決められた数のミサイルで上空から降り注ぐICBMを撃退するというルールでした。
が、そのまま移植してもしょうがないので(プチコンでは後追いのドジョウさんですし)、少しアレンジしました。
1)エネルギーゲージがあり、このエネルギー残量内ですべてのICBMを撃退しなくてはなりません。
2)弾を撃つには、タッチパネルで照準カーソル位置を移動すると同時に、タッチする時間を長押しすることで爆風の大きさを変える事ができます。
長くタッチすればするほど、爆発した弾の爆風範囲を大きくすることができます。
男らしくタッチパネルのみの操作感にこだわりました。
3)長押しすることで、爆風を大きくすることができるが、その分エネルギーの消費は多くなります。多用注意!。
4)オーバーヒートゲージが存在し、弾を連射すると自分台が加熱し、ゲージが増えていきます。そして、ついにはオーバーヒートし、一定時間弾を撃てなくなります。
弾を撃たずにしばらくほうっておくと温度は少しづつ下がっていきます。
5)地上には自砲台とエネルギータンクが存在し、エネルギータンクが敵ICBMによって破壊されるとエネルギーゲージがごっそりと減りましす。
ちなみに、自分で撃った爆風でもエネルギータンクはこわれます。至近距離で撃つときは要注意!。
6)エネルギーゲージがゼロになるとゲームオーバー。
全5ステージをクリアすればミッションクリアです。
敵ICBMを高い位置で撃ち落とすほど高得点です。
また、ステージクリア時の破壊されていないエネルギータンク数×50点、エネルギー残量×10点がボーナスとして加算されます。
敵ICBMの管理に線形リストを使おうかと思ったのですが、そもそも線形リストが生きてくるのはクラスなり、構造体なりが使えてこそ良さが生きてくるわけで、BASICだと逆に管理がめんどくさそうだな・・と。
で、SMILE-BASICにはSORT命令があったなぁ、と思い出し、実験的に使ってみました。
具体的には、ICBMの座標とか状態の入った配列配列要素番号を「使用中を管理する配列」、「未使用中を管理する配列」に保存し、SORT命令で随時ソートして管理してみよう・・という乱暴な方法です。言葉で説明するの難しいなぁ。
1)初期化
未使用管理配列[0][1][2][3][4][5]
使用中管理配列[99][99][99][99][99][99]
といったように初期化しておきます。
2)敵ICBMが新規に発生し場合、未使用配列の先頭から配列要素番号を取り出します
未使用配列[0][1][2][3][4][5]
↑これ
一番先頭に入っている値はこの時点では「0」
3)要素を取り出したら、(99)をセットします
未使用配列[99][1][2][3][4][5]
4)取り出した要素0を使って、X座標[取り出した0]、Y座標[取り出した0]、状態フラグ[取り出した0]などという感じで、新規に生成するICBMの状態管理配列を初期化します。
5)そして、使用中配列の終端に未使用から取り出した要素0をセットします
使用中配列[99][99][99][99][99][0]
↑ここ
6)最後に、未使用、使用ともにソートをかけて次回ICBMの発生にそなえます。
未使用配列[99][1][2][3][4][5] をソートすると
未使用配列[1][2][3][4][5][99] となり
使用中配列[99][99][99][99][99][0] をソートすると
使用中配列[0][99][99][99][99][99] となりますね?
7)もし、次のICBMを生成したときは、未使用の頭から取り出すから要素「1」がつかわれるわけですね。で、使用中配列のおしりに1を追加して、ソート・・この繰り返しです。
試しにこんな感じでやってみたら想像以上の速度が出たので、今回は線形リストを使わずにこの方法でやってみましたよ。SORTなかなか速いね。
内部ではなんのアルゴリズム使ってるのかしらね。
ゲーム自体は2イント(1/30)で動かしてますが、このソートよりも画面書き換え時のGCLSのがボトルネックになってるぽくて1イント(1/60)だとちょっともっさりでした。ていうか、グラフィック関係、ちょっと遅いね。
特殊な処理はこんなところかな?
ステージのイベントスクリプトの記述方法はソース見れば大体わかるかとは思いますが以下のとおりです
@STGXXX <-イベント開始ラベル RESTORE STGLST$[STAGE] DATA "イベントスクリプト" DATA ・ DATA ・ DATA ・ DATA ・ DATA "ED","0","-1","-1","-1","-1" <-イベントスクリプト終端~ RETURN <-イベント終了
これで1ステージ分のスクリプトです
☆イベント開始ラベルは定数STGMAXとDIM STGLST[STGMAX]に文字列として追加します~
DATA "WT","30","0","0","-1","-1"
↑フレーム数(30=1秒)
指定されたフレーム分、次スクリプトの実行を待ちます。
DATA "ED","0","-1","-1","-1","-1"
このデータまでが1ステージ分のスクリプトとみなされます
DATA "I0","3","RND","0","7","-1" ↑1 ↑2 ↑3 ↑4
☆出現位置、目標等完全にランダムです。 1:同時出現数 2:出現X座標(RNDにするとランダム) 3:出現Y座標(普通は0) 4:速度
DATA "I1","3","RND","0","7","999" ↑1 ↑2 ↑3 ↑4, ↑5
☆出現位置はランダムですが、エネルギータンクを狙ってきます 1:同時出現数 2:出現X座標(RNDにするとランダム) 3:出現Y座標(普通は0) 4:速度 5:目標Y座標(通常は999)
DATA "I2","3","RND","0","7","3" ↑1 ↑2 ↑3 ↑4, ↑5
☆適当な高度に達すると、指定された数のランダムタイプに分裂します 1:同時出現数 2:出現X座標(RNDにするとランダム) 3:出現Y座標(普通は0) 4:速度 5:分裂数
DATA "B","-1","-1","-1","7","-1" ↑1 ☆左右どちらかから出現し、エネルギータンクに向けてホーミングICBMを投下します
1:速度 出現高度、向きはランダムです
こうなってくるとグラフィックだけでなんかもうちょっとやってみたくなりますよね。
プチコンは仮想VRAMとかも使えるようなので、今度はそっちを試してみましょうかね。
でも、GCLSがちょっと遅いのかなぁ。まだ検証不足ですけども。
ワイヤーフレームとかでなんか作ってみたいんだけどなぁ。
どっとはらい
プチコンmkII 向けの QR コードです。
この作品に対するコメントがあれば一言どうぞ。(作品に直接関係ない質問や雑談は掲示板へ)
表示モード : [ スマホ・3DS対応表示 | クラシック表示 ]
PukiWiki 1.4.7 Copyright © 2001-2006 PukiWiki Developers Team. License is GPL. Based on "PukiWiki" 1.3 by yu-ji
ページの処理時間 : 0.147 秒 | このページの最終更新 : 2022/09/20 (火) 12:44:11 (565d) | ログイン
Copyright(C) 2011-2014 プチコンまとめWiki ◆1sxkymI8ji30