Hiragi(GKUTH)の日常
理系大学生の日記

初のゲームを作成する日記:01

アバター
Hiragi(GKUTH)
記事: 167
登録日時: 14年前
住所: 大阪府
連絡を取る:

初のゲームを作成する日記:01

投稿記事 by Hiragi(GKUTH) » 10年前

そう、ずいぶん前に「ブロック崩しを作る」なんて言ってましたね。

高校生の春休みは長い。 そう。 やはり作らねばならんのです。(何で
とりあえず。C++っぽい書き方に慣れるためにもとりあえずという形で作ってみることにしました。


1.どんなゲームにするか?

 さて、とりあえずブロック崩しといっても様々な形があるでしょうし、アイテムとか、他の要素も追加されていくことでしょう。
こないだ書いた日記にて、様々な方から意見を聞きました。 どれも面白そうなんですけど...ちょっと処女作としては敷居が高いですね。(言い訳
というわけで、普通のブロック崩しを作ることにしました。ゲーム性は求めない。とりあえずスタンダードなブロック崩し。

2.で、次はなにすればいいの

 ゲームなんて作ったことないので、ゲームプログラムがどういう風に回ってるとか、そういう基本的なモノしかわからず。設計もわからん。なんもわからん状態です。
でもまぁとりあえず最初だしどうでもいいや()というわけでございまして。せっせとプログラムを書いてたわけですよ。
するとですね。ほぼすべての情報をmain関数が持ち、main関数内で計算して、main関数内で描画して。 関数なんて分けないでとりあえず書いてたらまぁそりゃ醜くなったわけです。
スタンダードなブロック崩しとは言っていますが、機能追加、つまりスコア機能、アイテムの導入、等の事は今後当然の用に行われていくことでしょう。

3.オブジェクト指向

 つか、ブロック崩しにオブジェクト指向って使うべきなの? わからんけどとりあえずC++を学ぶことが目的なんだからコレを取り入れないわけにはいかんだろ。
というわけで機能追加とかにもmain関数に直接書くよりははるかにマシ...のはずだと思いオブジェクト指向なるものを取り入れたいのです。つまり

CODE:

class Ball_t{...};
こういうカッコイイ書き方をしてみたい! ってわけで以前作ったmain関数に全部ぶっこんでるやつをとりあえず画面上にあるであろうオブジェクトごとに分ける作業を行いました。

まず。
 1.ボール
 2.ブロック
 3.バー

この三つに分かれるのではと思い、とりあえずその三つのクラスを作成、さくっと必要そうな情報を書き入れつつ、コンストラクタの用意。
初期化、更新、描画をそれぞれ行うメンバ関数を用意、適当にゲッターも作っとく。
それらのクラスをmain関数に持たせて、いつも通りに初期化、更新、描画、......


3.あたり判定ってどうすんのさ

 ここにおけるあたり判定はゲーム設計上のあたり判定であり、実際のあたり判定を行う処理は指していません。
ってか、あたり判定を行うところは各クラス内の更新に当たる関数なのでしょうが、もちろんとある二つのオブジェクト間のあたり判定を行う場合、
双方の情報を知る必要がありますし、変更する必要があります。 ....どうすんのこれ。←今ココ


4.結論

 つまり現時点ではゲームの設計自体で行き詰っているというところです。今のところの改善案としては、このボール、ブロック、バーというオブジェクトを、「ゲームフィールド」とかいうオブジェクトで覆ってしまって
ゲームフィールドが情報を握ってしまえば大丈夫かもしれない、とかいう考えですが、んなことしてたらタイトル画面作ろうとしたとき、ゲームフィールドというオブジェクトは一つのシーンという形でまた外側
を覆わなければいけなくなりそうそしてそのオブジェクトはまた「ゲーム本体」というオブジェクトで...つまりどんどん遠のいてる気がするんですよねぇ、main関数から。果たしてそれはいいことなのか

もう一つの改善案として、単なる関数としてあたり判定を行うというものです。値を投げれば当たっているか否かを返してくれる、とか、それでもってもやはり個々のオブジェクトの値を変更するコードはどこに書けばいいのか...
わからんことばっかりです。

とりあえず現時点でのコードをぺったり。 週一程度の更新を目指して...
► スポイラーを表示
最後に編集したユーザー Hiragi(GKUTH) on 2015年3月16日(月) 23:37 [ 編集 1 回目 ]

Rittai_3D
記事: 525
登録日時: 12年前

Re: 初のゲームを作成する日記:01

投稿記事 by Rittai_3D » 10年前

内容と全く関係ない話なんですけど、Cでオブジェクト指向っぽく書いて見てからC++に以降してみるのはどうでしょう。
いきなりC++でオブジェクト指向を意識するよりかは、とりあえずCでカプセル化をしてみる、くらいでよいのでは?って思います。オブジェクト指向で何かを作ったことがないなら尚更です。
わたしは、オブジェクト指向の基本中の基本はカプセル化だと考えているので、まずはカプセル化を徹底する!位の軽い気持ちで始めた方が良いと思いますよ。

アバター
axis
記事: 10
登録日時: 10年前

Re: 初のゲームを作成する日記:01

投稿記事 by axis » 10年前

自分もオブジェクト指向でシューティングゲームを作っていますが同じ問題に当たりました
EnemyクラスとPlayerクラスの当たり判定の実装です
色々試してたら出来ちゃった感じなのでいい設計ではないと思いますが

GameクラスがEnemyManagerとPlayerクラスをメンバに持ち
EnemyManagerとPlayerクラスにはGameへのポインタを持たせて
PlayerがGameの判定関数を呼んで、またそれがエネミーの判定関数を呼ぶ
という感じにしました。

ヘッダーでは相手クラスのプロトタイプ宣言をしてポインタのみ宣言し、
cppのほうでインクルードすればお互いに参照できます
依存が少なくなるためビルドが短くなりますが
ヘッダーにはそのクラスの情報がないため関数をinlineにできなくなります

Rittai_3D
記事: 525
登録日時: 12年前

Re: 初のゲームを作成する日記:01

投稿記事 by Rittai_3D » 10年前

PlayerクラスがGameクラスを知る必要はありません。むしろ、知ってはいけない位の方が良いのではないでしょうか。かくいうわたしも同じことをしていましたけどw

わたしなら、インターフェイスで解決します。インターフェイスなら必要なもの以外の情報はいじれません。
http://dixq.net/forum/viewtopic.php?f=3&t=10804あたりが参考になるかと。
「C++ interface」などのワードで検索すると詳しく出ています。

アバター
usao
記事: 1889
登録日時: 12年前

Re: 初のゲームを作成する日記:01

投稿記事 by usao » 10年前

>あたり判定

私はこういうとき
「ボールとブロックの当たり判定とやらを計算しなければならない」という事情(?)は誰の事情なんだろうか?
…とか考えますね.
きっとそれはゲームのルールの領分.
ボールだとかブロックだとかいうのは,
もっと上の方(?)から,「いろいろと上層部の方で計算した結果だけどさ,今回のお前の座標とかこうなったから」って言われて
「え,はい…」という側,というかその程度の方々だと思うから
こいつらが直接「俺ってボールとぶつかってるのかな?」とかいう判定はしない.

…といった感じで,衝突判定処理は
>各クラス内の更新に当たる関数
ではなく,もっと外側に,例えば ボール(というか円)とブロック(というか矩形)を引数に取る関数 みたいな感じにするかも.

アバター
Hiragi(GKUTH)
記事: 167
登録日時: 14年前
住所: 大阪府
連絡を取る:

Re: 初のゲームを作成する日記:01

投稿記事 by Hiragi(GKUTH) » 10年前

Rittai_3D さんが書きました:内容と全く関係ない話なんですけど、Cでオブジェクト指向っぽく書いて見てからC++に以降してみるのはどうでしょう。
いきなりC++でオブジェクト指向を意識するよりかは、とりあえずCでカプセル化をしてみる、くらいでよいのでは?って思います。オブジェクト指向で何かを作ったことがないなら尚更です。
わたしは、オブジェクト指向の基本中の基本はカプセル化だと考えているので、まずはカプセル化を徹底する!位の軽い気持ちで始めた方が良いと思いますよ。
カプセル化ってなに(ぇ
つまり必要以外の情報をある一つのオブジェクト以外が参照できない、或は変更できないようにするとかいうモノですかね、そのぐらいの理解しかありません。
C言語でのカプセル化というものがつまり何(?)なのかよくわからん私ですが... まぁカプセル化についてはほかのもっと小さな規模のプログラムで訓練するとして、
このゲームに関してはC++で書いていくことを徹底していきたいと思う所存です。
とりあえず今の時点で各オブジェクトはカプセル化しているつもりなのですが...?

アバター
Hiragi(GKUTH)
記事: 167
登録日時: 14年前
住所: 大阪府
連絡を取る:

Re: 初のゲームを作成する日記:01

投稿記事 by Hiragi(GKUTH) » 10年前

axis さんが書きました:自分もオブジェクト指向でシューティングゲームを作っていますが同じ問題に当たりました
EnemyクラスとPlayerクラスの当たり判定の実装です
色々試してたら出来ちゃった感じなのでいい設計ではないと思いますが

GameクラスがEnemyManagerとPlayerクラスをメンバに持ち
EnemyManagerとPlayerクラスにはGameへのポインタを持たせて
PlayerがGameの判定関数を呼んで、またそれがエネミーの判定関数を呼ぶ
という感じにしました。

ヘッダーでは相手クラスのプロトタイプ宣言をしてポインタのみ宣言し、
cppのほうでインクルードすればお互いに参照できます
依存が少なくなるためビルドが短くなりますが
ヘッダーにはそのクラスの情報がないため関数をinlineにできなくなります
えっと...こっちの知識と技術がなさ過ぎて何を仰ってるのかわからんです^^;
GameがEnemyManagerとPlayerを持っているのにPlayerがGameへのポインタを持っているとはどういう状況なのか...
下側(Player)から上方向(Game)にポインタを持ってる点についてどのような動作をするのか想像ができん^^;

アバター
Hiragi(GKUTH)
記事: 167
登録日時: 14年前
住所: 大阪府
連絡を取る:

Re: 初のゲームを作成する日記:01

投稿記事 by Hiragi(GKUTH) » 10年前

Rittai_3D さんが書きました:PlayerクラスがGameクラスを知る必要はありません。むしろ、知ってはいけない位の方が良いのではないでしょうか。かくいうわたしも同じことをしていましたけどw

わたしなら、インターフェイスで解決します。インターフェイスなら必要なもの以外の情報はいじれません。
http://dixq.net/forum/viewtopic.php?f=3&t=10804あたりが参考になるかと。
「C++ interface」などのワードで検索すると詳しく出ています。
参考にならん^^; あまりにもC++に関する知識に乏しいのが原因でしょうが。。。
そもそもそのurl先の93が仰っていますが、判定は「モノ」ではないのでそのオブジェクトが当たっているかどうかは知り得る必要
が無いのではと思い始めました、とすれば判定するのはオブジェクトでなく別の何かの関数であるのが適当であるかと思います。どこか上のほうで「方向を変えろ!」といわれたので、オブジェクトは
方向を変える、そんなのでいいのではと思い始めました、 ソレを考慮に入れてもインターフェイスというモノを知る必要がありそうです、また今から詳しく調べてみますかね。

アバター
Hiragi(GKUTH)
記事: 167
登録日時: 14年前
住所: 大阪府
連絡を取る:

Re: 初のゲームを作成する日記:01

投稿記事 by Hiragi(GKUTH) » 10年前

usao さんが書きました:>あたり判定

私はこういうとき
「ボールとブロックの当たり判定とやらを計算しなければならない」という事情(?)は誰の事情なんだろうか?
…とか考えますね.
きっとそれはゲームのルールの領分.
ボールだとかブロックだとかいうのは,
もっと上の方(?)から,「いろいろと上層部の方で計算した結果だけどさ,今回のお前の座標とかこうなったから」って言われて
「え,はい…」という側,というかその程度の方々だと思うから
こいつらが直接「俺ってボールとぶつかってるのかな?」とかいう判定はしない.

…といった感じで,衝突判定処理は
>各クラス内の更新に当たる関数
ではなく,もっと外側に,例えば ボール(というか円)とブロック(というか矩形)を引数に取る関数 みたいな感じにするかも.
...なんかさっき私が書いたことに近いことを仰っていますね、その様な方向で実装していきたいと思います。...けどやはり判定のために双方の値がいるので、
今回作った三つのオブジェクトたちはさらに上のオブジェクトによって包括されなければいけないようです、そのさらに上のオブジェクトにてそれら三つのオブジェクトが保持され、
計算されていくようにしなければいけなさそうです、かつそのさらに上のオブジェクトにてあたり判定を行うことになるんでしょうか、

つまり、ボール、ブロック、バーの三つは値を投げる何らかのメンバ関数を持ち、それでもってさらに上のオブジェクト内にて、あたり判定を行い、その結果より各オブジェクトの次フレームの位置を
「さらに上のオブジェクト」が決定し、それでもって三つのオブジェクトは位置を更新することにしようか...と思いました、これに関して3Dさんのインターフェイスが活用できそうな感じですので、
それも調べつつ実装していきたいと思います。

画像

なんか意見やおかしい点があればコメントで指摘,お願いします。
最後に編集したユーザー Hiragi(GKUTH) on 2015年3月18日(水) 20:37 [ 編集 1 回目 ]