トップページgamedev
1001コメント353KB

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

■ このスレッドは過去ログ倉庫に格納されています
0001名前は開発中のものです。2013/08/12(月) NY:AN:NY.ANID:RPqvnGkC
ゲーム製作におけるC/C++全般に関するスレです。

元スレ
DXライブラリ 総合スレッド その12
http://toro.2ch.net/test/read.cgi/gamedev/1330000532/

前スレ
C/C++ゲーム製作総合スレッド Part1
http://toro.2ch.net/test/read.cgi/gamedev/1337516528/
C/C++ゲーム製作総合スレッド Part2
http://toro.2ch.net/test/read.cgi/gamedev/1351015269/
C/C++ゲーム製作総合スレッド Part3
http://toro.2ch.net/test/read.cgi/gamedev/1357899040/
0221名前は開発中のものです。2013/09/29(日) 21:07:58.43ID:vFW2ihcI
>>214-215
数に関してはそんな感じです
なるほど、テーブル使ったほうが確かにイイですね
そしてそのテーブルを扱うためだけの関数を作ろうと思います。

>>220
ふむ・・・少し難しいですね
その方法だとどこでモンスターを指定できるのかが良く分かりません
CBattleにコンストラクタでモンスター種別(ID)を引数にして、
IDによって持たせるポインタを変える…というのは出来ないですよね?
0222名前は開発中のものです。2013/09/29(日) 21:31:00.15ID:hanumcZp
>>220
モンスタークラスのコンストラクタにモンスターデータクラスのインスタンス渡して、
モンスターデータクラスのコンストラクタにはプライマリキー渡して外部ファイルの読み込みとか
02232092013/09/29(日) 22:34:23.36ID:Vo2lxUIs
>>221
モンスターの指定はCMonsterのコンストラクタか初期化関数で
CMonsterDataのポインタを渡せばよい。
イメージとしてはCMonsterDataの統轄クラスがCMonsterを吐き出す工場メソッドを作る感じ。
敵の種類のランダム指定もそのメソッドでやらせればよい。

CBattleについては設計思想にもよると思うが、個人的にはstateパターンを薦めたい。
例えばこんな感じ。
class CState
{
protected:
CMonsterData統轄クラス *monsterdatamanager; //参照するのみ
public:
virtual int OnClick(int x,int y){return 0;} //マウス操作はあまりしないと思うが
};
class CBattle : public CState
{
CMonster *monsters[敵の数];
};
class CFieldMap : public CState
{
};
0224名前は開発中のものです。2013/09/29(日) 23:46:36.57ID:2IWoMpj3
>>205
実家で技術評論社の「はじめてのC」読んでたらオカンと姉ちゃんがすげー剣幕で本をぶんどって行ったことがあったなー。
中身を確認した後顔真っ赤にして戻っていったが。
セックスの教本を居間で読むような度胸が俺にあるわけないでしょう?
0225名前は開発中のものです。2013/09/29(日) 23:55:55.73ID:CMDsZPaO
ワラタ
0226名前は開発中のものです。2013/09/30(月) 20:56:01.83ID:dFNgJ59l
>>203
ゲームによる。アーケードなんかはチート不能だから瞬着の当たり判定とか普通にあるよ
参考になるかどうか分からないけど、ボーダーブレイクの主武器は発砲時にレティクルが
敵に重なってれば「当たり」。クライアント側(プレイヤーの筐体側)で判定してる
わかりやすい例かと
0227名前は開発中のものです。2013/10/01(火) 18:12:36.03ID:IljiT9fF
アクションのネトゲってのも1つの夢ではあるけど
逆に非同期で実現できる面白い仕掛けのゲームも考えてみたいもんだね
0228名前は開発中のものです。2013/10/01(火) 21:39:39.78ID:dkNVaEwC
面白いフリーソフト レビュー&攻略質問スレPart220
ID:l+J8o0sa
http://engawa.2ch.net/test/read.cgi/gameama/1374691097/141
http://engawa.2ch.net/test/read.cgi/gameama/1374691097/144
http://engawa.2ch.net/test/read.cgi/gameama/1374691097/146
0229名前は開発中のものです。2013/10/02(水) 10:08:22.51ID:MEhezrLj
報告乙です
素直に巣に帰ったようで。ありがたい
0230名前は開発中のものです。2013/10/02(水) 18:28:05.54ID:uhqaKlgz
テンプレートメタプログラミングとかいう言葉を最近知ったんだけどさ
コンパイル時に外部リソースを実行ファイルに取り込むのって外部リソースのメリットを潰しちゃうかな?

具体的には、箱庭ゲーとかでのイベント発生時刻(タイムラインっていうの?)とか。

逆に、ユーザーにいじって欲しくないデータは隠せそうだけど、それはそれでプログラムに直書きした定数とどう違うのという疑問もある。

みんなconstexprとか使ってんの?
0231名前は開発中のものです。2013/10/02(水) 18:29:13.84ID:uhqaKlgz
我ながら意味深な文章になってしまった
0232名前は開発中のものです。2013/10/02(水) 19:25:27.70ID:dQghyWFh
真ん中らへんがメタプロの要素なくて文章が繋がってなくて意味がわからんのだが、
それはコピペミスか何かで本当は

>テンプレートメタプログラミングとかいう言葉を最近知ったんだけどさ
>みんなconstexprとか使ってんの?

っていうレスだったのかな?

それなら別に、C++11になるって制約以外には付け得なキーワードだから
付けられるとこには付けとくといいんでないかな
0233名前は開発中のものです。2013/10/02(水) 20:18:22.46ID:Xkv5bAG0
もっぱら面倒臭いかどうかだけで判断してる。
バランス調整でコンパイルがメンドかったら外部ファイル化。
バイナリファイル解析する奴なんてそうザラにいないし、
いざとなれば暗号化すればいいし。
0234名前は開発中のものです。2013/10/02(水) 22:39:00.42ID:LQEQgpgV
C++はネイティブコードを生成するからか
コンパイルが長杉
0235名前は開発中のものです。2013/10/03(木) 00:06:52.85ID:ZwyUWloh
ビルドじゃなくてコンパイルが?
includeが深いとか翻訳単位が多くてコンパイルとリンクが多いと長い事はあるけど
0236名前は開発中のものです。2013/10/03(木) 01:34:00.02ID:SAzGamr4
TMPをゲーム製作で使うことってほとんどなくね
0237名前は開発中のものです。2013/10/03(木) 02:02:11.52ID:S3Z1Fz0v
STLならよく使うが?
0238名前は開発中のものです。2013/10/03(木) 06:56:22.10ID:wIH7+l3L
ビルドとコンパイルってどう違うんだ

ビルド∋コンパイルってことか?
0239名前は開発中のものです。2013/10/03(木) 07:33:06.73ID:CsDHW8Wi
コンパイル=.objファイルの生成
リンク=出来た.objから実行ファイルの生成
ビルド=それらの総称
って事だろ?
今日日、一々使い分ける事もないだろ。メンドくせぇな(^p^)
0240名前は開発中のものです。2013/10/03(木) 07:44:02.31ID:kgKMfZTo
>>234
個人レベルの開発規模なら、昨今ではわりと珍しい言い分だと思うかな

普及価格帯のPCの性能、SSDの普及率、こうした背景の中でPCHを使ってれば
設計が多少ゴチャってても、コードを一部修正した後のビルドは大抵一瞬で終わる

それでも遅いなら、ファイル(ソースやヘッダ)間の依存関係がスパゲッティ状態で
一部の修正が「不必要に」多数のファイルに影響を及ぼしてるとか、ビルド設定が
腐ってるとか、その辺に原因がありそう
0241名前は開発中のものです。2013/10/03(木) 08:36:21.26ID:1JpHSTD+
複数プロセッサのコンパイルが有効になってないとか。
0242名前は開発中のものです。2013/10/03(木) 08:42:00.57ID:vXordIiz
ビルドが速い言語の場合、ビルドから実行まで1秒もかからん
C++はまだ数秒かかるでしょ(Hello, Worldであっても)
多少は高性能な環境だと仮定しても一瞬は盛りすぎ
(そもそも開発環境は一般的な最新PCより劣る場合が多い)
0243名前は開発中のものです。2013/10/03(木) 08:56:12.82ID:edQZBgYu
バランス調整関係の定数を一つのヘッダファイルに纏めると
加速度的にコンパイル時間は長くなる。
逆に、そうならないように各ヘッダで宣言すると
今度は一目で見通せなくなるから面倒臭い。
定数名で検索かければいいじゃねーかと思っても、
定数名なんて覚えてない。
そもそも、バランス調整ごときでIDE立ち上げるのも面倒臭い。
何十回もリトライするケースもあるしね。
0244名前は開発中のものです。2013/10/03(木) 09:22:37.44ID:7ILxSOK4
定数ならextern使えばいいんじゃね?
0245名前は開発中のものです。2013/10/03(木) 09:32:31.11ID:8Paj6jJk
変数考えるのも面倒だしコンパイル時間かかるしで
よく使う変数をまとめた初期化込みGet関数込みのクラスを継承させて
よほど特殊,重要な値じゃないかぎりそこでやりくりしてる

余分な変数大量に宣言&どこのクラスかで同じ変数でも意味が変わって
他人が見てもよくわからんから設計上よろしくないと思うが
普通はいちいちヘッダわけていろんな変数つけんの?

変数格納クラスに変数追加しないかぎりコンパイル時間は気にならない

副作用で変数の節約と機能ごとのカプセル化がうまくなった気がする
0246名前は開発中のものです。2013/10/03(木) 10:27:51.09ID:aQc+PiUU
>>239
"総称"じゃないよ。コンパイルとリンクのステップを順に実行して、最終アウトプットに組み上げるのが、言葉通りビルド。
総称って言っちゃうと語弊がある。

あと今日日分けないって意味だと、コンパイルじゃなくてビルドって言う。
当たり前の事なのでめんどくさい話じゃない。ちゃんと正確に理解しなさい。
0247名前は開発中のものです。2013/10/03(木) 20:24:47.60ID:cC3MwkNs
>>242
・ビルドが速い言語
・ハロワのビルドに数秒かかるC++

これらについての具体的な言語処理系(の製品名)を挙げてくれるとありがたいです。
ハロワ数秒を叩き出すPC環境についても差し支えない範囲でお願いします
あとmakefileかプロジェクトファイル、コンパイルオプションもあると助かります

一応、一般的な最新PCより劣る環境として
CPU:Core i7-860(Lynnfield世代)
MEM:PC3-12800 2GBx2
HDD:1TB 7200rpm
VGA:GTX260(216SP) GDDR3 896MB 2-way
SND:SB X-Fi XtremeGamer
OS:Win7 Pro 64bit (現在はSP1)

4年前にバイトして買ったパーツがこんな感じで、今は押入れの中で
眠ってるんですが、寄せ集めて検証用に一台組んで試してみようかと

SSDNow V100 SV100S2/64Gという3000円程度のローエンドなSSDも
たまたまあるので、これも使ってみようかなと
0248名前は開発中のものです。2013/10/03(木) 22:00:56.49ID:98DwJ9Gs
>>247
安価見逃した上にハロワのビルドが速い言語と空目してしまったのでHQ9+と上げておくw
0249名前は開発中のものです。2013/10/03(木) 22:33:47.68ID:edQZBgYu
大体それ前後のPCで書いてるが、数秒かかるぞ?VC++2008。
0250名前は開発中のものです。2013/10/03(木) 23:13:17.00ID:DhfDfaDp
ハロワ?無職なの?
0251名前は開発中のものです。2013/10/03(木) 23:42:09.30ID:mySEiIjB
数秒でハローワークを建設するスレですが何か?
0252名前は開発中のものです。2013/10/04(金) 00:23:20.56ID:yG2oikok
どうせモジュールの概念もオブジェクト指向も理解せず、一つのファイルに
延々と全プログラムを書き出しているとかいうオチじゃね〜の?
そりゃ重いよ。
0253名前は開発中のものです。2013/10/04(金) 00:26:55.32ID:kN3IM+Rs
ここゲームプログラミングスレじゃなくなってるよな
DXスレのがよっぽどゲーム的
0254名前は開発中のものです。2013/10/04(金) 00:55:47.13ID:yG2oikok
オレオレライブラリのファイルサイズが200kbyteを超えてるとか、
そーゆーよっぽどな理由がない限りは、DXライブラリ使った方が
良いとは俺も思う
0255名前は開発中のものです。2013/10/04(金) 01:11:50.59ID:yG2oikok
あとグローバル変数もローカル変数も一緒くたにしてねーか?
これやられっと処理速度がやたらと遅くなるんだが・・・・・・
0256名前は開発中のものです。2013/10/04(金) 01:25:42.28ID:yG2oikok
そういや、メンバー変数とローカル変数でも処理速度は変わるよな?
0257名前は開発中のものです。2013/10/04(金) 01:32:27.72ID:NV+cCaxO
雑談?
チャット?
0258名前は開発中のものです。2013/10/04(金) 01:32:40.31ID:LBEm60p6
変わるだろうけど今日び気にするだけ無駄じゃね
0259名前は開発中のものです。2013/10/04(金) 02:03:50.60ID:yG2oikok
速度を求めないなら何のためにC/C++を選んでいるんだ?C#の方がよっぽど楽だろうに・・・・・・
0260名前は開発中のものです。2013/10/04(金) 02:13:07.11ID:Vxt/QfR9
>>247
i5に16GB積んでVC2012でハロワをビルドしても数秒かかるよ
I/Oの強化が効果的だけど、例えばFC接続したRAID5構成(HDD24台)でRHELのGCCでビルドしたって一瞬じゃ終わらん

やっぱ、Delphiが最強だな
0261名前は開発中のものです。2013/10/04(金) 02:29:42.32ID:LBEm60p6
メンバ変数とローカル変数の差も気になるくらい速度を求めてるならアセンブリでも書けば
0262名前は開発中のものです。2013/10/04(金) 02:33:31.45ID:yG2oikok
下手糞なアセンブラよりもCのが速いんだが
0263名前は開発中のものです。2013/10/04(金) 02:34:54.05ID:LBEm60p6
じゃあCで速度を追求したらいいんじゃね
0264名前は開発中のものです。2013/10/04(金) 02:46:28.17ID:yG2oikok
C++使うとメモリー管理が楽なんだ。
あと、オブジェクト指向にも向いてるし、モジュール設計も楽。
0265名前は開発中のものです。2013/10/04(金) 03:03:29.50ID:Y9YGW56v
お休みして
0266名前は開発中のものです。2013/10/04(金) 03:05:51.85ID:LBEm60p6
しかもC++使うと変数間の速度差とか気にかけられるぞ
良かったな
0267名前は開発中のものです。2013/10/04(金) 03:31:25.01ID:B5Ii4kbU
コンパイル速度の話がズレてきたぞ
C++が圧倒的に遅いのは最強! 無敵!
0268名前は開発中のものです。2013/10/04(金) 05:40:39.74ID:GRmzq35U
メモリー管理できますって言った時に
別にスマートポインタ使える必要ないよな
アロケータも別に
0269名前は開発中のものです。2013/10/04(金) 08:53:12.46ID:8I+rYF1p
>>268
スマポ普通に使うが、なんで名前を出した?
boost::shared_ptr も、都合によって自前も。「ひらがな書けます」くらいのレベルの話だ。
0270名前は開発中のものです。2013/10/04(金) 08:55:12.20ID:8I+rYF1p
>>254
自前ライブラリとかlibにしとかないか普通。
それでも遅いって話ならいいけど
0271名前は開発中のものです。2013/10/04(金) 11:53:46.23ID:17B7kATN
自分で解放しないとなんか不安だから、スマートポインタって使う気にならないんだけど、
構造が複雑になった場合、どのタイミングで解放されているのかよくわからなくなる
みたいなことってないの?
0272名前は開発中のものです。2013/10/04(金) 11:59:28.70ID:n+pz5jM/
解放忘れがないならいつ解放されてもどうでもよくね?
0273名前は開発中のものです。2013/10/04(金) 12:06:41.37ID:B5Ii4kbU
解放忘れよりつかんでいるつもりがいなくなってる方が怖い
オーナー管理で罠にハマるとつらい
0274名前は開発中のものです。2013/10/04(金) 12:23:47.55ID:17B7kATN
>>272
なんらかのインスタンスを参照している場合、
先にインスタンスを解放してしまったら、
参照している方で不具合が起こるじゃないか。
0275名前は開発中のものです。2013/10/04(金) 13:38:33.03ID:8I+rYF1p
>>271
考え方的に逆。って言うかちょっと違う。
「いつ解放されるかわからない」って状況はスマポ使う使わない以前の自分が動作を認識してるかって話であって、
ライフサイクルは自分がわかった上で利用するんだよ。
つまりそのデストラクタはいつ呼ばれるかってのを自分がわかってて書いてるのが前提。
スマポはその上の保険と省力。
0276名前は開発中のものです。2013/10/04(金) 13:41:02.20ID:8I+rYF1p
>>274
それはスマポに限らず設計の問題。
JavaやC#にあるGCと混同してないか?
全く別物で、スマポは単純だぞ
0277名前は開発中のものです。2013/10/04(金) 14:30:37.37ID:D4r1gxKk
C++でもインクルードするファイルの数を少なくしたりすると早くはなるけど限界あるだろ
だからコンパイルの高速なスクリプト言語を組み合わせるんだ
0278名前は開発中のものです。2013/10/04(金) 15:16:13.30ID:PrPp4O7S
そういうからboostのPythonいれたら、コンパイルがかなり長くなったんだが
0279名前は開発中のものです。2013/10/04(金) 15:17:40.69ID:OYfw4N/5
スマポってdeleteみたいなことは原則行うの?
たまたま解放忘れてても拾ってくれる保険なら労力増やしてまでやる必要が感じられない
原則delete行わずデストラクタで自動解放が主流なら今すぐ書き換えてくる
0280名前は開発中のものです。2013/10/04(金) 15:31:33.71ID:1sDA81tE
>>279
原則っていうかザックリ言うと、スコープから外れたときにdeleteを自動でやってくれる。

func(){

}
0281名前は開発中のものです。2013/10/04(金) 15:38:32.32ID:1sDA81tE
>>280 ごめん途中で送信してしまった
func(){
smart_ptr<foo> bar(new foo);
なんかごにょごにょ
} <- barだけしか使ってないならここで解放

これが基本だが、スマポ同士で代入ができるやつは関数の戻り値に渡したりするとスコープを超えられるのもある。
なので、いろいろな場所で使っていても、結果的にすべて共有しなくなった時にdeleteしてくれたりする。
0282名前は開発中のものです。2013/10/04(金) 15:57:27.76ID:LJJoT65R
なるほど、スコープはずれたら&他に参照とかなかったらデストラクタが起動してデリートするのか
ちょっと勉強と動作チェックしてくる
0283名前は開発中のものです。2013/10/04(金) 16:17:23.72ID:pWUsBtby
>>281
マジかよ
スマポってそんな凄いやつだったのか!
でもそもそもnewとかdeleteしないプログラムしか書いたこと無いから意味無いような気がする・・・
0284名前は開発中のものです。2013/10/04(金) 16:23:01.59ID:8I+rYF1p
>>280 >>282
なんか気になったので補足しておくと、

> デストラクタが起動してデリートするのか

delete された時、解放時の処理の為にデストラクタが呼ばれるんだぞ?
意味わかってるのか不安になった。
0285名前は開発中のものです。2013/10/04(金) 16:23:58.50ID:8I+rYF1p
>>279>>282 。安価みす
0286名前は開発中のものです。2013/10/04(金) 16:31:39.55ID:8I+rYF1p
ああちゃんとレス読んでなかった。
スマポクラス側のデストラクタが呼ばれたら、スマポクラスが保持しているポインタをdeleteするって意味ならその通り。
ただそれだけの仕掛け。

>>284-285 はスルーで。てかクラスの入れ子関係で、デストラクタの中で、
子要素のデストラクタ呼ぶような処理普段書いてたら簡単にわかる話だ。

boost::shared_ptr はそれプラス、コピコンやコピーオペレータを持ってるだけ。だから単純な仕掛け。
0287ID:17B7kATN2013/10/04(金) 16:41:09.39ID:Khs7TfOG
>>280
それは単純な例だけど、
構造が複雑になった場合、例えば複数のヒープ変数が必要で、一方が他方を参照している場合とか、
>どのタイミングで解放されているのかよくわからなくなる
ってならない?

>>281
これまさに
>どのタイミングで解放されているのかよくわからなくなる
ってならない?
0288名前は開発中のものです。2013/10/04(金) 16:42:12.87ID:1sDA81tE
単純な仕掛けだけど、これ考えたやつ頭いいよな。

解放忘れがないか、二重デリートがないか、インスタンスが生きているか、適切なライフサイクルか、、、、
などと複雑になりやすいコードに神経を使うよりも、
スマポを持ってたら生きているのが保障されるからコードが見やすくバグも少なくなるし。

たとえば、STGなんかで親子関係を持った敵がいたとして
親が破壊されたとき、子は生きていて親を参照している場合、
スマポなら親を生存リストから外すだけでおkで、子が全滅した時点で勝手にdeleteされるなーんて。

生ポならずっと子が生きているか監視しなければならないし。
この部分のコードが減るだけでバグが少なくなるよね。

ほんとスマートだわ。
0289名前は開発中のものです。2013/10/04(金) 16:48:05.11ID:1sDA81tE
>>287
基本的にどのタイミングで解放されてもいいんだよ。むしろ気にするような組み方はよろしくない。
アクセスしたときに必ず生存していることが重要。
循環参照には気を付けないといけないけど。
0290名前は開発中のものです。2013/10/04(金) 16:53:36.47ID:Khs7TfOG
>基本的にどのタイミングで解放されてもいいんだよ。むしろ気にするような組み方はよろしくない。
メモリをケチろうとして重複を無くそうとすると、
参照関係が複雑にならないか?
0291名前は開発中のものです。2013/10/04(金) 17:00:08.29ID:1sDA81tE
>>290
そんなギチギチの環境で組んでるの?
たぶん、そんな複雑な参照してる場合は設計を一度見直したほうがいい場合があるよ。
0292名前は開発中のものです。2013/10/04(金) 17:53:17.80ID:D4r1gxKk
循環参照になるような時は弱参照
0293名前は開発中のものです。2013/10/04(金) 19:27:18.60ID:B34lM/72
>>277
実行中に書き換えられるようにすると凄く便利らしいね、ああいうの
0294名前は開発中のものです。2013/10/04(金) 19:32:50.22ID:pTcYqrKi
コンストラクタでエラーを出す方法は例外だけ。
例外使う場合、正しく確実にファイナライズ処理を実行する方法は事実上スマポだけ。
なので細かい事を言えば、スマポを一切使わない場合、例外禁止&2段階初期化必須&コンストラクタ内では代入くらいしかしてはいけない、みたいな設計上の制約も出てくる。
スマポは超便利ってのもあるけど、こういうC++の暗黒面を補う事情もあったりする。
0295名前は開発中のものです。2013/10/04(金) 20:21:48.75ID:8I+rYF1p
関連記事として…
More C++ Idioms
http://ja.wikibooks.org/wiki/More_C%2B%2B_Idioms
0296名前は開発中のものです。2013/10/04(金) 21:39:25.40ID:pWUsBtby
今ネット通信ゲーム作ってるんだけど
SOCKETの変数をいろんなところでメッチャ使うんだけど
これを引数で持ってきてたんだけど、グローバル変数にしてやった方が圧倒的に楽だよな
でもグローバル変数って使わないべきだし、シングルトンも同じだから使わないべきなんだけど
こういうときってどうすりゃいいの
0297名前は開発中のものです。2013/10/04(金) 21:46:22.36ID:yG2oikok
グローバル変数を使うなというのは全体構造を分かり難くするから
使わない方が無難というだけ
必要があるなら遠慮なく使えばいい
0298名前は開発中のものです。2013/10/04(金) 21:49:17.96ID:pWUsBtby
>>297
ありがとうございます
0299名前は開発中のものです。2013/10/04(金) 21:59:15.94ID:yG2oikok
そもそもnamespaceとかexternってグローバル変数を活用するための機能だからな
0300名前は開発中のものです。2013/10/05(土) 06:58:26.67ID:42i+ls1b
>>288
子の参照を持ってるのは親だけなのでは
0301名前は開発中のものです。2013/10/05(土) 08:55:09.52ID:zPZwPgbh
>>296
グローバル変数を使うなと言われる理由はいくつかあるけど、その一つに変数は関数より柔軟性が低いってのがある。
メンバ変数をプライベートにしてsetter/getterを作れっていうのと事情は大体同じ。

例えば、4人対戦ゲーの場合、プレイヤーIDを表す変数は0〜3までの値しかとって欲しくないとする。
変数に直接代入する場合、いざ使う時になってIDが正しいかチェックする必要があって、プレイヤーIDが0〜3になっているかチェックするコードが全体にばらまかれる。
関数経由で代入する場合、引数の値をチェックしてエラーを投げることができるので、値の範囲をチェックするコードは最初のsetterだけで済む。

変数は代入しか出来ないけど、関数は付随する処理(引数チェック、ログの記録)が出来るし、仕様の変更にもある程度柔軟に対応できる。
(プレイヤー人数を6人に増やしたいと思ったときに修正しなければならい箇所の違いを考えると…)


理想的には、Socket自体は通信関係のコード以外に触れられないようにして、

SendAttack(OBJECT_ID target);
SendMove(OBJECT_ID id, Position pos);
SendChat(PLAYER_GROUP_ID groupId, const char* msg);

みたなゲームの仕様に合わせたパケット送受信関数を作って、それをゲームロジック全体で使う。

この手の送受信関数を纏めたクラスのオブジェクトが、シングルトンやグローバル変数になるのは仕方ないんだけど、
Socketが丸出しのグローバル変数ってのはあんまりよくはないな。

まぁ小規模なゲームを一人で書いてる内は、そこまで致命的でもなかったりするが。
まだ仕様がハッキリと見えてない段階でプロトタイプを書いてるときは、何も考えずグローバル変数の方が手早い事も多いし。
長文でスマン。
0302名前は開発中のものです。2013/10/05(土) 09:16:22.33ID:0JH/7YRj
どっちかって言うと実際に使った時直面する問題って、グローバルに複数置いてる物があって、それらが相互に関わってるような時、
開放順が保証されないからデストラクタで何か処理するような場合困るかもしれないって事と、

namespaceも分けて無いグローバル変数でかつexternだらけとかになると迷子になる上、別の翻訳単位にもしも同名があった時面倒な事になる、ってのが

大昔に経験したリアルな問題
0303名前は開発中のものです。2013/10/05(土) 09:18:23.46ID:0JH/7YRj
ちなみに、「翻訳単位内でのローカルな範囲で良いグローバル変数」には、
普通 static キーワード付けて、externさせないってのが常套手段だよな。
0304名前は開発中のものです。2013/10/05(土) 09:31:57.77ID:6oF2RLCd
static = private
extern = public
0305名前は開発中のものです。2013/10/05(土) 12:18:22.70ID:pPsHi/Df
>>300
そうは限らないよ。
親から一定間隔離れて行動したり、親の状況で振る舞いを変えることがあるから。
どちらの場合もある。
0306名前は開発中のものです。2013/10/05(土) 12:29:05.40ID:lHo24dEm
extern Kelsi Olesya_Rulin;
そう、グローバルを遠慮する必要なんてない、ってのは合意事項だよな
0307名前は開発中のものです。2013/10/05(土) 13:13:45.24ID:lHo24dEm
あれ、コンパイル通らなかったか。
そうか参照が抜けてたか。
http://images2.fanpop.com/image/photos/9400000/kelsi-high-school-musical-9487566-333-500.jpg
http://img.photobucket.com/albums/v515/bloodylamer/bastardly-photos/0505/album102/olesya-rulin-09040702.jpg
これでどうだ。
0308名前は開発中のものです。2013/10/05(土) 15:33:55.63ID:hWuxl6U4
>>305
親から全ての子に指示するべきじゃない?
子供が親の参照はよくないと思う
0309名前は開発中のものです。2013/10/05(土) 16:02:12.04ID:hYYXb5oU
>>308
Ogre3Dは親子それぞれ参照をもってるんだがな
0310名前は開発中のものです。2013/10/05(土) 16:25:59.47ID:pPsHi/Df
>>308
それも場合によると思うなぁ。親を辿りたい時があるし、
親が子に干渉しすぎるのはちょっと、という考え方もあるだろうし。
0311名前は開発中のものです。2013/10/05(土) 17:01:45.43ID:GFX991pR
親子の捉え方が違うとなんともいえんような

例えばシューティングでの位置関係なら
親の移動が子全体に影響するなら、親が子の参照を持っているのが便利だよな
これはシーングラフみたいなやつか、スプライトとかはコッチだろうな

逆に子が親の行動をトレースするタイプだと参照の持ち方は逆になる
こっちはカメラのスナップかな、親が持つんじゃなくて、子が勝手にぶらさがる
0312名前は開発中のものです。2013/10/05(土) 18:02:50.50ID:G4p0Eaf6
親ノードは子ノードの配列を持ち
子ノードは親ノードの弱参照を持つという形にしている
0313名前は開発中のものです。2013/10/06(日) 12:59:02.01ID:zo41YPA1
親子関係といっても様々な層にあるからねぇ
例えばゲーム設定上の関係性(物理、組織、通信回線、人間模様、etc)は色々だし
これらの関係性も、実装上は、制御(操作)の流れ、データの流れ、色々だし

話の前提条件が何かを伏せてる限り、問題の所在も実装の最適解も本人にしかわからん
説明が面倒なら、頑張れとしか言えん
0314名前は開発中のものです。2013/10/06(日) 19:46:28.52ID:iRwfUiRG
アクションなんかで敵キャラクターの種類によって戦闘ロジックを変える場合って、種類ごとに継承するのが普通?
それとも、戦闘ロジックの部分だけ無名関数で差し替えるとか?
0315名前は開発中のものです。2013/10/06(日) 19:56:21.47ID:NCxdwdJm
戦闘ロジックには関数ポインタを使った事と、スクリプト言語を使った事がある
処理速度では前者、汎用性では後者だな
0316名前は開発中のものです。2013/10/06(日) 22:48:36.24ID:Gau/gyhr
>>314
前者が、敵1体を1単位とするような粗い粒度の処理の差し替えの話で
後者が、無名関数でもおkな程度に細かな粒度の処理の差し替えの話なら

場合に応じてそうした実装の使い分けをするというのは普通にアリなのでは
0317名前は開発中のものです。2013/10/07(月) 00:06:33.12ID:Z8udyLbh
分解能について教えて欲しいんだけど
timeBeginPeriodとtimeEndPeriodはプログラム全体で同じ分解能なら開始時と終了時に1回呼ぶだけで合ってる?
それともタイムを使うごとに毎回呼ばないといけない?
0318名前は開発中のものです。2013/10/07(月) 00:19:23.88ID:peQndcOh
毎回呼ぶのは無駄ぽいんだが
1回だけだと他のプロセスで精度を悪いほうに変えられたら駄目だろうな
0319名前は開発中のものです。2013/10/07(月) 00:33:00.85ID:Z8udyLbh
>>318
ありがとうございます
そうか他のプロセスで弄られる可能性が有るから毎回呼ぶほうがいいのか・・・
1回呼べば固定されるはずなのにサンプルコードで何で毎回呼ぶのかわからなかったけどようやくわかった
0320名前は開発中のものです。2013/10/07(月) 10:34:56.91ID:cd4YBeJh
>>317
一回でいい。
ただtimeBeginPeriodとかはOS共有だから
他のアプリで操作されたらどうしようもない。
■ このスレッドは過去ログ倉庫に格納されています