まったくのプログラミング素人の筆者がC++/HSPを使用してSTG(シューティングゲーム)を作っていく過程を書くブログでしたが最近は脱線気味。プログラミング以外にも、ゲーム関連の記事、日々の戯言など。
×
[PR]上記の広告は3ヶ月以上新規記事投稿のないブログに表示されています。新しい記事を書く事で広告が消えます。
自機も動くようになったし次は弾を撃てるようにしようと思い、まず弾の画像を書いてみた。
とりあえずエスプガルーダ2の画面見ながら書きました^^;
で、これを発射させる訳ですが、仮に自機の弾を画面上に3発発射させたいとします。
すると、少なくみても弾1発につきX軸用とY軸用の変数を用意しなければならず
3発発射となると2×3で6個の変数を用意しなければなりません。
今時のSTGなど、それこそ死ぬ程弾を撃てる訳で、いちいち弾の数だけ変数を用意していては話になりません。
そこで登場してくるのが配列変数です。これはdim tx,3なんて感じで表記すれば
いちいちtx1,tx2,tx3などと変数を用意しなくても、tx(1),tx(2),tx(3)と用意してくれます。
しかも、dim tx,3の3の部分には変数を使用する事が出来るので、仮にtmx=3としてdim tx,tmx
dim ty,tmxなんて書き方をすれば、一気に変数を沢山用意出来るんです。いやー考えた人エラい。
その配列変数を使って自機弾を撃てるようにしたスプリクトがコレ↓大きい文字が今回変更した部分です。
*************************************
;初期設定
#include "CK_JOYFORCE.AS"
buffer 1 ;ウィンドウ1をバッファ画面として用意
picload "stg1.gif" ;画像をバッファに読み込み
screen 0,480,640,0,0,0;メイン画面(ウィンドウ0を480*640で用意)
px=224:py=576;自機の初期位置
tmx=10 ;自機弾の数
dim tx,tmx ;自機弾のX座標の配列変数
dim ty,tmx ;自機弾のY座標の配列変数
dim tf,tmx ;自機弾が画面にあるか無いかを調べる配列変数
color 0,0,0;色に黒を指定
boxf 0,0,480,640;画面を黒で塗りつぶす
;メインループ
*main
redraw 0;仮想画面を指定
color 0,0,0;色に黒を指定
boxf 0,0,480,640;仮想画面を黒で塗りつぶす
;自機移動処理
pk=0
ck_joystick ky,15;キーボードのチェック
if ky&1 :px-=8 :pk=64 :if px<0 :px=0;カーソルキー左(←)を押した時pxより-8を引く:画面からはみ出さないようにpxが0以下にならないようにする
if ky&4 :px+=8 :pk=128 :if px>416 :px=416
if ky&2 :py-=8 :if py<0 :py=0
if ky&8 :py+=8 :if py>576 :py=576
pos px,py;自機の座標指定
gcopy 1,pk,0,64,64;バッファ画面(ウィンドウ1)より自機画像をコピー
;自機弾発射処理
repeat tmx ;repeat〜loop間をtmx回繰り返す
if tf(cnt)=0 { ;tf(cnt)が0の時=画面に弾がない時、{}内の命令を行う
if ky&2048 { ;zキーを押した時、{}内の命令を行う
tx(cnt)=px ;tx(cnt)(弾のx座標)にpx(自機のx座標)の値を代入
ty(cnt)=py-40 ;ty(cnt)(弾のy座標)にpy(自機のy座標)より40引いた値を代入。(弾と自機が重ならないようにする為)
tf(cnt)=1 ;tf(cnt)に1を代入。つまり画面に弾があると言う事
ky=0 ;キーを一回押した時に2発弾が出たりしないようにキー入力をリセット
}
} ty(cnt)-=10 : if ty(cnt)<0 : tf(cnt)=0 ;弾を進めて画面から出たら弾を消す
if tf(cnt)=1{ ;画面に弾があるとき、{}内の命令を行う
pos tx(cnt),ty(cnt) ;自機弾の座標指定
gcopy 1,192,0,64,64 ;バッファ画面(ウィンドウ1)より自機弾画像をコピー
}
loop
redraw 1;メイン画面を更新
await 1 ;これを入れないとパソコンが固まる
goto *main;*mainに戻る
*************************************
hsp3,0使用 画像は上の画像を使用 CK_JOYFORCE.DLL使用
弾発射部分について間単に説明すると、まず画面上に弾があるかないかを弾のかずだけ判断して
弾がない時は、キー入力のチェックをする。キーが押されていれば弾の座標を決めて
画面に弾がある事を宣言し、弾を10ドット進める。この時弾が画面の一番上まできてたら(tyが0以下になったら)
弾の存在を消す(tf=0にする)
また、画面に弾がある時は座標決定などを飛ばして弾を進める。
これらの作業を弾一個づつ分繰り返す。(今回の場合はtmxが10なので10回)
ちなみに(cnt)ってのはリピート回数が入ります。1回目なら1、10回目なら10。
いやー凄いです配列変数。こんな短い命令で簡単に弾を制御してくれてます。
コレを使えば100発だって1000発だって簡単に発射させる事が出来ますね。(tmxの数を変えればよいだけ)
例えば、この発射処理を配列変数を使わずにやろうとすると自機発射処理の部分を
10回書かなければならないって事ですのし(100発なら100回)変数も30個用意しなければならず
やってられないです。
で上記スプリクトを実行してみると・・・
無事、弾が発射されました^^
でも、このスプリクトだと連射しないんですよね・・・高橋名人ばりに自分で連射しなければならず、やってられません。
連射出来るようにしようと試みてみたんですが、どうも上手くいきませんでした。
もうちょっと調べてみよう。
それとwait命令はawait命令の方が機種依存率が低くなるみたいです。
とりあえずエスプガルーダ2の画面見ながら書きました^^;
で、これを発射させる訳ですが、仮に自機の弾を画面上に3発発射させたいとします。
すると、少なくみても弾1発につきX軸用とY軸用の変数を用意しなければならず
3発発射となると2×3で6個の変数を用意しなければなりません。
今時のSTGなど、それこそ死ぬ程弾を撃てる訳で、いちいち弾の数だけ変数を用意していては話になりません。
そこで登場してくるのが配列変数です。これはdim tx,3なんて感じで表記すれば
いちいちtx1,tx2,tx3などと変数を用意しなくても、tx(1),tx(2),tx(3)と用意してくれます。
しかも、dim tx,3の3の部分には変数を使用する事が出来るので、仮にtmx=3としてdim tx,tmx
dim ty,tmxなんて書き方をすれば、一気に変数を沢山用意出来るんです。いやー考えた人エラい。
その配列変数を使って自機弾を撃てるようにしたスプリクトがコレ↓大きい文字が今回変更した部分です。
*************************************
;初期設定
#include "CK_JOYFORCE.AS"
buffer 1 ;ウィンドウ1をバッファ画面として用意
picload "stg1.gif" ;画像をバッファに読み込み
screen 0,480,640,0,0,0;メイン画面(ウィンドウ0を480*640で用意)
px=224:py=576;自機の初期位置
tmx=10 ;自機弾の数
dim tx,tmx ;自機弾のX座標の配列変数
dim ty,tmx ;自機弾のY座標の配列変数
dim tf,tmx ;自機弾が画面にあるか無いかを調べる配列変数
color 0,0,0;色に黒を指定
boxf 0,0,480,640;画面を黒で塗りつぶす
;メインループ
*main
redraw 0;仮想画面を指定
color 0,0,0;色に黒を指定
boxf 0,0,480,640;仮想画面を黒で塗りつぶす
;自機移動処理
pk=0
ck_joystick ky,15;キーボードのチェック
if ky&1 :px-=8 :pk=64 :if px<0 :px=0;カーソルキー左(←)を押した時pxより-8を引く:画面からはみ出さないようにpxが0以下にならないようにする
if ky&4 :px+=8 :pk=128 :if px>416 :px=416
if ky&2 :py-=8 :if py<0 :py=0
if ky&8 :py+=8 :if py>576 :py=576
pos px,py;自機の座標指定
gcopy 1,pk,0,64,64;バッファ画面(ウィンドウ1)より自機画像をコピー
;自機弾発射処理
repeat tmx ;repeat〜loop間をtmx回繰り返す
if tf(cnt)=0 { ;tf(cnt)が0の時=画面に弾がない時、{}内の命令を行う
if ky&2048 { ;zキーを押した時、{}内の命令を行う
tx(cnt)=px ;tx(cnt)(弾のx座標)にpx(自機のx座標)の値を代入
ty(cnt)=py-40 ;ty(cnt)(弾のy座標)にpy(自機のy座標)より40引いた値を代入。(弾と自機が重ならないようにする為)
tf(cnt)=1 ;tf(cnt)に1を代入。つまり画面に弾があると言う事
ky=0 ;キーを一回押した時に2発弾が出たりしないようにキー入力をリセット
}
} ty(cnt)-=10 : if ty(cnt)<0 : tf(cnt)=0 ;弾を進めて画面から出たら弾を消す
if tf(cnt)=1{ ;画面に弾があるとき、{}内の命令を行う
pos tx(cnt),ty(cnt) ;自機弾の座標指定
gcopy 1,192,0,64,64 ;バッファ画面(ウィンドウ1)より自機弾画像をコピー
}
loop
redraw 1;メイン画面を更新
await 1 ;これを入れないとパソコンが固まる
goto *main;*mainに戻る
*************************************
hsp3,0使用 画像は上の画像を使用 CK_JOYFORCE.DLL使用
弾発射部分について間単に説明すると、まず画面上に弾があるかないかを弾のかずだけ判断して
弾がない時は、キー入力のチェックをする。キーが押されていれば弾の座標を決めて
画面に弾がある事を宣言し、弾を10ドット進める。この時弾が画面の一番上まできてたら(tyが0以下になったら)
弾の存在を消す(tf=0にする)
また、画面に弾がある時は座標決定などを飛ばして弾を進める。
これらの作業を弾一個づつ分繰り返す。(今回の場合はtmxが10なので10回)
ちなみに(cnt)ってのはリピート回数が入ります。1回目なら1、10回目なら10。
いやー凄いです配列変数。こんな短い命令で簡単に弾を制御してくれてます。
コレを使えば100発だって1000発だって簡単に発射させる事が出来ますね。(tmxの数を変えればよいだけ)
例えば、この発射処理を配列変数を使わずにやろうとすると自機発射処理の部分を
10回書かなければならないって事ですのし(100発なら100回)変数も30個用意しなければならず
やってられないです。
で上記スプリクトを実行してみると・・・
無事、弾が発射されました^^
でも、このスプリクトだと連射しないんですよね・・・高橋名人ばりに自分で連射しなければならず、やってられません。
連射出来るようにしようと試みてみたんですが、どうも上手くいきませんでした。
もうちょっと調べてみよう。
それとwait命令はawait命令の方が機種依存率が低くなるみたいです。
PR
この記事にコメントする
カレンダー
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 |
リンク
カテゴリー
最新記事
(04/04)
(12/26)
(12/25)
(11/17)
(10/11)
プロフィール
HN:
kt.
性別:
男性
自己紹介:
プログラミング経験は昔ファミリーベーシックでちょっとさわったくらい。
好きなSTGは、怒首領蜂大往生、エスプガルーダ(2)等の弾幕STGやら雷電シリーズなんかの非弾幕、バトルガレッガ、グラディウスシリーズ、R-TYPE等、STGなら何でも好きです。
音楽がカッコイイSTGが特に好きで、並木学氏は最高!
好きなSTGは、怒首領蜂大往生、エスプガルーダ(2)等の弾幕STGやら雷電シリーズなんかの非弾幕、バトルガレッガ、グラディウスシリーズ、R-TYPE等、STGなら何でも好きです。
音楽がカッコイイSTGが特に好きで、並木学氏は最高!
ブログ内検索
最古記事