忍者ブログ
まったくのプログラミング素人の筆者がC++/HSPを使用してSTG(シューティングゲーム)を作っていく過程を書くブログでしたが最近は脱線気味。プログラミング以外にも、ゲーム関連の記事、日々の戯言など。
×

[PR]上記の広告は3ヶ月以上新規記事投稿のないブログに表示されています。新しい記事を書く事で広告が消えます。

自機、敵ともに弾も撃てるようになり、いよいよ肝心の当り判定です。当り判定の基本的な考え方は
敵と自機のx軸とy軸の差を求めて、x軸y軸共に一定数以下になったら当りにします。

例えば自機、敵とも32×32ドットとして
atari1.jpg
この場合、y軸の差は32以下ですが、x軸は32以上なので当っていません。

atari2.jpg
この場合だとx軸の差もy軸の差も32以下になるので当っていると判断できます。

それを踏まえて試験的に作ったスプリクトがコチラ↓
*************************************
;敵と自機の当り判定スプリクト
*start
buffer 1 ;ウィンドウ1をバッファ画面として用意
picload "stg5.gif";画像をバッファ1に読み込み
wxs=320 :wys=448 ;メイン画面の座標指定
screen 0,wxs,wys,0,0,0;メイン画面(ウィンドウ0を480*640で用意)
gtime=0
px=144:py=400;自機の初期位置

emx=50;敵の数
dim ex,emx : dim ey,emx;敵の初期位置
dim dx,emx : dim dy,emx;敵の移動量
dim ef,emx;敵のフラグ
dim em,emx;敵の種類
dim et,emx;敵出現からの時間

*main
redraw 0 ;仮想画面を指定
color 0,0,0 ;色に黒を指定
boxf 0,0,wxs,wys ;仮想画面を黒で塗りつぶす

;面データ読み込み
gosub *men ;*men(タイムテーブル)へ移動

;自機移動処理
pk=0 ;自機の傾きの為の変数
stick ky,15;キーボードのチェック
if ky&1 :px-=2 :pk=32 :if px<0 :px=0;カーソルキー左(←)を押した時pxより-8を引く:画面からはみ出さないようにpxが0以下にならないようにする
if ky&4 :px+=2 :pk=64 :if px>288 :px=288
if ky&2 :py-=2 :if py<0 :py=0
if ky&8 :py+=2 :if py>416 :py=416
gmode 2 ;透明化処理の為の命令
pos px,py;自機の座標指定
gcopy 1,pk,0,32,32;バッファ画面(ウィンドウ1)より自機画像をコピー

;敵移動処理
repeat emx ;repeat〜loop間をemx回繰り返す
et(cnt)++ ;敵出現時間を+
if ef(cnt)<1 : continue ;ef(cnt)が1以下(敵が画面にいない)ならばrepeatに戻る
if enm(cnt)=1 : gosub *em01 ;enm(cnt)(敵の名前)が1ならば*em01へ移動
loop

;自機当り処理
repeat emx ;repeat〜loop間をemx回繰り返す
if ef(cnt)=0 : continue ;ef(cnt)が0(画面に敵がいない)ならばrepeatに戻る
if (abs(px-ex(cnt))<16)&(abs(py-ey(cnt))<16) { ;自機と敵との差が16ドット以下なら{}}内の命令を行う
gosub *gameover;*gameoverに行く
}
loop

redraw 1 ;メイン画面を更新
await 1 ;これを入れないとパソコンが固まる
gtime=gtime+1 ;タイムテーブルの為の変数
goto *main ;*mainに戻る

;サブルーチン
*men ;タイムテーブル
if gtime=1 : bx=0 : by=-32 : gosub *eb01;gtimeが0の時、bxに0をbyに-64を代入し*eb01に移動
if gtime=2 : bx=288 : by=-32 : gosub *eb01
if gtime=21 : bx=40 : by=-32 : gosub *eb01
if gtime=22 : bx=248 : by=-32 : gosub *eb01
if gtime=41 : bx=80 : by=-32 : gosub *eb01
if gtime=42 : bx=208 : by=-32 : gosub *eb01
if gtime=61 : bx=0 : by=-32 : gosub *eb01
if gtime=62 : bx=288 : by=-32 : gosub *eb01
if gtime=81 : bx=40 : by=-32 : gosub *eb01
if gtime=82 : bx=248 : by=-32 : gosub *eb01
if gtime=100 : bx=80 : by=-32 : gosub *eb01
if gtime=101 : bx=208 : by=-32 : gosub *eb01

if gtime=252 : gtime=0
return

*eb01
repeat emx ;repeat〜loop間をemx回繰り返す
if ef(cnt)>0 : continue ;ef(cnt)が0以上(すでに敵が画面にいる)ならばrepeatに戻る
enm(cnt)=1 ;敵の名前
ef(cnt)=1 ;敵の有無(1=有)
ex(cnt)=bx : ey(cnt)=by ;敵生成位置決定
dx(cnt)=0 : dy(cnt)=2 ;移動方向
et(cnt)=0 ;敵弾生成時間をリセット
break ;repeat〜loop間のループから、強制的に抜け出す
loop
return

*em01
ek=0 ;敵画像傾きの為の変数
if et(cnt)>150 : if ex(cnt)<160 : dx(cnt)=-2 : ek=32 ;敵生成時間が150以上になった時ex(cnt)(敵のX座標)の値が240以下(画面より左側)ならdx(cnt)(敵のx軸の移動量)に-3を代入しekに64を代入する
if et(cnt)>150 : if ex(cnt)>160 : dx(cnt)=2 : ek=64
ex(cnt)=ex(cnt)+dx(cnt) : ey(cnt)=ey(cnt)+dy(cnt) ;敵の移動量決定
if ey(cnt)>448 : ef(cnt)=0 ;画面から消えたら敵の存在を無しにする
if ex(cnt)>320 : ef(cnt)=0
if ex(cnt)<0 : ef(cnt)=0
pos ex(cnt),ey(cnt) : gmode 2 : gcopy 1,ek,32,32,32 ;敵1の表示
return

*gameover
color 255,255,255 ;色を白に指定
pos 125,228;位置指定
mes "Game Over";Game Overを表示
redraw 1;画面を更新
stop;プログラムの終了
*************************************
hsp3.0使用 画像は下の画像を使用
stg5.gif

処理としては、自機は1機ですが敵は数機いるので、自機に対し敵の数だけ当り判定を毎ループ行っています。
当った時はゲームオーバーの文字を表示させてみました。
実行するとこんな感じ↓
5101.jpg
スプリクトの46行目の
if (abs(px-ex(cnt))<16)&(abs(py-ey(cnt))<16)の16の数字を小さくすれば当り判定は小さくなり
大きくすれば、判定は大きくなります。当り判定はゲームバランスを考える上でとても重要なのでじっくり考えたいですね。

ところで、最近敵のアルゴリズムを考えているのですが、敵の撃つ弾で悩んでます。やっぱり弾幕を撃たせたいので
試行錯誤してるんですが、これがまた上手く動かないんですよね。一つの敵が2〜3種類の弾を撃って欲しいのですが
変なとこから弾を撃ったりして全然駄目です。そして、画面サイズを小さくしたにもかかわらず処理も重めです。難しいな〜
今の所こんな感じ↓
510.jpg
大きい敵を作ってみました。
PR
この記事にコメントする
お名前
タイトル
メールアドレス
URL
コメント
パスワード   Vodafone絵文字 i-mode絵文字 Ezweb絵文字
この記事へのトラックバック
この記事にトラックバックする:
Twitter
カレンダー
02 2024/03 04
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
31
最新コメント
[04/20 kt.]
[04/19 うぇむ]
[11/24 kt.]
[11/21 NONAME]
[11/24 kt.]
プロフィール
HN:
kt.
性別:
男性
自己紹介:
プログラミング経験は昔ファミリーベーシックでちょっとさわったくらい。
好きなSTGは、怒首領蜂大往生、エスプガルーダ(2)等の弾幕STGやら雷電シリーズなんかの非弾幕、バトルガレッガ、グラディウスシリーズ、R-TYPE等、STGなら何でも好きです。
音楽がカッコイイSTGが特に好きで、並木学氏は最高!
ブログ内検索
忍者ブログ [PR]