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

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

先日購入したやさしいC++を読んでクラスを使った簡単なプログラムを作ってみました。
4902af5d.jpg
プロジェクトファイルはコチラ↓
http://blog.cnobi.jp/v1/blog/user/63629cf35d5259ece1529ed13f0745b1/1307030460
(自機と自機弾と敵が動くだけです。当たり判定は行っていません)

そもそも、なんでクラスの概念を勉強しようかと思ったかというと、プログラムが肥大化するにつれて
何をどこに書いたのか?ってのが非常にわかりにくくなってくるんですよね。(私の書き方がまずい
ってのもあると思いますが^^;)
あの処理は何処に書いたっけ?とアッチのファイルを見たり、コッチのファイルを見たり・・・
クラスを使うと、そういうのを防ぎやすくなるのかな?と思って勉強してみようと思いました。

で、ちょっと本を読んでみると、敵や自機などのクラスに分けておけば変数や関数なども、その
クラス専用に使うような感じになるので、まとめやすくバグなんかが出た時にも原因を追求
しやすそうだなーと。
例えば↓こんなクラスを作ったとすると・・・
class jiki
{
private:
 double x;
 double y;
public:
 jiki();
 void jiki_move();
};
double x,yにはvoid jiki_move();と言う関数からしか変数の値を変更する事が出来なくなります。
もし、自機の動きにバグが出た場合、void jiki_move();関数を調べるだけでOKって事になるので
原因の追求が早いですし、自機に関する事はこのクラスに書いておけば解りやすいですよね。

って事で、とりあえず自機と敵が出てきて自機弾で敵が破壊出来るようなプログラムを作ろうと
思って制作しているのですが、当たり判定でつまずいてます。
とりあえず、自機クラスと敵クラスに分けて制作しているのですが、当たり判定を行う為には
最低でも自機の座標と敵の座標が必要です。
ところが、自機の座標にアクセスする為には自機クラス内に関数が必要ですし
敵の座標についても同じ。
でも、当たり判定の為には両方のクラスに一つの関数でアクセスする必要があります。
この方法が良く解らないんですよねぇ。。。

自機クラスと敵クラスを多重継承したクラスを作って判定すれば良いのかな?とも思うのですが
そうすると当たり判定する物が増えた場合に、その都度クラスを増やさなければならず
なんだかおかしい気がします。
かと言って、グローバル関数(そんな言い方するのか?)でクラス内の変数を参照しようとしても
private メンバ にアクセスできません。みたなエラーが出てしまいますし。
privateをpublicにすれば良いのかもしれませんが、それだとクラスの良さが失われてしまいます。
という感じで、どうしたもんかと思っているのですが、根本的に間違ってる気もするので
もうちょっと本やらネットなんかで調べてみようかと思っています。

それにしても、いつも思いますがメンバだのオブジェクトだのインスタンスだのコンストラクタだの
変なカタカナで呼ぶのやめて欲しいです。
普通に日本語で初期化とか変数とか言ってくれた方が解りやすいと思うんですがねぇ^^;
PR
クラスの概念を理解したいなーと思ってやさしいC++と言う本を買ってみました。
20110513.jpg
私が最初にC言語を覚えようと思って購入した本はC言語の解説書でした。
C言語の本なので当然C++の事については書いてなかったんですよね。
なのでクラスの事についても書いてなかったので、C++について書いてある本が欲しいなと思い
ネットなどの評判を調べてみて、この本が良いかな?と言う事で購入。

そもそも、なんでクラスの概念を理解したいと思ったかというと、プログラムが肥大化するにつれて
何をどこに書いたのか?ってのが解り難くなって来てしまって何とかならんかなーと思っていました。
で、クラスってのを使うと解りやすくなるらしい?と言う事で本でも買ってみようかと。

ザッと読んでみましたが、評判通り解りやすい例と共に解説してあって読みやすそうです。
ただ、かなり分厚い本なので全て読むのは結構骨が折れそうですが^^;
こう言う解説本って読んでいる分には理解出来るのですが、実際に自分のプログラムに
どう使うのか?って部分で悩む事が多い気がします。
関数ポインタとか概念はなんとなく解る気はするのですが、使いどころが良くわからなかったり^^;
まぁ、ボチボチ読んで行こうかと思っています。
前に円型のゲージを表示させたいと思って短い画像を回転させて表示させる方法を考えたのですが
そんな事をしなくてもDXライブラリにある関数で簡単に表示出来る事がわかりました^^;

具体的にはDrawCircleGauge関数という関数で簡単に表示できます。
とりあえず簡単なプログラムを作って試してみました↓
http://blog.cnobi.jp/v1/blog/user/63629cf35d5259ece1529ed13f0745b1/1297189571

このプログラムを動かすとこんな感じ
s-WS000910.jpg
回転するように徐々に表示されて、正にゲージやメーターって感じです。
なんでこの関数に気付かなかったかと言うとDXライブラリには非公開の関数が沢山あって
DrawCircleGauge関数も非公開関数だったからなんですよね^^;

ちなみにDrawCircleGauge関数の使い方は・・・
DrawCircleGauge( int CenterX, int CenterY, double Percent, int GrHandle ) ; となっており
int CenterXが円の中心座標X
int CenterYが円の中心座標Y
double Percentが円の大きさ(100%で真円)
int GrHandleが用意した画像の変数
となっています。
尚、用意する画像は2x2や128x128や512x512等の2の乗数にしないと駄目なようです。

今回用意した画像はコレ(256x256)なので
s-gauge.jpg
円形の画像1枚を用意するだけで自由自在にメーターが作れてしまいます^^
あんなに苦労して実装したのはなんだったんだ・・・って感じですが、その分勉強にはなったので
良しとしておきます^^;

非公開関数は他にも色々とあるので、一度ちゃんとヘッダファイルを読んでみようかと思っています。
コチラに纏めてくださっている方がいらっしゃいますので参考になりますね^^
自機ゲージの表示方法を変更してみました。
こんな感じ↓
20110206.jpg
2つのゲージ表示させたかったんですが、とりあえず1つだけ表示しています。
REVOLVER360のゲージを見て真似したのは秘密です^^;

あと、自機弾を前方向にしか撃てないようにしてホーミングをメインで使うような感じにしてみました。

右側の緑ゲージがいっぱいになったら無敵時間を発動出来るようにしているのですが
そもそも、この無敵時間って必要かなぁと思い始めたり^^;
無敵だと、ただ単にホーミング撃つだけになってしまうような気もするので、なにか敵に当たったら
ペナルティ的な物を入れたほうが良いかなぁと思いつつ、そのまま撃ちまくる方が面白いか?とも
思ったりして、どうするか悩み中なんですが敵の出現テーブルをちゃんと作りながら考えて行こう
かと思っています^^;
自機のシールド処理を追加してみました。
こんな感じ↓

自機通常弾で敵を倒すと一定数倒した時にシールドアイテムが出るようにしてみました。

シールドアイテムはメタセコイアで制作。
s-WS000906.jpg
Sマークのモデルを円のモデルで包んでみました。
SマークはEdge2でこんな感じのテクスチャを作って貼り付けています。
item04.png
背景色を透過にして文字だけを浮かせる感じで作ってみました。

とりあえずシステム的には大方出来てきたかなー?と思っているのですが、全ての処理がとりあえず
実装されてるだけなので、ココから細かい調整とかしないと駄目なのでマダマダだなぁと思いつつ
敵の動きや敵弾をちゃんと考えて、どんな感じにするのかを考えて行きたい所です^^;
Twitter
カレンダー
03 2024/04 05
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]