[PR]上記の広告は3ヶ月以上新規記事投稿のないブログに表示されています。新しい記事を書く事で広告が消えます。
これはフルスクリーン時の事も考えての事でした。
でも、このサイズでも処理は重めだったんですが、私はちょっと今までawaitについて勘違いしてたみたいで
await 1にすれば速度が一番速いんだと思ってたんですが、そうではなくてawait 1だと速度が速すぎてパソコンに負荷がかかり
過ぎていて、処理落ちしてたみたい。
このawaitを16にして(await 16でFPS60と同等らしい)自機や、敵などの速度を設定すると、かなーり処理が軽くなった!
んで画面サイズなんですが、フルスクリーン時は640×480にするので、今作っているサイズも640×480で作らないといけない
事に気づきました(汗)
今のままだと、フルスクリーンにした時に左端によってしまうんですよね・・・
なので、640×480の中心に320×480の画面を作る事にしました。
ただ、こうしてしまうと画面左右に消えていっていた敵や弾などが消えずに見えてしまうので画面の黒い部分をboxfで
上から黒く塗りつぶすようにしてみました。他にも方法があるんでしょうが思いつきません^^;
現在はこんな感じ↓
簡単なボムを追加してみた。ボムは半透明処理にしてみました。gmode 4,320,480,200みたいな感じで出来ます^^
先日書いた当り判定のスプリクトは、自機対敵とか自機対敵弾などの個数対複数でした。
この場合は1個のキャラに対して複数の判定を行なえば良いので、スプリクトも簡単ですみます。
しかし、自機の弾と敵となると複数対複数となるので、ちょっと複雑な事をしなければなりません。
個数対複数の場合は配列変数を使用して判定しますが、複数対複数の場合は配列変数の中で配列変数を使用して
二重ループさせて判定を行います。
例えば敵1の当り判定を弾の数だけ判定してループし、敵2の当り判定を弾の数だけ判定してループ・・・と言う処理を敵の数だけ行います。
それを踏まえて、今までのスプリクトを合体させたスプリクトがコチラ↓
自機弾と敵との当り判定(複数同士の当り判定)スクリプトのダウンロード
*************************************
;初期設定
#include "CK_JOYFORCE.AS"
*start
buffer 1 ;ウィンドウ1をバッファ画面として用意
picload "stg6.gif";画像をバッファ1に読み込み
buffer 2 ; 背景とスクロールの設定
picload "s398.gif" ;背景画像をバッファ2に読み込み
ssp=449 ;スクロール速度
wxs=320 :wys=448 ;メイン画面の座標指定
screen 0,wxs,wys,0,0,0;メイン画面(ウィンドウ0を320*448で用意)
gtime=0 ;ゲームの経過時間
px=144:py=400;自機の初期位置
tmx=10 ;自機弾の数
dim tx,tmx ;自機弾のX座標の配列変数
dim ty,tmx ;自機弾のY座標の配列変数
dim tf,tmx ;自機弾が画面にあるか無いかを調べる配列変数
emx=50;敵の数
dim ex,emx : dim ey,emx;敵の初期位置
dim dx,emx : dim dy,emx;敵の移動量
dim ef,emx;敵のフラグ
dim em,emx;敵の種類
dim et,emx;敵出現からの時間
emt=50;敵の弾
dim etx,emt : dim ety,emt ;敵弾の位置、移動量
dim etxv,emt ; etxv 敵弾x方向運動量
dim etyv,emt ; etyv 敵弾y方向運動量
dim etf,emt;敵弾のフラグ
sc=0 ; スコア
gend=0 ;ゲームオーバーの判断(0はゲームオーバーではない)
;■ 平方根の準備(自機狙い弾の為の準備)
dim calc,500 ;平方根の為の配列変数
repeat 500 ;500回繰り返す。
temp=cnt : calc(cnt)=temp*temp ;calc(cnt)にtempの2乗の値を入れておく
loop
*main
redraw 0 ;仮想画面を指定
color 0,0,0 ;色に黒を指定
boxf 0,0,wxs,wys ;仮想画面を黒で塗りつぶす
;スクロール処理
gmode 1 ; ノーマルコピーモード
scr=(scr+ssp)\wys ; コピー元座標を算出
pos 0,scr :gcopy 2,0,0,wxs,wys-scr ;
if scr!0 { pos 0,0 ; 背景画像をコピー
gcopy 2,0,wys-scr,wxs,scr ;
} ;
;面データ読み込み
gosub *men ;*men(タイムテーブル)へ移動
;自機移動処理
pk=0 ;自機の傾きの為の変数
ck_joystick ky,15;キーボードのチェック
if ky&1 :px-=2 :pk=32 :if px<0 :px=0;カーソルキー左(←)を押した時pxより-2を引く:画面からはみ出さないように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)より自機画像をコピー
;自機弾発射処理
shottime-- ;連射為の処理
ck_joystick ky,2048 ;Zキーのチェック
if ky&2048 : if shottime<0: st=1 ;Zキーが押されていて、かつshottimeが0以下の時、stに1を代入
repeat tmx ;repeat~loop間をtmx回繰り返す
if tf(cnt)=0 : if st=1{ ;tf(cnt)が0の時=画面に弾がない時、かつstが1の時(Zキーを押している時){}内の命令を行う
tx(cnt)=px ;tx(cnt)(弾のx座標)にpx(自機のx座標)の値を代入
ty(cnt)=py-20 ;ty(cnt)(弾のy座標)にpy(自機のy座標)より40引いた値を代入。(弾と自機が重ならないようにする為)
tf(cnt)=1 ;tf(cnt)に1を代入。つまり画面に弾があると言う事
st=0 ;連射の為の処理
shottime=3 ;連射の為の処理
}
ty(cnt)-=10 : if ty(cnt)<-32 : tf(cnt)=0 :ty(cnt)=-32: st=0;弾を進めて画面から出たら弾を消す
if tf(cnt)=1{ ;画面に弾があるとき、{}内の命令を行う
pos tx(cnt),ty(cnt) ;自機弾の座標指定
gcopy 1,96,0,32,32 ;バッファ画面(ウィンドウ1)より自機弾画像をコピー
}
loop
;敵移動処理
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へ移動
if enm(cnt)=2 : gosub *em02
loop
;敵弾発射処理
repeat emt ;repeat~loop間をemt回繰り返す
if etf(cnt)=1 { ;etf(cnt)が1(敵弾が画面にあるなら){}内の命令を行う
etx(cnt)=etx(cnt)+etxv(cnt) ;敵弾x座標に敵弾移動速度をプラス
ety(cnt)=ety(cnt)+etyv(cnt) ;敵弾y座標に敵弾移動速度をプラス
pos etx(cnt),ety(cnt) ;敵弾の座標指定
gcopy 1,96,40,8,8 ;バッファ画面(ウィンドウ1)より敵弾画像をコピー
if etx(cnt)>320 : etf(cnt)=0 ;敵弾x座標が320以上になったら弾の存在を消す
if etx(cnt)<0 : etf(cnt)=0
if ety(cnt)>448 : etf(cnt)=0
if ety(cnt)<0 : etf(cnt)=0
}
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) { ;自機と敵のx軸とy軸の差を求めどちらも16以下なら{}内の命令を行う
gend=1 ;ゲームオーバー処理
}
loop
;自機弾当り判定
repeat emx ;repeat~loop間をemx回繰り返す
if ef(cnt)=0 : continue ;ef(cnt)が0(敵が画面にいない)ならばrepeatに戻る
ent=cnt ;emxに対する配列変数をentに置き換える
repeat tmx ;repeat~loop間をtmx回繰り返す
if tf(cnt)<1 : continue ;tf(cnt)が1以下(弾が画面にいない)ならばrepeatに戻る
if (abs(tx(cnt)-ex(ent))<16)&(abs(ty(cnt)-ey(ent))<16) { ;自機弾と敵のx軸とy軸の座標差を求め(敵と自機弾全て)、どちらも16以下であれば{}}内の命令を行う
tf(cnt)=0 ;弾が当った時は弾の存在を消す
ef(ent)=0 ;弾が当った時は敵の存在を消す
sc+100 ;スコア処理
gosub *bomb }
loop
loop
if bmc>0 { ;bmc(爆発の為の変数)が0以上の時{}内の命令を行う
bmc- : pos bmx,bmy ;bmcより1を引き、bmx,bmyに座標を指定
gcopy 1,128+48*(16-bmc),0,48,48 ;バッファ画面(ウィンドウ1)より爆発画像をコピー
}
;スコア表示
pos 0,0 ;0,0に座標を指定
color 255,255,255 ;色に白を選択
mes"SCORE-"+sc+"-" ;スコア表示
if gend=1 : gosub *gameover ;gendが1(ゲームオーバーの時)*gameoverに移動
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=150 : bx=0 : by=-32 : gosub *eb02
if gtime=151 : bx=287 : by=-32 : gosub *eb02
if gtime=171 : bx=0 : by=-32 : gosub *eb02
if gtime=172 : bx=287 : by=-32 : gosub *eb02
if gtime=191 : bx=0 : by=-32 : gosub *eb02
if gtime=192 : bx=287 : by=-32 : gosub *eb02
if gtime=211 : bx=0 : by=-32 : gosub *eb02
if gtime=212 : bx=287 : by=-32 : gosub *eb02
if gtime=231 : bx=0 : by=-32 : gosub *eb02
if gtime=232 : bx=287 : by=-32 : gosub *eb02
if gtime=250 : bx=0 : by=-32 : gosub *eb02
if gtime=251 : bx=287 : by=-32 : gosub *eb02
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
*eb02
repeat emx
if ef(cnt)>0 : continue
enm(cnt)=2 ;敵の名前
ef(cnt)=1 ;敵の有無(1=有)
ex(cnt)=bx : ey(cnt)=by ;敵生成位置決定
dx(cnt)=2 : dy(cnt)=1 ;移動方向
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座標)の値が160以下(画面より左側)なら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)<-32 : ef(cnt)=0
pos ex(cnt),ey(cnt) : gmode 2 : gcopy 1,ek,32,32,32 ;敵1の表示
;敵弾発生処理
sx=px-ex(cnt) ;自機と敵とのx軸の差
sy=py-ey(cnt) ;自機と敵とのy軸の差
txv=sx : tyv=sy ;txv,tyvにそれぞれ代入
if sx<0 : sx=0-sx ;sxの絶対値の計算
if sy<0 : sy=0-sy ;syの絶対値の計算
su=sx : if su<sy : su=sy ;suにsxかsyのどちらか大きいほうを代入
;suは自機と敵との大体の距離となる
if su>180 { ;suが180以上の場合if{}内の命令を行う
if ef(cnt)=1 { ;efが1(敵が画面にいる時)の場合if{}内の命令を行う
if etf(cnt)=0 : if enm(cnt)=1 { ;etfが0(敵弾が画面に無い時)、emn(cnt)が1(敵の名前が1の時)の場合if{}内の命令を行う
etx(cnt)=ex(cnt)+12 : ety(cnt)=ey(cnt)+28 ;etx(cnt)にex(cnt)+12を代入。ety(cnt)にey(cnt)+28を代入(弾の初期座標なので、ちょっとずらさないと敵と重なって発射されてしまう)
etf(cnt)=1: etxv(cnt)=0 : etyv(cnt)=3 ;etf(cnt)を1に(敵弾が存在する)、etxv(cnt)を0に(敵弾のX軸移動量)、etyv(cnt)を3に(敵弾のY軸移動量)
}
}
}
;敵弾当り判定
repeat emt ;repeat~loop間をemt回繰り返す
ddx=(etx(cnt)+4)-(px+16) ;敵弾と自機の中心x座標の差
ddy=(ety(cnt)+4)-(py+16) ;敵弾と自機の中心y座標の差
if (abs(ddx)<5)&(abs(ddy)<5) { ;x軸とy軸の絶対値の差が5以下なら{}内の命令を行う
gend=1 ;ゲームオーバー処理
}
loop
return
*em02
ex(cnt)=ex(cnt)+dx(cnt) ;敵の移動量決定
if(ex(cnt)<1)|(ex(cnt)>287) :dx(cnt)=-dx(cnt) ;画面の端まで行ったら反転させる
if ey(cnt)=300 : dy(cnt)=-3
ey(cnt)=ey(cnt)+dy(cnt) ;敵の移動量決定
if ey(cnt)>448 : ef(cnt)=0 ;画面から消えたら敵の存在を無しにする
if ey(cnt)<-65 : ef(cnt)=0
pos ex(cnt),ey(cnt) : gmode 2 : gcopy 1,0,64,32,32 ;敵2の表示
;敵弾移動速度&方向決定
dxh=px-ex(cnt) : mx=dxh : if dxh<0 : dxh=0-dxh ;dxhの絶対値の計算
dyh=py-ey(cnt) : my=dyh : if dyh<0 : dyh=0-dyh ;dyhの絶対値の計算
dst=(dxh*dxh)+(dyh*dyh) ;平方根計算の為の変数dst
repeat 500
if dst<calc(cnt) : dst=cnt : break ;dstと最初に用意した変数calc(cnt)とを比べて、calc(cnt)がdstよりも大きくなった時dstにその数(自機と敵との距離)を代入
loop
;敵弾発生処理
sx=px-ex(cnt) ;自機と敵とのx軸の差
sy=py-ey(cnt) ;自機と敵とのy軸の差
txv=sx : tyv=sy ;txv,tyvにそれぞれ代入
if sx<0 : sx=0-sx ;sxの絶対値の計算
if sy<0 : sy=0-sy ;syの絶対値の計算
su=sx : if su<sy : su=sy ;suにsxかsyのどちらか大きいほうを代入
;suは自機と敵との大体の距離となる
if su>180 { ;suが180以上の場合if{}内の命令を行う
if ef(cnt)=1 { ;ef(cnt)が1(敵が画面にいる時){}内の命令を行う
if etf(cnt)=0 : if enm(cnt)=2 { ;etf(cnt)が0(画面に敵弾が無い)enm(cnt)が2(敵の名前が2の時){}内の命令を行う
etf(cnt)=1 ;画面に敵弾が存在する
etx(cnt)=ex(cnt)+12 : ety(cnt)=ey(cnt)+28 ;敵弾の初期座標指定。少しずらしておかないと敵と重なって発射される為
ds=4 ;敵弾の速度
etxv(cnt)=mx*ds/dst ;敵弾のx軸の移動量計算
etyv(cnt)=my*ds/dst ;敵弾のy軸の移動量計算
}
}
}
;敵弾当り判定
repeat emt
ddx=(etx(cnt)+4)-(px+16) : if ddx<0 : ddx=-ddx
ddy=(ety(cnt)+4)-(py+16) : if ddy<0 : ddy=-ddy
if (abs(ddx<5))&(abs(ddy<5)) {
gend=1
}
loop
return
*bomb
bmx=ex(ent)-8 : bmy=ey(ent)-8 ;爆発の画像の座標指定
bmc=17 ;爆発アニメの為の変数
return
*gameover
color 255,255,0 ;色に黄色を指定
pos 125,228 ;座標指定
mes "Game Over" ;Game Overを画面に表示
pos 85,248
mes"Press X to Continue"
redraw 1 ;画面を更新する
gosub *pse
goto *start
*pse
wait 1
ck_joystick ky
if ky=4096 :return ;xキーが押されたら戻る
goto *pse
*************************************
hsp3.0使用 CK_JOYFORCE.dll使用
しかし長いな・・・もっと短縮出来るんでしょうが今の私の技術では無理です。
とりあえずゲームっぽくしてみました。スコア表示、ゲームオーバー表示、リスタート処理も追加してます。
このスプリクトで複数同士の当り判定をしている部分が
*************************************
repeat emx ;repeat〜loop間をemx回繰り返す
if ef(cnt)=0 : continue ;ef(cnt)が0(敵が画面にいない)ならばrepeatに戻る
ent=cnt ;emxに対する配列変数をentに置き換える
repeat tmx ;repeat〜loop間をtmx回繰り返す
if tf(cnt)<1 : continue ;tf(cnt)が1以下(弾が画面にいない)ならばrepeatに戻る
if (abs(tx(cnt)-ex(ent))<16)&(abs(ty(cnt)-ey(ent))<16) { ;自機弾と敵のx軸とy軸の座標差を求め(敵と自機弾全て)、どちらも16以下であれば{}}内の命令を行う
tf(cnt)=0 ;弾が当った時は弾の存在を消す
ef(ent)=0 ;弾が当った時は敵の存在を消す
sc+100 ;スコア処理
gosub *bomb }
loop
loop
*************************************
この部分なのですが、まず敵の数だけループして、そのループの中で自機弾の数だけループしています。
ここで注意しなければならないのが、自機弾のループの中で使用できる配列変数(cnt)は1種類だけと言う事です。
つまり、(cnt)のままでは敵の配列変数としては使用出来ないんですね。
なので、自機弾のループに入る前にent=cntとしています。敵の配列変数用の変数を用意するって事ですね。
って、まるで自分が考えたように書いてますが、殆ど遊々窓々さんのHSP講座の受け売りです(汗)
ただ、私もコレを理解するのに相当時間が掛かったので、文章で読んで理解するよりもスプリクトを動かしながら理解した方が
解りやすいと思います。
ちなみに上記スプリクトを実行するとこんな感じです↓
ちょっとシューティングゲームっぽくなってきましたが、処理が重いです。
こんなんで弾幕ゲーなんか作れるんだろうか心配です・・・
if (abs(px-ex(cnt))<16)&(abs(py-ey(cnt))<16)なのですが、このスプリクトだと同じ大きさのキャラクタの場合は
問題ないのですが、大きさの違う物同士の場合にこのスプリクトを使うと当り判定が真中にこなくて、おかしな事になってしまいます。
ちなみにabsと言う命令は絶対値を求める為に使用してます。(絶対値を求めないと当り判定に使えないので)
でどうするかと言うと、例えば
こんな感じの当り判定を行うとして
自機が32×32、弾が8×8だとすると、まずお互いのキャラクターのx軸とy軸の真中の座標から差を求めます。
その求めた差と一定数で当り判定をすれば、自分の好きな所に判定を持ってくる事が出来るようになるんです。
弾をetx,ety、自機をpx,py、中心座標の差をddx,ddyとすると
ddx=(etx(cnt)+4)-(px+16)
ddy=(ety(cnt)+4)-(py+16)
if (abs(ddx)<10)&(abs(ddy)<10)
こんな感じのスプリクトで、大きさの違う物同士でも真中に当り判定を持ってくる事が出来ますね^^
敵と自機のx軸とy軸の差を求めて、x軸y軸共に一定数以下になったら当りにします。
例えば自機、敵とも32×32ドットとして
この場合、y軸の差は32以下ですが、x軸は32以上なので当っていません。
この場合だと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使用 画像は下の画像を使用
処理としては、自機は1機ですが敵は数機いるので、自機に対し敵の数だけ当り判定を毎ループ行っています。
当った時はゲームオーバーの文字を表示させてみました。
実行するとこんな感じ↓
スプリクトの46行目の
if (abs(px-ex(cnt))<16)&(abs(py-ey(cnt))<16)の16の数字を小さくすれば当り判定は小さくなり
大きくすれば、判定は大きくなります。当り判定はゲームバランスを考える上でとても重要なのでじっくり考えたいですね。
ところで、最近敵のアルゴリズムを考えているのですが、敵の撃つ弾で悩んでます。やっぱり弾幕を撃たせたいので
試行錯誤してるんですが、これがまた上手く動かないんですよね。一つの敵が2〜3種類の弾を撃って欲しいのですが
変なとこから弾を撃ったりして全然駄目です。そして、画面サイズを小さくしたにもかかわらず処理も重めです。難しいな〜
今の所こんな感じ↓
大きい敵を作ってみました。
ですが、前に見たMIA's HOMEPAGEさんで非常に良いソフトを見つけてしまいました。
発色弾と言うソフトなのですが、使い方が非常にわかりやすくてボタン一つで爆発エフェクトが作れてしまう優れ物。
コレを使わせてもらって、爆発エフェクトを作る事にしました。
発色弾を起動させると・・・
こんな感じなのですが、とりあえず爆炎生成ってボタンを押せば、もう爆発エフェクトが完成してしまう。
もっと凝ろうと思えば、色んなパラメータをいじって作っていけばOKだし、なにより感覚で使えてしまうのが素敵です^^
んで、試しに爆発エフェクトを作ってみたのがコレ↓
ものの5分で出来てしまいました(汗)
| 02 | 2026/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 |
好きなSTGは、怒首領蜂大往生、エスプガルーダ(2)等の弾幕STGやら雷電シリーズなんかの非弾幕、バトルガレッガ、グラディウスシリーズ、R-TYPE等、STGなら何でも好きです。
音楽がカッコイイSTGが特に好きで、並木学氏は最高!