C/C++ゲーム製作総合スレッド Part3

このエントリーをはてなブックマークに追加
951名前は開発中のものです。
今更な感じがしないでもないですが、
ゲーム開発にはC言語とC++は、どちらが適してるプログラミング言語と言えるでしょうか?

俺はこれまでC言語とC++は同じものという考え方をしていたのですが、
よくよく考えると、C言語とC++は別もののプログラミング言語であるように思えました
C++は、C言語にプロジェクト指向を取り入れた言語であることは言うまでもないですが、
オブジェクト(クラス)を使う利点は、ワープロやアプリケーション開発に向いているように思えます
つまり、同じ処理を繰り返す比率が多いからです

そしてC言語は、組み込みシステムと呼ばれるものですので
C++よりもC言語の方がゲーム開発に向いていると思える
組み込みシステムとは、ゲーム機器に組み込まれているハードウェア+ソフトのシステムのことです
952名前は開発中のものです。:2013/08/11(日) 18:37:17.23 ID:9rLdDf+W
何処から突っ込んだらいいの?
953名前は開発中のものです。:2013/08/11(日) 18:46:48.46 ID:bd9d1tW1
全く同じ実行内容のゲーム開発をするとして、
C言語だけで組まれたプログラムと
C++のオブジェクトを使って組まれたプログラムを見比べると
C++の方が遥かにややこしいプログラムのような気がします

クラスを使うためにクラス内でメンバ関数やメンバ変数を使って
publicやらprivateやらを使って定義を構築
メインプログラムからはクラスを使うために
new演算子でインスタンス作成をしてオブジェクトを作成
そして、そのクラスのメンバ変数を呼び出してプログラムを構築する
クラスを使うには、これだけたくさんの工程が必要なのです
C言語だけで組むなら、直接命令を打ち込むだけで済むじゃないですか?

ゲームというのは、コントローラーに付いている僅かなボタンしか使いません
キーボードを使って文字を入力したりもしませんし、
与えられた項目を十字キーで選択して、決定ボタンを押すだけです
そのようなシステムになぜ、C++でなきゃいけないのだろうか?

書店で見かけるゲームプログラミングの本はC言語を使ったのはよく見かけますが
C++で解説しているゲームプログラミングの本が全くないのは、そのためのような気がします。
954名前は開発中のものです。:2013/08/11(日) 18:52:43.55 ID:bd9d1tW1
>>952
すみません
オブジェクト指向の間違いですw

あと、C言語だけを使ったプログラムとは
C++を使うがオブジェクト指向の機能だけ使わないという意味です
つまり、変数の宣言や初期化をプログラムの冒頭でやらなくても済むという
C++の特徴などは使うという意味です
C言語の場合、プログラムの途中で変数を宣言して使うことは出来ませんが、
そういうのは抜きで、あくまでもオブジェクト指向の機能だけ使わないという意味です
955名前は開発中のものです。:2013/08/11(日) 18:56:56.17 ID:zmE+2PHb
ゲームが項目を選んで選択肢を押すだけのゲームだったらいいね
956名前は開発中のものです。:2013/08/11(日) 18:59:10.63 ID:Vkv1rucG
ゲームは一秒間に60回同じ処理繰り返すわけだけど、アプリケーションやワープロの方が同じ処理を繰り返す比率高いの?
957名前は開発中のものです。:2013/08/11(日) 19:00:32.20 ID:Vkv1rucG
ていうかそれ以前に同じ処理繰り返す比率とオブジェクト指向になんの関係があるの?
958名前は開発中のものです。:2013/08/11(日) 19:01:00.91 ID:bd9d1tW1
C言語にも構造体という技術もありますし、
メンバ関数を使わなくても、普通の関数を使って呼び出すことも出来ます
グローバル変数を使えばスコープ外に変数を使うことだってできますし、
グローバル変数でも解放は出来るじゃないですか

そう考えるとC++でゲーム開発をやっていた自分が無駄なように思えてしまいました
なぜ、俺はここまでオブジェクトを使うことに拘ってるのだろう?と・・・
959名前は開発中のものです。:2013/08/11(日) 19:07:09.41 ID:SdAAA50H
オブジェクト指向のほうが個人的にはゲームに向いてると思うよ

ゲームは、ゲーム内のオブジェクトを動かしたりアニメーションさせたりするわけで
それには座標やら向きやら速度がオブジェクトそれぞれに必要なわけで
これらの情報をまとめて持つということに関してオブジェクト指向がプログラマにとって一番わかりやすいはず。

別にプログラマの技術力を無視した視点から見ても
助けてくれるサポートコミュニティが無数にあるフレームワークというか言語のほうがいいんじゃないか
960名前は開発中のものです。:2013/08/11(日) 19:08:03.45 ID:bd9d1tW1
>>956
俺が言ってるのは、クラスを1つ定義しておいて
それをたくさんのオブジェクトでクラスを複製して使うという意味です
オブジェクトの特徴ってそういうことじゃないですか

1本のゲームを作り上げるのに
クラス化にすることがそれほど必要なことなのでしょうか?
シューティングなら主人公の構造体と敵の構造体を別々に個々に用意してもいいような気がします
961名前は開発中のものです。:2013/08/11(日) 19:09:15.30 ID:SdAAA50H
一度処理を書き込んでしまえば外部のループから頭スッカラカンにして呼び出すだけでいい
っていうのが楽で素晴らしいと思う
962名前は開発中のものです。:2013/08/11(日) 19:09:51.35 ID:Vkv1rucG
>>958
その気づきは大切なことだからいいと思うけど
まずオブジェクト指向の利点について勉強した方がいいんじゃないの?

ちなみにC++のコードはCのコードに完全に置き換えることも出来るよ
ついでにObjective-Cも
963名前は開発中のものです。:2013/08/11(日) 19:13:06.03 ID:zmE+2PHb
グローバル変数を使えばできる

C++なら使わなくてもできる。素晴らしいじゃないか
964名前は開発中のものです。:2013/08/11(日) 19:14:45.62 ID:bd9d1tW1
>>959
まあ、俺が単にオブジェクトが苦手ということもありますが、
助言ありがとうございます
965名前は開発中のものです。:2013/08/11(日) 19:18:00.04 ID:SdAAA50H
DirectX学ぶにはどうしたらいいですか?
猿でもわかるようなのがいいです。

デバイスの宣言とか頂点バッファ?とか、
C++初級者でもシェーダプログラミングとかまでこれ一冊!
って感じの本無いですか?
贅沢を言えばGPUに処理投げられたり?するとか、そこら辺の基礎知識も一緒に学べるようなもので、
ゲーム開発を意識した本が良いです。

ベクトルや行列の基礎知識はあります。
予算は5000円付近で

やっぱりDirectXの前提知識が無いのでわかりやすいのがいいです。
966名前は開発中のものです。:2013/08/11(日) 19:20:27.55 ID:MBCHmrub
なんか、アホな会話がされているようだが、俺もアホだから興味深い話だw

俺はオブジェクト指向がどうも理解できなくて、グローバル変数や構造体でゲーム作ってる
ヘボプログラマだから、クラスだのなんだのがゲーム製作に有用なんだったら
どこがどう有用なのか知りたいと常々思ってる。

けど、解説とか「だからそれがゲームにどう関係あるんだよ」みたいなのしかなくて
どうにも身につかないんだ。
967名前は開発中のものです。:2013/08/11(日) 19:24:53.77 ID:VypAcln1
ヒント:フレームワーク
968名前は開発中のものです。:2013/08/11(日) 19:27:10.04 ID:bd9d1tW1
あ、俺は職業ゲームプログラマーというわけではありません
ただの趣味でゲーム開発を楽しんでいるだけです
最初はC言語だけでゲーム開発をやっていたのだけど、
途中でC++というのを知って
オブジェクトに手を出してみたのですが、それが意外と難しくてつまずいて
そこで、なぜ、俺はこんなややこしいオブジェクトを使ってるんだ?ウガー!
となってるだけですw

オブジェクトにつまづいたことへの愚痴のようなものです
969名前は開発中のものです。:2013/08/11(日) 19:27:41.25 ID:SdAAA50H
>>964
ちょっとわかりづらくなるかもしれない例えになるんだけど

C言語の構造体だと、例えば敵とキャラクターの接触が起きた時に
それぞれの構造体データに対して、
「おいお前、敵とぶつかったから一旦座標戻すからな、あとHPからダメージ分引いとくから、あとダメージ受けた時のリアクションにしとく」
という処理を施すんだけど
クラスというオブジェクト指向を持って、クラスに対して「振る舞い」を予め処理しておくと
「おいお前、この敵とぶつかったから」
という処理で終わる。

他にも色々あるけど、つまりその処理が何をしているのかわかりやすくなって、今どんな処理がされているのかわかりやすくなる
→デバッグしやすいし、多人数で作業分担しやすい、予期しないデータ改変が行われない

というメリットがある
でもオブジェクト指向が苦手なら苦手で、別にC言語で作ってもいいんじゃないかね
作れないわけではないから
970名前は開発中のものです。:2013/08/11(日) 19:30:34.65 ID:SdAAA50H
日本語が変でした

これお願いします>>965
971名前は開発中のものです。:2013/08/11(日) 19:33:41.23 ID:bd9d1tW1
誰かC言語ではなくC++を使ったゲームプログラミングの本を執筆してくれる人いないかな?
俺が手にしているゲームプログラミングの本は、全てC言語ばかりです
それをC++のオブジェクトの置き換えるために、
C++の本を買いあさってオブジェクト指向に構築し直しているのだが、
それがうまくいかない・・・

俺が持ってるゲームプログラミングの本は、全てC言語ばかりですので
本当にお手上げ状態です
今は、オブジェクトを理解するために、ゲーム開発を一時中断して
仕方がなくJavaを学んでいるところです
972名前は開発中のものです。:2013/08/11(日) 19:40:03.43 ID:bd9d1tW1
>>969
ありがとうございます
言ってる意味が、分かりそうで解からないという
モヤモヤした状態ですが、
なんとなく「オブジェクトが便利」ということだけは伝わりました

もう少し大人しくオブジェクトを学んでみることにします
973名前は開発中のものです。:2013/08/11(日) 19:45:26.61 ID:zmE+2PHb
明確にコードがこう変わる!っていういい例があった

ttp://dixq.net/g/
ここの「メニュー画面の作り方」を読むんだ
1,2,3とC++編の違いがわかると大きい
974名前は開発中のものです。:2013/08/11(日) 19:58:55.55 ID:bd9d1tW1
>>973
ありがとうございます。
そのサイトでしたら、C++以外の
C言語でDXライブラリを扱う解説は一通り読みました
サンプルコードを打ち込んで実行結果を確認して
すべて上手く行ったのでC言語でのゲーム開発については自信がつきました

あとは、それを自分が開発するゲームに置き換えてプログラミングをすれば
C言語によるゲーム開発のゴールも見えていたのですが、
俺の場合、途中でC++のオブジェクトに手を出してしまったのでドツボにはまってしまった
つまり、完成するはずのゲームは完成しない

>>969
>でもオブジェクト指向が苦手なら苦手で、別にC言語で作ってもいいんじゃないかね
でも、いいです。
せっかくオブジェクトに触れたので、オブジェクトを身に着けてみせます
ありがとうございました
975名前は開発中のものです。:2013/08/11(日) 20:14:20.06 ID:zmE+2PHb
Cを読んでうまく行って自信がついてC++に手を出してわからなくなった
じゃあそのサイトのC++を読めばいいじゃない
976名前は開発中のものです。:2013/08/11(日) 20:49:11.24 ID:Vkv1rucG
>>960を見た感じだとクラスとただのデータ構造の違いがわかってないみたいだし、ポリモーフィズムに関する理解が薄いんだと思う
確かゲームつくろーにデザインパターンのゲームへの応用みたいなのあった気がするから
それ見たら少しは理解が深まるんじゃないかな

あと純粋にC++覚えたいってんじゃなかったらCでやっちまえばいいと俺も思います
977名前は開発中のものです。:2013/08/11(日) 21:26:19.14 ID:bd9d1tW1
>>975
メニュー画面だけ解説されてもね
どうせなら、全部C++で解説してほしい
というか、そのサイトのC++以外のC言語を使った解説は丁寧でわかりやすかったけど
C++だけ、いきなり過ぎて最初は意味がわかりませんでした

>>976
C++のオブジェクトの扱い方については、なんとなく理解しています
メインプログラムでクラスを呼び出してオブジェクトを作成する
new演算子を使うとクラスのコンストラクタを読みに行って
まずは初期化が行われる

クラス内で扱う変数は、同じクラス内のメンバ変数から扱うことになり、
メインプログラムからは、
「オブジェクト、クラス、メンバ変数(引数)」という形式で組み
ここに書いた引数は、クラス内のメンバ変数に移されて
メンバ関数内で処理で実行結果を映す

という、一連のオブジェクトの流れまでは理解できたが、
かなりややこしい
978名前は開発中のものです。:2013/08/11(日) 21:39:28.95 ID:bd9d1tW1
俺はC++のオブジェクトを独学で学んだ後に、
Javaのオブジェクトを独学で学んでみたのですが
Javaのオブジェクトの方が遥かに楽ですね

C++のようにhファイルでクラス宣言とかしなくていいでしょ?
メインプログラムもJavaファイルですし
クラスも同じJavaファイル
そして公開クラスはJavaファイルに1つしか組めないというルールも分かり易い

今はJavaのオブジェクトをC++のオブジェクトに置き換えて考えてみようとしたのですが、
やっぱC++のオブジェクトは面倒で、すっごくややこしいですね・・・
Javaのオブジェクトが分かりやすいのは、
Javaはすべてクラスだからです。クラスだけでプログラムを組むからです
979名前は開発中のものです。:2013/08/11(日) 21:41:48.62 ID:Vkv1rucG
>>977
でもオブジェクトがただの構造体と比べてどう便利なのかわかんないんでしょ?
文法や仕組みだけわかっても概念や考え方わからないと役に立たないよ
GoFのデザインパターンはオブジェクト指向のかなりメジャーなベストプラクティスだから
それが理解できればオブジェクト指向のメリットも理解できると思うよ

念のために言っておくけどベストプラクティスは「成功例」であって「正解」ではないからそこは忘れずに
980名前は開発中のものです。:2013/08/11(日) 21:46:22.72 ID:Vkv1rucG
>>978
JAVAはオブジェクト指向言語だけどC++はオブジェクト指向「も出来る」言語だから
いろんなプログラミングパラダイムを持つのがC++の特徴

ぶっちゃけ人によってスタイルちがうからメンドイ
981名前は開発中のものです。:2013/08/11(日) 21:55:41.72 ID:IbgpLycy
>>978
??C++でもこーゆー書き方は出来るよ?
class CMutex
{
HANDLE m_hMutex;
public:
CMutex(void){m_hMutex=CreateMutex(NULL,FALSE,NULL);}
virtual ~CMutex(void){CloseHandle(m_hMutex);}
DWORD Wait(DWORD dwMsec=INFINITE){return WaitForSingleObject(m_hMutex,dwMsec);}
void Release(void){ReleaseMutex(m_hMutex);}
};

class CEvent
{
HANDLE m_hEvent;
public:
CEvent(void){m_hEvent=CreateEvent(NULL,FALSE,FALSE,NULL);}
virtual ~CEvent(void){CloseHandle(m_hEvent);}
DWORD Wait(DWORD dwMsec=INFINITE){return WaitForSingleObject(m_hEvent,dwMsec);}
HANDLE GetHandle(){return m_hEvent;}
void Set(void){SetEvent(m_hEvent);};
void Reset(void){ResetEvent(m_hEvent);};
};
982名前は開発中のものです。:2013/08/11(日) 22:20:42.72 ID:JtNwXkxd
ポリモーフィズムが便利だよなあ
敵のオブジェクトをリストに突っ込んでおいて
イテレータで回しながら順に敵の処理を実行するとか
C言語だとどうやるんだろ
983名前は開発中のものです。:2013/08/11(日) 22:29:07.69 ID:dZz1JD3L
よし。じゃあ、新たにJava版のゲームプログラミングの解説サイトでも作ることにしよう。
開く
JET++ ‏@JET_JAPAN 8月3日

とにかく約2週間も暇になってしまうので、先にJava学習を始めてみることにしよう。
どうせ職業訓練で学ぶJavaはシステム系のプログラミングになると思うので、
こっちはJavaを使ったゲームプログラミングを学んでいくことにしよう。
開く
JET++ ‏@JET_JAPAN 8月3日

今日が8月3日ですから、約2週間も暇になる。あ、明日は日曜日で
ハローワークはやってないんだった。なので、ハローワークは来週の月曜日の
8月5日に行くことにしよう。
開く
JET++ ‏@JET_JAPAN 8月3日
984名前は開発中のものです。:2013/08/11(日) 22:31:48.83 ID:bd9d1tW1
>>979
いや、さすがにそれぐらいは解かる
構造体は変数しか扱えない
クラスは変数と関数が使える
Javaの場合は、フィールドと変数とメソッドだけど

メインプログラムでクラスを呼び出してオブジェクトを作り、
そのオブジェクトでメンバ関数に引数を渡せば
クラスの中で、別のメンバ変数なども動かして、様々な部品を作ることができる
あとは、そのオブジェクトのメンバ変数を呼び出せば答えを返すことが出来るし
メンバ関数を呼び出せば、その関数のreturnの値を呼び出すことも可能
985名前は開発中のものです。:2013/08/11(日) 22:42:10.39 ID:JtNwXkxd
構造体に関数を追加したのがクラスっていう認識なんだろうなあ
継承とか、ポリモーフィズム、デザインパターンあたりを
キーワードに勉強するといいと思うよ
986名前は開発中のものです。:2013/08/11(日) 22:47:03.14 ID:bd9d1tW1
>>981
うん。
C++のクラスでも、そうやって宣言も定義に含めることもできますが、
そういうことじゃないんですよね
C++のオブジェクトがJavaのオブジェクトよりややこしいというのは・・・

俺は最初にC++を使ったオブジェクトをプログラムを組んで学んでから
Javaに触れてみると、
いきなり「え?」と思ったよ
だって、いきなりクラスの中にプログラムを組んでいくのだし

だが、Javaを使ってみると、意外と分かり易かったです
コードの組み方がC言語と同じだったので
先にC言語を学んでおいてよかったと思いましたね
987名前は開発中のものです。:2013/08/11(日) 22:47:27.83 ID:Vkv1rucG
>>985
まあ最初はみんなそんなもんでしょ、実装上は間違いってわけでもないし
その理解だと設計が手続き型の延長にしかならんからメリットが見えないけど
988名前は開発中のものです。:2013/08/11(日) 22:53:11.68 ID:bd9d1tW1
>>985
継承あたりまでは学びました
継承は確かに便利ですね
いくらでもスーパークラスを受け継がせたサブクラスが作れますからね

俺はこの継承という技術は好きです
前にRuby1.9のプログラムを学んだことがあったのですが、
あれは継承の連続でしたね
無数にあるクラスを一つ一つ辿っていくと
全てのクラスが1つのスーパークラスの上(下?)で、動いているのを知った時は
面白い技術だなと思いましたね

ポリモーフィズム、デザインパターンは、まだ知りません
989名前は開発中のものです。:2013/08/11(日) 23:07:30.73 ID:bd9d1tW1
あ、俺が見たRuby1.9のプログラムは、
RPGツクールVX Aceに入ってた
Rubyスクリプトプログラムのことです
990名前は開発中のものです。:2013/08/11(日) 23:40:08.00 ID:Vkv1rucG
>>988
ならポリモーフィズム学んでからまた考えればいいんじゃない
それでもCでいいと思うならそれはそれでいいと思うけど

ぶっちゃけオブジェクト指向の大きな利点は再利用性とかメンテナンス性だから
一人でやっててメリット見えないってのはありえるし
991名前は開発中のものです。:2013/08/11(日) 23:44:37.53 ID:0QKgFJUt
個人的にはソースを見るのが一番解りやすいな
クラスの扱いは別にC++に限らないから他言語でもいい

市販ゲームではDOOM3とかソース公開しているから見てみるといいかもね
992名前は開発中のものです。:2013/08/12(月) 05:49:59.47 ID:3AMeZIoC
>>965
DirectX は初心者スレがどっかにあったと思うから探してみるといいと思う
そこで質問したほうがいい答えを得れると思うよ

あと, 本だけじゃなくてネットで初心者サイトを探してみるとか
実際に DirectX で簡単なプログラム組んでみるとか
読みにくいけど, MSDN の DirectX のページを読んでみるのもおすすめ
993名前は開発中のものです。:2013/08/12(月) 07:51:54.41 ID:LeEBEVqd
誰か次スレ頼む
994名前は開発中のものです。:2013/08/12(月) 08:08:10.18 ID:RPqvnGkC
995名前は開発中のものです。:2013/08/12(月) 15:29:01.59 ID:KCZ2Ym+/
ポリモーフィズムで自機と敵機を一緒にして管理してるんですけど
プレイヤーが見るUIを描画する際にどこに処理を置いたほうがいいですか?

自機をインスタンス化する時に、UIクラスなどを作っておいてそこに登録させるのか
もしくは予め自機敵機のスーパークラスにUIを描画する機能を作っておいて、
描画するときには、線形探索じゃないですけどループ回して、自機だったら描画、敵機だったら描画しない、という判断をするのか

どっちのほうがわかりやすいですか?
996名前は開発中のものです。:2013/08/12(月) 15:50:02.49 ID:zkFlUNMe
プレイヤーが見るUIってなんじゃらほい
997名前は開発中のものです。:2013/08/12(月) 15:50:51.79 ID:9jLpDglR
前者でいいんじゃない
特定のサブクラスしか使わないメソッドを親に持たせるとクラスのスコープが曖昧になるし

ちなみにUIってのはHUDの事でいいんかな
998名前は開発中のものです。:2013/08/13(火) 06:47:48.07 ID:Or7GDV3w
Win8だとUSBがドライバまともにインストールできんの、直ったんかね
999名前は開発中のものです。:2013/08/13(火) 12:19:45.55 ID:H6Z86S80
もう少し人に伝わる文章を書く努力をしろ
1000名前は開発中のものです。:2013/08/13(火) 17:35:18.87 ID:VOEExxCW
埋め
10011001
このスレッドは1000を超えました。
もう書けないので、新しいスレッドを立ててくださいです。。。