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

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

C++でのゲームの作製方法というか、どういう風に作って行けば良いのか?ってのが
良くわからないので、色々なゲーム作製解説サイトさんを読んでいっているのですが
0からのゲームプログラミングさんで知ったのがリスト構造という物で、この方法が使えると
プログラム的な無駄が無くなりそうで良いな~と思って、解説を読んでみました。

ちなみにリスト構造が使えると・・・
今までだと、敵弾を撃たせる為に配列変数を使って撃たせていたのですが
そうすると↓こんな感じで書いています。
for(i=0;i<1000;i++){
if(enemy[i].etf==0)
/*敵弾処理*/
}
この場合、弾を撃っていても撃っていなくても1000回は繰り返してしまい無駄が多いです。

でも、リスト構造という仕組みを使えば、撃っている弾の分だけの繰り返しで済むみたい
なんですよね。
で、解説を読んでみたのですが、ここで出てくるのがポインタ。
ポインタ自体の解説を本などで読んでみると、仕組みはなんとなくわかるのですが
だからなに?って感じなんですよね。イマイチ使い方というか使いどころがわからんと言うか。
でも、このリスト構造は是非とも使えるようになりたいので、もうちょっと勉強してみようと
思っています。
この仕組みが理解出来たら、タスクシステムなんかも組めそうな気もしますしね^^;

あと、ブログのタイトルをC++/HSPでSTGを作っていく blogに変更しました。 
PR
先日から作製していたC++/DXライブラリとHSP+HSPDXFIXでの動作速度検証プログラムが
何とか出来たので公開してみます。ダウンロードはコチラ↓
C++とHSPでの動作速度検証プログラム(右クリック→対象をファイルに保存で保存して下さい)
一応、両方のソースファイルも入っていますが、とっても汚いです^^;

プログラムとしては背景を2重スクロールさせて、ボスと自機を表示し、敵弾を撃たせて
自機と敵弾の当たり判定を行っています。
敵弾最大数は10000発としました。
A⇔Zキーで敵弾発射間隔を変更出来ます。
S⇔Xキーで敵弾速度を変更出来ます。
どちらのプログラムもなるべく同じような(プログラム的な)動作になるように作製したつもりです。
間違ってるかもしれませんが(汗)
何か不具合があったら嫌なので、ウインドウモードで動くようにしています。

で、家にあったパソコンで早速動かしてみました。
***1台目***
スペックは
Core 2 Duo T7250
メモリ2GB
GeForce 8600MGT 256MB
windows XP

C++/DXライブラリ時
s-c2d2.jpg
敵弾10000発撃たせてもFPS60キープ

HSP+HSPDXFIX時
s-c2d1.jpg
敵弾10000発撃たせるとFPS14まで低下


***2台目***
スペック
セレロン2.8G
メモリ384MB
mobility radeon 9000/9100 IGP 128MB
windows XP

C++/DXライブラリ時
s-cel282.jpg
敵弾10000発撃たせるとFPS39程度

HSP+HSPDXFIX時
s-cel281.jpg
敵弾10000発撃たせるとFPS9程度。かなりしんどそう。


***3台目***
スペック
Mobile Pentium4-M 1.7G
メモリ512MB
Mobility Radeon 16MB
windows 2000

C++/DXライブラリ時
s-p172.jpg
敵弾10000発撃たせるとFPS15程度。

HSP+HSPDXFIX時
s-p171.jpg
敵弾10000発撃たせるとFPS8程度。コマ送りみたいな感じです。
といった結果になりました。

この検証プログラムが正しいとすると、私の思っていた以上にC++/DXライブラリの方が
動作速度が速そうです。
と言う事で、次回作はC++で作製して行こうかと思っているのですが、技術的に全然なので
まずはこのプログラムを膨らましていく感じで、ミニゲーム的な物を作ってみようかと思っています。
とりあえずの目標は、各々の動きを関数にして読み込めるようにして
分割コンパイル出来るようにしてみます。
先日から作製している動作速度検証プログラムですが、後は当たり判定を入れればOKかな?
と思ってるのですが、先にHSP+HSPDXFIXで同じようなプログラムを作ってみました。
s-WS000151.jpg
こちらも10フレームに1回、62発の弾を撃っています。
HSPDXFIXの場合は画像コピー系の命令を使うと何故か動作が重くなってしまうので
画像表示は全てスプライトで表示しています。

で、同じように試しで10000発撃たせてみたら・・・
s-WS000152.jpg
FPS48。やはり、ちょっと動作が重くなってしまいました。
とりあえず、コチラにも当たり判定処理を入れてから、C++と動作速度比較を出来るようにして
公開してみようかと思ってるのですが、どうやって比較すれば良いかなぁ?と考え中です。
やっぱり、敵弾発射総数を変更出来るようにしてFPSの落ち具合を見れるようなのが良いかな?
と思ってるのですが・・・
先日悩んでいた敵弾処理ですが、何とか上手く出来ました^^
s-WS000147.jpg
この画像の場合だと10フレームに1回、62発の弾を発射しています。
そもそも、私は=演算子と==演算子を同じ物だと思って考えいたので、それが原因で
おかしな事になっていたようです。
=は代入で、==は演算なんですよね。
それを==と書かなければならない所を=と書いてしまうと、自分の思ったような動きに
なってくれなかったんです。
で、その部分を直したら上手く動いてくれました^^
先日書いた部分を↓こんな感じに変更しています。
if(gtime%10 == 0){
for(i=0;i<ENEMY_TAMA_MAX;i++){//敵弾初期化
if(enemy[i].etf==0) {
eh++;
enemy[i].etf=1;
enemy[i].etx=bossx+175;
enemy[i].ety=bossy+120;
r+=0.1;
enemy[i].etmx=cos(r)*ds;
enemy[i].etmy=sin(r)*ds;
if(eh>=63){
 eh=0;
 break;
}
}
}
}
まだ、何か間違ってるかもしれませんが、とりあえず動いているので良しとしています^^;
次は弾と自機との当たり判定を入れようと思っています。

ちなみに敵弾最大数を10000発とかにしてみたのですがFPS60で動いてくれて良い感じです。
s-WS000148.jpg
当たり判定を入れたら、どうなるかはわかりませんが^^;

以前作った弾幕のサンプルを参考にして敵弾を撃たせてみたのですが・・・
s-WS000146.jpg
敵弾を撃たす事は何とか出来たのですが、任意の間隔でn発撃たすって処理が上手く
出来ないんですよね・・・

こんな感じで、敵弾発生処理を書いているのですが↓
double ds=2.;//弾の速さ
for(i=0;i<ENEMY_TAMA_MAX;i++){//敵弾初期化
if(enemy[i].etf>0) continue;
eh++;
enemy[i].etf=1;
enemy[i].etx=bossx+175;
enemy[i].ety=bossy+120;
r+=0.1;
enemy[i].etmx=cos(r)*ds;
enemy[i].etmy=sin(r)*ds;
if(eh>62){
eh=0;
break;
}
}
毎ループでこの処理を行ってしまうので、ずっと撃ち続けてしまうんですよ。
一定の間隔で撃たせるカウンタみたいなのを導入すれば良いかと思って色々と試して
るのですが、なかなか上手く出来ません^^;

Twitter
カレンダー
07 2026/08 09
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]