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

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

先日の続きから自機弾と敵弾と敵爆破処理を追加して、敵と自機
敵弾と自機、自機弾と敵の当たり判定を追加してみました。

自機弾20、敵100、敵弾200で作ってみたのですが、HSP上では余裕でFPS60
で動いてくれるのですが、XCode上で動かすとFPS40くらいまで下がる感じ。

上手くやりくりすれば怒首領蜂程度の弾幕STGなら作れそうかなーと言った感じ?
虫姫さまは無理ですねw
とりあえず、ちゃんとゲームになるように作って行こうかと思ってます。

ちなみにHSPでのコードはこんな感じです↓
*************************************************************************************
#include "hsp3dish.as"
#cmpopt varname 1
x1=0:y1=0 ; 画面左上の座標
x2=320:y2=480 ; 画面右下の座標
screen 0,x2,y2
title "TSTG7"
;cls 4
*gstart
celload "jiki01.png",1
celload "teki00.png",2
celload "haikei03.png",3
celload "jikitama02.png",4
celload "bakuha01.png",5
celdiv 5,64,64
celload "tama14.png",6
px=0
py=0
pt=100
tmx=20 ;自機弾の数 
dim tx,tmx ;自機弾のX座標の配列変数
dim ty,tmx ;自機弾のY座標の配列変数 
dim tf,tmx ;自機弾が画面にあるか無いかを調べる配列変数
emx=100;敵の数
dim ex,emx : dim ey,emx;敵の初期位置
dim dx,emx : dim dy,emx;敵の移動量
dim ef,emx;敵のフラグ
dim em,emx;敵の種類
dim eba,emx;敵の爆破アニメ
dim etime,emx;敵の爆破アニメ
emt=200;敵弾の弾
  dim etx,emt : dim ety,emt ;敵弾の位置、移動量
  dim etxv,emt  ; etxv   敵弾x方向運動量
  dim etyv,emt  ; etyv   敵弾y方向運動量
  dim etf,emt;敵弾のフラグ
  dim etm,emt;敵弾の種類
gtime=0
hy=0
*main
redraw 0
gosub *haikei00
gosub *teki_bakuha
gosub *jikishot
gosub *timetb ;(タイムテーブル)へ移動
gosub *tekimove
gosub *teki_tama_move
gosub *jikimove
gosub *jikitama_teki_atarihantei
gosub *jiki_teki_atarihantei
gosub *jiki_tekitama_atarihantei
gosub *fps
redraw 1
await 16
gtime=gtime+1
goto *main
;背景表示
*haikei00
gmode 2
pos 0,hy
celput 3
pos 0,hy-480
celput 3
hy+=2
if hy>=480 {hy=0}
return
;自機弾発射処理
*jikishot
repeat tmx ;repeat?loop間をtmx回繰り返す
if tf(cnt)=0 && shottime<=0 { ;tf(cnt)が0の時=画面に弾がない時、{}内の命令を行う
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発弾が出たりしないようにキー入力をリセット
shottime=1
break
loop
repeat tmx ;repeat?loop間をtmx回繰り返す
if tf(cnt)=1{ ;画面に弾があるとき、{}内の命令を行う
pos tx(cnt),ty(cnt) ;自機弾の座標指定
celput 4 ;バッファ画面(ウィンドウ1)より自機弾画像をコピー
ty(cnt)-=10 : if ty(cnt)<-48 : tf(cnt)=0 ;弾を進めて画面から出たら弾を消す
}
loop
shottime--
return
;タイムテーブル
*timetb
bx=rnd(290) : by=-64 : gosub *eb01;gtimeが0の時、bxに0をbyに-64を代入し*eb01に移動
return
;敵移動
*tekimove
;敵移動処理
repeat emx ;repeat?loop間をemx回繰り返す
if ef(cnt)<1 : continue ;ef(cnt)が1以下(敵が画面にいない)ならばrepeatに戻る
if ef(cnt)==1 {
if enm(cnt)=1 : gosub *em01 ;enm(cnt)(敵の名前)が1ならば*em01へ移動
//if enm(cnt)=2 : gosub *em02
etime(cnt)+=1
}
loop
return
;敵弾移動
*teki_tama_move
repeat emt ;repeat?loop間をemx回繰り返す
if etf(cnt)<1 : continue ;ef(cnt)が1以下(敵が画面にいない)ならばrepeatに戻る
if etf(cnt)==1 {
if etm(cnt)=1 : gosub *etm01 ;enm(cnt)(敵の名前)が1ならば*em01へ移動
//if enm(cnt)=2 : gosub *em02
}
loop
return
;自機移動
*jikimove
px=mousex-24
py=mousey-24
pos px,py
celput 1
pos 0,0:mes mousex
pos 0.16:mes mousey
pos 0,32:mes pt
return
;自機弾と敵の当たり判定
*jikitama_teki_atarihantei
repeat emx ;repeat~loop間をemx回繰り返す
if ef(cnt)==0 : continue ;ef(cnt)が0(敵が画面にいない)ならばrepeatに戻る
ent=cnt ;emxに対する配列変数をentに置き換える
if ef(cnt)==1 {
repeat tmx ;repeat~loop間をtmx回繰り返す
if tf(cnt)<1 : continue ;tf(cnt)が1以下(弾が画面にいない)ならばrepeatに戻る
if (abs(tx(cnt)-ex(ent))<24)&(abs(ty(cnt)-ey(ent))<24)  { ;自機弾と敵のx軸とy軸の座標差を求め(敵と自機弾全て)、どちらも16以下であれば{}}内の命令を行う
tf(cnt)=0 ;弾が当った時は弾の存在を消す
ef(ent)=2 ;弾が当った時は敵の存在を消す
//sc+100 ;スコア処理
//gosub *bomb 
}
loop
}
loop
return
;自機と敵の当たり判定
*jiki_teki_atarihantei
repeat emx ;repeat~loop間をemx回繰り返す
if ef(cnt)==0 : continue ;ef(cnt)が0(敵が画面にいない)ならばrepeatに戻る
if ef(cnt)==1 {
//if tf(cnt)<1 : continue ;tf(cnt)が1以下(弾が画面にいない)ならばrepeatに戻る
if (abs(px-ex(cnt))<24)&(abs(py-ey(cnt))<24)  { ;自機弾と敵のx軸とy軸の座標差を求め(敵と自機弾全て)、どちらも16以下であれば{}}内の命令を行う
pt-=1
ef(cnt)=2 ;弾が当った時は敵の存在を消す
//sc+100 ;スコア処理
//gosub *bomb 
}
}
loop
return
;自機と敵弾の当たり判定
*jiki_tekitama_atarihantei
repeat emt ;repeat~loop間をemx回繰り返す
if etf(cnt)==0 : continue ;ef(cnt)が0(敵が画面にいない)ならばrepeatに戻る
if etf(cnt)==1 {
//if tf(cnt)<1 : continue ;tf(cnt)が1以下(弾が画面にいない)ならばrepeatに戻る
if (abs(px-etx(cnt))<24)&(abs(py-ety(cnt))<24)  { ;自機弾と敵のx軸とy軸の座標差を求め(敵と自機弾全て)、どちらも16以下であれば{}}内の命令を行う
pt-=1
etf(cnt)=0 ;弾が当った時は敵の存在を消す
//sc+100 ;スコア処理
//gosub *bomb 
}
}
loop
return
;敵爆破処理
*teki_bakuha
repeat emx ;repeat~loop間をemx回繰り返す
if ef(cnt)!=2 : continue
if ef(cnt)==2 {
pos ex(cnt)-8,ey(cnt)-8 : gmode 2 : celput 5,eba(cnt)
if gtime\2==0 : eba(cnt)+=1
if eba(cnt)>24:ef(cnt)=0
}
loop
return
;敵1発生処理
*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)=rnd(3)+1 ;移動方向
eba(cnt)=0 ;敵の爆破アニメ
etime(cnt)=0
break ;repeat?loop間のループから、強制的に抜け出す
loop
return
;敵1移動処理
*em01
ex(cnt)=ex(cnt)+dx(cnt) : ey(cnt)=ey(cnt)+dy(cnt) ;敵の移動量決定
if ey(cnt)>480 : ef(cnt)=0 ;画面から消えたら敵の存在を無しにする
pos ex(cnt),ey(cnt) : gmode 2 : celput 2 ;敵1の表示
if etime(cnt)\50==0 : gosub *etb01
return
;敵弾1発生処理
*etb01
ent=cnt
repeat emt ;repeat?loop間をemx回繰り返す
if etf(cnt)>0 : continue 
etm(cnt)=1 ;敵弾の名前
etf(cnt)=1 ;敵弾の有無(1=有)
etx(cnt)=ex(ent)
ety(cnt)=ey(ent) ;敵生成位置決定
etxv(cnt)=0
etyv(cnt)=5 ;移動方向
break ;repeat?loop間のループから、強制的に抜け出す
loop
return
;敵弾1移動処理
*etm01
etx(cnt)=etx(cnt)+etxv(cnt) : ety(cnt)=ety(cnt)+etyv(cnt) ;敵弾の移動量決定
if ety(cnt)>480 : etf(cnt)=0 ;画面から消えたら敵の存在を無しにする
pos etx(cnt),ety(cnt) : gmode 2 : celput 6 ;敵弾1の表示
return
*fps
fp++ ;フレーム数を覚えておく変数
time=gettime(6) ;timeに現在の秒数を代入
if time!=time2 { ;timeとtime2が等しくなければ{}内の命令を行う
cls 0 ;ウィンドウ内を白色でクリア
fpc=fp ;fpc(表示するFps数)にfp(現在のフレーム数)を代入
fp=0 } ;フレーム数をクリア
pos 0,460 
color 255,255,255
mes " Fps "+fpc ;フレーム数の表示
time2=time ;time2に現在の秒数を代入(1秒ごとに比べる為)
return
*************************************************************************************
PR
この記事にコメントする
お名前
タイトル
メールアドレス
URL
コメント
パスワード   Vodafone絵文字 i-mode絵文字 Ezweb絵文字
Twitter
カレンダー
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/20 kt.]
[04/19 うぇむ]
[11/24 kt.]
[11/21 NONAME]
[11/24 kt.]
プロフィール
HN:
kt.
性別:
男性
自己紹介:
プログラミング経験は昔ファミリーベーシックでちょっとさわったくらい。
好きなSTGは、怒首領蜂大往生、エスプガルーダ(2)等の弾幕STGやら雷電シリーズなんかの非弾幕、バトルガレッガ、グラディウスシリーズ、R-TYPE等、STGなら何でも好きです。
音楽がカッコイイSTGが特に好きで、並木学氏は最高!
ブログ内検索
忍者ブログ [PR]