質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.50%
C++

C++はC言語をもとにしてつくられた最もよく使われるマルチパラダイムプログラミング言語の1つです。オブジェクト指向、ジェネリック、命令型など広く対応しており、多目的に使用されています。

Q&A

解決済

7回答

5092閲覧

オブジェクト指向でゲームプログラムをする基本が知りたいです。

退会済みユーザー

退会済みユーザー

総合スコア0

C++

C++はC言語をもとにしてつくられた最もよく使われるマルチパラダイムプログラミング言語の1つです。オブジェクト指向、ジェネリック、命令型など広く対応しており、多目的に使用されています。

0グッド

0クリップ

投稿2019/07/08 12:47

編集2019/07/08 13:18

オブジェクト指向を使ってゲームプログラムのコード設計する方法についていろいろありますが
まずmain.cppはプログラムの始まりでしかないのでloop.cppなど専用ファイルを作成してやっています。
下記のコードような書き方でコードを設計していますがこれはやり方の一つなのでしょうか?
自分が気になるのはPlayerをコンストラクタで画像ファイルを指定しし(敵も用意しますが)
それを統括?するコードをGame.cppに書いて居ます

※loopクラスはタイトルステージなどといったシーン切り替えに使います。
がシーンというクラスは説明のため省きました。
1、そのGameクラスに書いたPlayerクラスの宣言の場所が気になります
2,各クラスでMain()関数を使って各クラスのUpdateやDrawを回すことはいいのか?

※マリオ風アクションゲームの作成です。

class Player { pirvate: int ghandle[8];//画像格納 void Update(); void Draw_Update(); public: Player(string name); Main(); } /*Game.h*/ /*ゲーム管理ステージ */ //#include "Player.h" class Game { private: Player *p; void Update(); void Draw_Update(); public: Game(); /* { p = new Player(xx.png);}*/ Main(); } //loop.h class loop { private: Game *g = new game(); void Update(); void Draw_Update(); public: loop(); void Main(); } /*main.h*/ //#incldue "loop.h" loop *lo = new lopp(); while(1) { lo->Main(); g.Main(); }

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答7

0

オブジェクト指向を使って

「オブジェクト指向」の元の英語は Object Oriented です。これは、この2つの単語で形容詞です。よって「白いを使って」と言っているようなもので、言葉としておかしいです。「白いケースを使って」のように、形容詞の後には形容される名詞が来なければなりません。その名詞は、Language であったり、Development であったりします。

「Object」ですが、日本語では「オブジェクト」とか「物」と訳されることが多いですが、「目的」という意味を持っています。「Orient」は、「指向」と訳されていますが、本質的な意味は「ある物事に深く注意を向ける」「時間をかけたり、興味の対象となるもの」です。「指向」は、最近(特に機械、コンピュータ系で)この意味でも用いられますが、本来は「志向」の字があてられます。
つまるところ、object oriented design というのは、目的に対して深く注意を向けて設計すること、ということです。

それであるなら、あなたは「クラス」つまり「似たものを集めたグループ」を作るときに、「このクラスは何を目的にするのだろうか」と言うことを考えたでしょうか。クラスにメソッドを用意するとき、「このメソッドは、何を目的にしていて、その目的は、このクラスに用意することが妥当だろうか」ということを考えたでしょうか。

単に「物」を作って、それを組み合わせれば object oriented design ができるわけではありません。何のために用意するのか、何を成すために用意するのか、それを考えることこそが、オブジェクト志向設計です。それができていたら、こういう質問は出ないと思います。

投稿2019/07/09 13:16

Q71

総合スコア995

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

いきなり「コード」を書き始めている時点で「設計」と呼んでいいのかという疑問も浮かびます。
対象を「オブジェクト指向分析」して
構造を「オブジェクト指向設計」して
コードを「オブジェクト指向プログラミング」する、というのがベタなやり方になるでしょうか。
「設計」しているならクラス図くらいは書いてありますか?

オブジェクトの責務(役割)について触れられている回答もありますね。CRCカードとか知ってますか? 実用にするかどうかはともかく、学習段階では一度使ってみるといいかと思います。

投稿2019/07/27 01:05

thkana

総合スコア7610

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

ベストアンサー

マリオ風で考えるなら、まず画面上にどんな「オブジェクト」があるでしょうか?
・キャラクター(自機)
・敵キャラ
・固定された障害物(壁・床・天井・土管など)
・動く障害物(動く床とか。時間で消える/出てくる障害物もこれ)
・アイテム

そしてそれらのオブジェクトは、それぞれどういう振る舞いをするのかが決まっています。
敵キャラの中には床を歩くもの(床がなくても歩いて落ちるもの、床の端で戻るもの)、ジャンプしてくるもの、空中を飛ぶもの、などがありますが、それはそれぞれのオブジェクトの種類によってあらかじめ設定できるものです。
さらにはオブジェクト間の相互作用というものがあります。例えばキャラクターは敵キャラと接触したらやられますし、破壊可能な障害物なら接触することでキャラクターが壊すことも(条件が整えば)あるでしょう。アイテムはキャラクターが接触すれば取ることができますが、敵キャラはアイテムをすり抜け(相互作用しない)ますよね。

それらのルールを各オブジェクトに設定した上で、時間を管理して動かすと(アニメや映画のコマ、あるいはフレームと考えてください)、ゲーム画面として動くようになりますね。

投稿2019/07/09 02:34

tacsheaven

総合スコア13703

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

C++

1class scene{ 2 3public: 4 virtual ~scene(){} 5 virtual bool Initialize() = 0; 6 virtual void Update() = 0; 7 virtual void Render() = 0; 8}

どのジャンルのゲームでもそうですが、こんな感じのクラスを引き継いで各シーンを作るのが一番最適だと思います。

これなら、タイトル画面、ゲームの各ステージ画面、ゲームオーバー画面、ゲームクリア画面などを一括で管理できます。
Playerなどはこの形に添って、新しくクラスを生成するのが良いでしょう。

投稿2019/07/09 00:08

stdio

総合スコア3307

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

退会済みユーザー

退会済みユーザー

2019/07/10 23:12

質問ですが座標などの変数をいじるときにどこで何の変数をいじるかを限定する方法などありますか? 色々な場所で代入や比較を繰り返すとちょっとわからなくなるので知りたいです。
stdio

2019/07/11 00:00

vector2やvector3、matrixの構造体を用意しておくことが前提で考える場合、 座標など超重要情報は基本的にPlayerならPlayerクラスのprivateにおいてget関数だけ作るようにします。基本的にこれで色々な場所で比較は出来るようになります。代入がされないので、どれだけ増えようがあまり気にすることはありません。 しかし衝突判定系の座標補正等で代入を行う際は、かなり慎重な設計が要求されます。 個人で制作されているのならそこまで気にすることはないとは思いますが、チームでやる場合は、徹底したルール管理が要求されます。 基本的には管理を行うのであれば、すべての変数はprivateにおいて、必要に応じてgetとset関数を作るというルールにするのが、一般的です。こうすることで参照が容易になり、ルール違反の発見が早く済むので、手戻りが少なくなり楽です。
退会済みユーザー

退会済みユーザー

2019/07/11 05:05

もう一つ質問ですが 座標管理のx,yを自分は構造体を使っているですが この場合は 構造体とクラスどっちを使った方がいいのでしょうか?
stdio

2019/07/11 08:24

vector2やvector3は私が見てきた中では構造体が多いです。それは古くからあったC言語から引き継いだからでしょう。新規で作る場合はどちらでも構いませんよ。 その代り、C++らしく、しっかりとoperator周りは仕様をしっかり固めておいて方が使いやすさは上がります。
退会済みユーザー

退会済みユーザー

2019/07/25 06:35

質問ですが別クラスの座標を取得してその値を当たり判定とかに使いたい場合はどうすればいいのでしょうか?
episteme

2019/07/25 13:00

「2点間の距離がXX以下になればアタリ」とかじゃね(簡単にやるなら)?
stdio

2019/07/26 00:02

普通にgetPos()を作るのが無難でしょう。const&にしておくことでさらにメモリの消費も抑えられるので、お勧めです。
guest

0

私は

オブジェクト指向を使ってゲームプログラムのコード設計する

ことに関して素人丸出しの雑魚なのですが…
「あれやこれやと最初から考え始めてしまって結局何も完成しない」的な頓挫をそれなりに経験している失敗者からのアドバイスみたいなのを書いてみます.

【要らないうちは要らない】

これ.
Gameとかloopとかシーンだとか…一体何のために必要ですか?
役割は何ですか? それらが無いと本当に困るのですか?
main関数内にメインループを書かない確固たる理由は何でしょうか?
(おそらくそれがloopクラスの存在理由なのかと思いますが,説明できますか?)

最初から{何となく?,ググったら他人がそう書いていたから?,etc...}という不確かな状態で書き始めると,その書いた物(の構造なり)に自分自身が縛られて道に迷うことになりかねません.

本当に今必要な物だけを順に書いていけば良いのではないでしょうか.
本当に必要に応じて生み出すならば,頭にクエスチョンマークを浮かべながらコードを書くことにはそうそうなりませんし,
なったとしても,疑問点はもっと具体的な形になるかと思います.

#同様に,「オブジェクト指向」とかいう(とらえどころのない)言葉にも振り回されないようにした方が無難だと思います.
(コードの形が「オブジェクト指向」なる言葉の範疇にあるか否かを過度に気にする人を稀に見かけますが,手段が目的になっちゃってる感)

投稿2019/07/09 01:57

fana

総合スコア11634

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

fana

2019/07/09 02:23

どう見ても「回答」ではなく,単なる自分語りですなぁ… 自分が完全把握してない「(何らかの意味での)良い形」を自分が作り上げることなんてできるわけないのに,何故か最初から一発でその「良い形」に捉われる病気. 誰かに「騎兵を用いてなだれ込むのは下策」とか言われても,一度なだれ込んでみないと真に理解できなかったりする.
guest

0

1、そのGameクラスに書いたPlayerクラスの宣言の場所が気になります

一つのクラスに対して、.cpp と .h を一つずつ作るのが良いと思います。

例えば、Player クラスの場合ですと、「Player.cpp」「Player.h」を作って、「Player.h」にクラス定義に書き、メソッドの実装などは「Player.cpp」に書きます。

2,各クラスでMain()関数を使って各クラスのUpdateやDrawを回すことはいいのか?

全体のメインループの中で各クラスの Update() や Draw() を呼び出した方が良いと思います。
各クラスは同じ回数だけ Update() や Draw() を呼び出すと思いますが、別のループだと同期を取るのがめんどくさそうです。

投稿2019/07/08 23:05

nskydiving

総合スコア6500

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

回答ではありません・・・が、
とあるゲームプログラミング初心者が C++ でゲームを作ろうとして未完成の話
あたりを読まれることを推奨します。
・・・あと、
通常「クラス定義はヘッダファイルに書くもの」です。

投稿2019/07/08 13:09

cateye

総合スコア6851

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.50%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問