ゲームにおけるデータ構造・クラス設計・パターン2
■ このスレッドは過去ログ倉庫に格納されています
0001名前は開発中のものです。
2008/05/23(金) 21:10:59ID:8M1gqhPXどのようにクラス設計をすればよいか、
継承・委譲関係はどのようにすればよいか、
使えそうなパターンは何かなど語るのもよし。
自作ゲームの内容とクラス図を書いて
改善案を聞くもよし。
設計に関して困ったことを質問するもよし。
関数の具体的な実装内容やゲーム内容に関しては他スレに譲る。
大いに語れ。
前スレ
http://pc11.2ch.net/test/read.cgi/gamedev/1155209226/
テンプレ追加事項あったらよろすく
0461名前は開発中のものです。
2009/02/14(土) 10:08:02ID:hPf9zE7f0462名前は開発中のものです。
2009/02/15(日) 16:27:42ID:933sIzghそんくらいしかやっていないな。
0463名前は開発中のものです。
2009/02/18(水) 14:05:52ID:1weRwVkoいろいろありがとう。
あらかたデバッグ用に実装してみました。
0464名前は開発中のものです。
2009/02/18(水) 14:39:48ID:0gTNCSoI素晴らしい。見習いたい
0465名前は開発中のものです。
2009/02/19(木) 03:37:37ID:4unT5BXHコリジョン可視化:テクスチャ読み込み後に四隅に沿って緑色で四角線を書くだけ
パラメータ操作:テンキーで実装
4と6で対象パラメータを選択 (あらかじめ操作対象を手動でlistしておく)
789でパラメータ上昇(7で+1,8で+10,9で+100)
123でパラメータ下降(1で-1,2で-10,3で+100)
0で強制0(bool値ならfalse)
便利ボタン:戦闘強制勝利機能とエンカウント無効をFXXキーに割り当て
速度コントロール:VSync非同期にして、FPSを上げることで対応
2倍にすると早すぎたので、1.5倍(90fps)をボタンに割り当て
リプレイ機能:フレームごとの入力(キーボード/ジョイパッドを合わせた入力値)をファイルに出力
(一見単純そうだけど、セーブ/ロードの関係でこれには実装に手間取った)
作っているのがRPGなので、便利ボタンとパラメータ操作がとても役に立っています。
ありがとうございました。
0466名前は開発中のものです。
2009/02/21(土) 07:24:48ID:3Qcrn5prゲーム中でもコンソール出して直接変数いじったりできるのがあるよな。
0467名前は開発中のものです。
2009/02/21(土) 12:50:08ID:YLpnm94h0468名前は開発中のものです。
2009/02/24(火) 16:03:05ID:xS4ZudQO0469名前は開発中のものです。
2009/02/25(水) 02:46:38ID:1o4GjPkR次のC++規格が決まれば、早ければ今年中にも
std::shared_ptr
として使えるようになる予定
今でも既に std::tr1::shared_ptr になってるけど
0470名前は開発中のものです。
2009/02/25(水) 05:08:14ID:M8Pe/6zZまず一般的に、スマートポインタは動的確保されたヒープに用いるとして。
使いどころは、
・ヒープの解放処理を書くのが面倒であったり忘れてしまいたいとき
・ヒープの被参照期間を別のオブジェクトらの生存期間と一致させたいとき
・ヒープの参照状態を把握したいとき
・これまでのソースが生ポインタで参照しまくり不正参照でメモリ破壊しまくりで発狂しそうなとき
だと思う。
0471名前は開発中のものです。
2009/02/25(水) 11:43:26ID:woJXacCs0472名前は開発中のものです。
2009/02/25(水) 18:18:12ID:QjeqtKpKいろんなとこから参照されていて、開放時期が掴めないときは最高に便利
理論的には、参照カウンタが0になったら自動的に消えていってくれるよ
0473名前は開発中のものです。
2009/02/25(水) 18:28:42ID:nKINhS/o私のように
0474名前は開発中のものです。
2009/02/25(水) 18:31:43ID:Z+e+XbPJ0475名前は開発中のものです。
2009/02/25(水) 18:55:09ID:1o4GjPkRスマートポインタがあれば使われなくなった人材をどんどん自動破棄して・・・
0476名前は開発中のものです。
2009/02/27(金) 15:15:39ID:MDeQuwXlDraw、Moveを持つオブジェクトと画面の表示物が1対1で対応してる設計で、
リソース(画像や効果音)などの情報も全てオブジェクトがコンストラクタで受け取り内部で保持してるいかにもoopな設計なのですが、
Deviceインスタンスは
1、Drawの引数に渡す
2、コンストラクタで引数にとり、各オブジェクトがあらかじめ参照を保持。
3、グローバル変数
4、そもそもその設計はまずい
5、その他
現在2です。
1から3に共通する問題としては、Deviceインスタンスをオブジェクト内で操作した内容が間違ってた場合、
発見がかなりめんどくさそうな所でしょうか?
0477名前は開発中のものです。
2009/02/27(金) 15:58:46ID:XnWaU4Ou0478名前は開発中のものです。
2009/02/27(金) 17:33:53ID:lChaxYTz0479名前は開発中のものです。
2009/02/28(土) 00:40:47ID:OR4wkfx2符号なし整数とか。
どっかにそういう例ないです?
0480名前は開発中のものです。
2009/02/28(土) 08:42:03ID:Cadu6Xk70481名前は開発中のものです。
2009/03/04(水) 04:45:32ID:y6+tTW6Fこんなんでいいか?
ttp://codezine.jp/article/detail/2171?p=2
0482名前は開発中のものです。
2009/03/06(金) 11:34:39ID:7UNSgj8MJavaじゃないんだし
そこまでクラス原理主義にならんでもいいのにと思う
0483名前は開発中のものです。
2009/03/06(金) 13:08:45ID:A313Daxtグローバル変数が欲しいんではなくて、システム全体で一つしかないということを
明示的にする為のパターンだから
0484名前は開発中のものです。
2009/03/06(金) 14:26:30ID:7UNSgj8M普通にstaticで隠してヘッダで関数だけ提供すればいいやんけ
インスタンシエーション必須の言語が苦肉の策でひねり出したのがシングルトン
よーく考えよう
0485名前は開発中のものです。
2009/03/06(金) 14:28:31ID:7UNSgj8M「クラス定義必須、インスタンシエーション普通」の言語だな。
0486名前は開発中のものです。
2009/03/06(金) 15:48:06ID:A313Daxtエンド ユーザーがそのクラスを作成できてしまうじゃないか
作成できないようにしたのがシングルトンだろ
話変わるけどカプセル化って C++ や Java の特長みたいに言われるけど
C言語でも出来るんだよなー
0487名前は開発中のものです。
2009/03/06(金) 16:07:52ID:7UNSgj8Mそのクラスのインスタンスが1つであることを保証するのがシングルトン
クラス(原因)が無ければインスタンス(問題)も無い
だからシングルトン(解決策)も要らんと言っているんだ
C++でのシングルトンはマッチポンプなんだよ
0488名前は開発中のものです。
2009/03/06(金) 16:18:21ID:7UNSgj8M「C++ シングルトン」でググったら出てきたページ
この労力を指して滑稽だと笑ってるんだけどな
Javaなら習得必須の概念だし俺も普通に使うが
C++でこんなん無理してやったら馬鹿みたいだと思わね?
// 生成やコピーを禁止する
↑アホじゃね? 最初からクラスにしなきゃいいじゃん
クラス原理主義に陥って思考停止しちゃってるんじゃないか
目的と手段の関係について考え直してみるといい
0489名前は開発中のものです。
2009/03/06(金) 16:29:34ID:7UNSgj8Mそれ以外だとやっぱり儀式めいたものを感じるな
0490名前は開発中のものです。
2009/03/06(金) 16:29:53ID:oPKUKLY9ID:7UNSgj8Mが単なるC++においてのクラスアンチなだけに見える件
0491名前は開発中のものです。
2009/03/06(金) 16:34:17ID:7UNSgj8Mアンチクラスなんて単語あったんだ
知らなかった
C++でもクラス使いまくりなんだけど
C++でシングルトンやらないだけでアンチクラスか
0492名前は開発中のものです。
2009/03/06(金) 16:39:54ID:7UNSgj8Mhttp://www.google.co.jp/search?hl=ja&q=%E3%82%AF%E3%83%A9%E3%82%B9%E3%82%A2%E3%83%B3%E3%83%81&lr=lang_ja
ググるとアンチクラスが出てくる上にプログラムカンケーねえしw
まあいいや
C++シングルトン症候群と命名しておこう
マジで一度考え直した方がいい
0493名前は開発中のものです。
2009/03/06(金) 16:57:37ID:12yJl3Asコンストラクタをprivateにしたり、
コピーコンストラクタを宣言だけ記述したりするだけじゃん
>↑アホじゃね? 最初からクラスにしなきゃいいじゃん
クラスで管理する方が都合が良くて、尚且つインスタンスを一つに制限したいものなんていくらでもあるだろう
じゃあシングルトン使わないでインスタンスを一つだけに制限するもっと楽な方法ってなんだよ
0494名前は開発中のものです。
2009/03/06(金) 17:07:43ID:7UNSgj8Mいくらでもあるのか
そういや初期化を意識させたくない場合なんかもクラスで管理した方がいいな
あとは>>489
俺にはこの2つくらいしか思いつかんが
こういう風にクラス化する理由があるならいいんじゃね
>じゃあシングルトン使わないでインスタンスを一つだけに制限するもっと楽な方法ってなんだよ
>>484
0495名前は開発中のものです。
2009/03/06(金) 17:20:31ID:12yJl3Asまあでもお前がその方が楽だと言うなら尊重するよ
一緒に仕事する相手じゃないからな
0496名前は開発中のものです。
2009/03/06(金) 18:55:30ID:Erqh3NJs素直にシングルトンにしたほうがイディオム的に分かりやすいと思う。
ファクトリメソッドとかで、普通のオブジェクトと同じように生成したい場合も、
シングルトンのほうが便利だよね。
それと、あとから「やっぱシングルトンやめ」ってなったときに、
変更が少なくてすむのも利点かなあ。
0497名前は開発中のものです。
2009/03/06(金) 20:00:35ID:z7QigqBL他人に強要しなければね
0498名前は開発中のものです。
2009/03/12(木) 10:42:00ID:X7nBBwQAinterface // 宣言部(C++のヘッダーにあたる)
type
TPrinter = class // クラスの宣言
:
end;
function Printer(): TPrinter;
implementation // 実装部(ヘッダーじゃない方)
var FPrinter: TPrinter; // グローバルへんすうw
function Printer(): TPrinter;
begin
if FPrinter = nil then FPrinter := TPrinter.Create; // TPrinter生成
Result := FPrinter
end;
厳密にインスタンス化の制限とか、もはやどうでもいいクラスw
0499名前は開発中のものです。
2009/03/12(木) 10:43:53ID:X7nBBwQA捕捉:
(わかると思うけど)使う時は、他のユニットから
Printer.HogeMageSimasu;
見たいに使う
あと抜けてるけど、実際には、finalzation節?でアプリ終了時のFPrinterの開放処理がある。
0500名前は開発中のものです。
2009/03/16(月) 15:21:22ID:FTtiBwy20501名前は開発中のものです。
2009/03/18(水) 23:45:50ID:1sOkzJT6今まであちこちに散らばって状態で書いてたんだけどなんか扱いづらい。
下みたいな感じで一箇所にまとめた方がいいのかな。
今:あちこちでデバイスにアクセス
void draw_landform(void) {
...
lpD3DDEV->draw(...);
}
void draw_menu(void) {
...
lpD3DDEV->draw(...);
}
案:デバイスアクセスは1箇所。デバイスに渡すデータをあちこちで作る。
const DrawData *draw_landform(void) {
...
return ...;
}
const DrawData *draw_menu(void) {
...
return ...;
}
void main_loop(void) {
draw_data.push(draw_landform(), ...);
draw_data.push(draw_menu(), ...);
lpD3DDEV->draw(draw_data, ...);
}
もし既に案の方法でやってる人いたら使い勝手教えて!
0502名前は開発中のものです。
2009/03/19(木) 04:54:27ID:KYbRBn+zだが俺はモーションインデックスとベクトルをリストに投げて後で一気に処理する方法だから答えられそうに無い
お前らに任せたぜっ!
0503名前は開発中のものです。
2009/03/19(木) 05:21:17ID:XLj1eEa+0504名前は開発中のものです。
2009/03/19(木) 19:28:19ID:ALN5WhPjlpD3DDEV->draw(draw_data, ...);
は
draw_data.draw(...);
みたいにしてlpD3DDEVに直接アクセスしない方が…
0505501
2009/03/20(金) 00:10:41ID:/TREybMM>>502
「案」の方に似たやり方だよね? draw_dataがリスト相当で。
やっぱやってる人いたか。採用してるってことは使いやすいんだろうか
>>503
void LandForm::draw(LPDIRECT3DDEVICE9 lpD3DDEV) {
...
lpD3DDEV->draw(...);
}
みたいな感じ?
デバイスに直接アクセスする処理が複数のクラスに散らばるのはOKという判断?
この方が使いやすいってことかな? うーん。。。
>>504
Draw_data::draw(...) {
this->lpD3DDEV->draw(this->draw_data, ...);
}
こんな感じ? ラッパー作れって話?
「案」ではないってことは 503 さん宛てのコードと同じ感じでやってるのか
うーん、デバイスクラスに依存するクラスが増えると身動き取りづらくなると思うんだけど
気になる人って少ないんだろうか。
0人では無かったけれど。
0506名前は開発中のものです。
2009/03/20(金) 02:39:39ID:D2lp0Ec40507名前は開発中のものです。
2009/03/20(金) 04:52:36ID:09EDEaYzstruct Element { // 訪問される側の基底クラス
virtual void accept(Visitor&) = 0;
};
class Landform : Element {
public:
virtual void accept(Visitor& x) { x.visit(*this); }
Data* getLandData();
private:
...
};
class Menu : Element {
public:
virtual void accept(Visitor& x) { x.visit(*this); }
Data* getMenuData();
private:
...
};
struct Visitor { // 訪問する側の基底クラス
virtual void visit(Landform&) = 0;
virtual void visit(Menu&) = 0;
};
class DrawingVisitor : Visitor { // 各要素を訪れて描画を行うクラス
public:
DrawingVisitor(LPDIRECT3DDEVICE9 p) : pDevice(p) {}
virtual void visit(Landform& x) { pDevice->draw(x.getLandData()); }
virtual void visit(Menu& x) { pDevice->draw(x.getMenuData()); }
private:
LPDIRECT3DDEVICE9 pDevice;
};
続く…
0508名前は開発中のものです。
2009/03/20(金) 04:53:53ID:09EDEaYzelementList.push_back(landform);
elementList.push_back(menu);
void mainLoop() {
DrawingVisitor visitor(lpD3DDEV);
for(ElementList::iterator i = elementList.begin(); i != elementList.end(); ++i) {
i->accept(visitor);
}
}
うーむ…。
0509501
2009/03/21(土) 12:54:05ID:Y4F/PoMw今回の話ではModelとControllは関係なくて、Viewの枠内だけで完結する話だと思ってる
>>507
複雑すぎて俺の頭では完全には理解できないけど、
> virtual void visit(Landform& x) { pDevice->draw(x.getLandData()); }
> virtual void visit(Menu& x) { pDevice->draw(x.getMenuData()); }
ここを見るとデバイスに直接アクセスする処理を1クラス内、複数関数にまとめたって感じかな
うーん…、複数の関数にデバイスアクセス処理が分散してるとこがあまりうれしくないかな。
(俺には複雑過ぎるのはさておき)
俺が扱いづらいと思ってるところは、
pDeviceさえあればdraw()以外にもbegin_render()とかset_camera()とかいろいろ
デバイスに対して変更加えることができちゃうわけで、
それをばら撒くってことはいつどこでデバイスに変更が加わるか、例えばいつどこで何回begin_render()されてるのか
とかが追跡しづらくなる。これは1週間後の自分に優しくない。
こんな感じでデバイスに直接アクセスする処理をどう管理したもんかと考えて
ひとつの対策案としてデバイスアクセス処理を1関数内に限定しちゃえってのが >>501 の「案」。
だから例えば複数の関数に同一デバイスへのアクセス処理が分散してるのは自分的には問題が解決していないと感じる。
0510名前は開発中のものです。
2009/03/22(日) 03:32:29ID:O7e3N6nq>>501だとそこをどう処理するのかがよく分からない。
各オブジェクトには描画スクリプトみたいのを作らせておいて、draw()がそれを解釈して描画とか?
そうじゃないなら、結局デバイスをやりとりしなきゃならなくなるような。
0511501
2009/03/23(月) 00:38:25ID:/nVLLFvd確かに。描画スクリプトかー、どうしよう。
ポリゴンの描画順番の最適化とかやり始めたら必要になりそうな気もするけど
今の自分のプログラムでは大げさすぎるかなぁ。今のところ2D的にしか使ってないし。
あとデバイスってサウンドとか入力装置とかもあるけど、それらもおんなじ感じで取り扱いたいし。
デバイスにアクセスする処理が関数1個の中に「ひとまとまりで」収まってればOKとするなら
下のように書いて済ませられるかな?
void dev_state1(void) {
lpD3DDEV->BeginScene();
lpD3DDEV->set_parameter(...);
lpD3DDEV->draw(draw_landform(), ...);
lpD3DDEV->set_parameter(...);
lpD3DDEV->draw(draw_menu(), ...);
lpD3DDEV->EndScene();
}
ひとまとまりってのは1フレーム分のデバイスアクセス処理全部。
描画内容を大きく変えたい時はdev_state2()とかをまた別に作っておいて、
ゲームのステートに応じてどれを実行するか切り替える。
なんか描画スクリプトの方が夢があるな。
外部GUIツールで描画内容を設計して
吐き出した描画スクリプトをゲームで解釈して表示とかおもしろそう。
でも描画システムの根幹過ぎて汎用的に作るのめんどくさそう。。。
うーん、とりあえず簡単に済ませたいからdev_state1()みたいにベタ書きで
どこまでいけるかやってみるかな。
0512名前は開発中のものです。
2009/03/25(水) 00:59:33ID:koP5FPqt0513名前は開発中のものです。
2009/03/25(水) 12:39:16ID:C50L0uFm0514名前は開発中のものです。
2009/04/05(日) 14:24:00ID:a5PaoF6Bデバイス用スレッド 仮想描画コマンドを解釈して実際のコマンドを発行
利点 単体テストが容易、移植が容易、マルチコアの恩恵を受けることができる
欠点 仮想描画コマンドバッファの管理にロック、セマフォは必須、上手に使用しないと逆に重い
0515名前は開発中のものです。
2009/04/06(月) 03:21:58ID:NgKFyYts0516名前は開発中のものです。
2009/07/15(水) 22:32:12ID:1c2msACvクライアントからサーバーに要求を送って、サーバーから要求を受け取るような機能を付け加えたいんだが、どういう設計にすればいいかわからない。定石みたいなのがあったら教えてほしい。
今のクラス構成
ScreenManger-->ScreenGame-->Title
| |->Main-->Map -|
| -->Unit--->sprite--|
|--------------------------------------------------------------->GraphicsWarpper
0517名前は開発中のものです。
2009/07/15(水) 22:40:07ID:h6KyoexM0518名前は開発中のものです。
2009/07/15(水) 22:41:36ID:3ppQI3l+> ScreenManger
画面飼槽
> GraphicsWarpper
グラフィックスワープ装置
何が言いたいのかさっぱりわからないのだが。
0519516
2009/07/15(水) 22:46:53ID:1c2msACv忘れてました。
net frameworkを使ってます。
>>518
ScreenMangerはスクリーンマネージャという意味で、シーン全体を管理してます
GraphicsWarpperは単なるラッパーです。
0520名前は開発中のものです。
2009/07/15(水) 22:57:45ID:cL81hhcG0521名前は開発中のものです。
2009/07/15(水) 23:01:47ID:3ppQI3l+> net frameworkを使ってます。
.NET Framework を勝手に先頭のドットを省略したり、勝手に小文字に変えたりするなよ・・
> ScreenMangerはスクリーンマネージャという意味で、シーン全体を管理してます
それならMangerではなくManagerだろ。
> GraphicsWarpperは単なるラッパーです。
それなら、WarpperではなくWrapperだろ。
小学校は夏休みなのか・・
せめて中学生になってからにしてくれ
0522名前は開発中のものです。
2009/07/15(水) 23:14:16ID:1c2msACvすまん。スペルミスった・・・。
0523名前は開発中のものです。
2009/07/16(木) 01:35:23ID:Ac1CnfQdそうじゃなくても、変数名などを略すのはやめた方がいい、複雑なコードになると対応できない
自分はdeleteHandCardListみたいな長い名前つけたりするけど、困ることは1つもないね
ちなみに件の話に関しては書籍があるよ
GameDeveloperのオンラインゲームの青本
MMORPGを作る赤本もある
2chで説明すると1スレ使っても無理だと思う
0524名前は開発中のものです。
2009/07/16(木) 02:06:03ID:Dq9kBSTxありがとう。
それをあたってみる。
0525名前は開発中のものです。
2009/07/16(木) 02:29:30ID:lK28N0n10526名前は開発中のものです。
2009/07/16(木) 05:49:13ID:0eDNLm6a0527名前は開発中のものです。
2009/07/16(木) 10:25:09ID:irpkCXOF0528名前は開発中のものです。
2009/08/14(金) 18:57:02ID:qfXJNhjS>>395
395以前のまとめ
>>404,406-407
シーン遷移考え方
>>408-413,416-425
シーン遷移実装サンプルと問題点。
>>427-433
0からSTGの作成を考える。
根本的な勘違いや非効率的なことがあるのであまり参考にはならない。
>>437-443
オブジェクトと座標管理
>>444-456
オブジェクトと衝突判定と全体効果
>>459-465
デバッグ用処理を考える。(衝突判定表示とか)
>>501-511
DirectXのデバイスの管理とか使い方
>>523
ネットワーク機能参考図書紹介
0529名前は開発中のものです。
2009/08/14(金) 19:24:51ID:qfXJNhjS・・・あんま設計と関係ないな・・・
それっぽい弾の作り方
・コマは2コマは以上用意して、画像の色を通常っぽいのと白っぽいのにする。アニメは4コマあればきれい。
・ケイブっぽい弾を作る場合。1コマ作った後、コピーして1ドットぐらい前後ずらし、形を適当に修正。明るい部分はなるべく中心に近づくよう修正。
・円形の回転する弾の工夫。わざと中心から斜めに1ドットずつずらす。
ちょっと光ったエフェクトとか。
・メイン画像と残像(というか残光)画像を用意。後は適当に残像表示の要領で重ね描画。
・センコロのブーストエフェクト。適当な○画像をブースター付近から扇子状に放射するだけ。それっぽいブーストグラフィックが得られる。
弾やエフェクトはポーズ連打して見てみたりすると、プログラムと画像をうまく考えれば誰でも作れるものが多い・・・気がする。
0530名前は開発中のものです。
2009/08/14(金) 22:21:56ID:FZUQWr9u設計というよりは演出(エフェクト)の話でしょうか。
もし続けるなら専用のスレを立てた方がよいと思われ。
0531名前は開発中のものです。
2009/10/05(月) 01:40:33ID:mQYy5BRf経営状況や主人公の内部パラメータと呼ばれる
データ群がごっそりあると思いますが,
そういったものの管理は
実際のゲーム開発でどういった形でなされるものですか?
データクラスを作ってアクセッサで操作を許す?
それとも,すべてグローバル変数で持たせる?
0532名前は開発中のものです。
2009/10/05(月) 04:33:25ID:/TvwIsfE0533名前は開発中のものです。
2009/10/05(月) 07:34:29ID:Rel4l/Gg0534名前は開発中のものです。
2009/10/14(水) 22:12:56ID:TwzkU58sただ、データの表示とかはいつも頭を捻らすなぁ。
0535名前は開発中のものです。
2009/10/15(木) 07:50:05ID:P3b4xThD0536名前は開発中のものです。
2009/10/15(木) 08:41:22ID:OtHf9VTl0537名前は開発中のものです。
2009/10/15(木) 15:54:18ID:byjv3si3オタクの頭ん中は
0538名前は開発中のものです。
2009/10/15(木) 20:13:55ID:P3b4xThD意見を頂けるだけで嬉しいです.
むしろ噛み付くほうが迷惑です.
0539名前は開発中のものです。
2009/10/15(木) 22:16:10ID:r8d5RKMA質問は実際のゲーム開発だから、面倒でも形式的にやるしかないんじゃない。
0540名前は開発中のものです。
2009/10/15(木) 22:18:05ID:2byzEsEEアクセッサ書くのめんどくさいって言ってたら
コーディングが意味不明になってやる気をなくす自信がある。
実際それで何回も挫折した。分かりにくくなるくらいならメンドイ方がマシ。
0541名前は開発中のものです。
2009/10/15(木) 23:29:40ID:r8d5RKMAアクセッサ書くのもめんどくさいとは思わない。
0542536
2009/10/16(金) 00:35:50ID:L+kS7tAJ悪い、噛み付くとかそういうつもりは無かった。
普通に設計して、グローバルにアクセスする必要があるデータを持ってるクラスだけ
Facade経由でアクセスできれば良いんじゃないかと思っただけ。
グローバル変数はさすがにあり得ない…
0543名前は開発中のものです。
2009/10/16(金) 01:18:33ID:MsmDVyev参考になりました,ありがとうございます.
0544名前は開発中のものです。
2009/10/16(金) 01:38:32ID:tEeFyBBHスタティックグローバルな変数を、何らかのアクセス関数を通して更新/参照するような設計は普通だと思う。
// gamedata.h
void update();
int get_parameter1();
// gamedata.cpp
static int s_paramter1 = 0;
static int s_paramter2 = 0;
....
void update() { /* 更新 */ }
int get_parameter1() { return s_paramter1; }
唯一しか存在しないゲーム中のデータをどう実装・管理するか、って視点だけで考えれば
スタティックグローバルであろうと、クラスであろうと大差ないと思うけど、
ある時点でのスナップショットを扱う必要がある、みたいな場合、
// gamedata.h
void update(Data* gamedata);
int get_parameter(Data* gamedata);
て感じで、結局データを引数で取る形になるから、クラスで実装して方がいいんじゃないかと思う。
0545名前は開発中のものです。
2009/10/16(金) 06:29:56ID:UJ9WR3Zt変数を直接弄るんでもいいかな・・・。
0546名前は開発中のものです。
2009/10/16(金) 11:40:43ID:/PDPq+0/そういう可能性を考慮すると、関数を経由させたほうが便利。
0547名前は開発中のものです。
2009/10/16(金) 20:07:25ID:eJ9LLkd5そうでないと大変そうだな。デバッグ一件で1時間とか悩みたくないし。
0548名前は開発中のものです。
2009/10/18(日) 12:51:59ID:Yr/zm5ey確かに使い方を間違えるってのはよく起こる
0549名前は開発中のものです。
2009/10/25(日) 23:29:18ID:tIk7fQwv次に来るシーンを各クラスに設定しておいたりとか・・?
0550名前は開発中のものです。
2009/10/25(日) 23:57:46ID:6R6DoQXiGems5巻にいいのが載ってたと思うよ。
とりあえず Google [スタックベースのシーン管理 gems]。
0551名前は開発中のものです。
2009/10/26(月) 00:08:52ID:PLlfj58P0552名前は開発中のものです。
2009/11/16(月) 14:29:49ID:FF5xAAX0その後どうなった?
俺も今描画周りを考えてる
0553名前は開発中のものです。
2009/12/13(日) 15:40:07ID:Pf4hrG82void Create(LPDIRECT3DDEVICE9 lpD3DDEV)
{
jiki = new Jiki();
jiki->Create(lpD3DDEV);
}
void Draw(LPDIRECT3DDEVICE9 lpD3DDEV)
{
jiki->Draw(lpD3DDEV);
}
って風にやったら問題あるの?
0554名前は開発中のものです。
2009/12/14(月) 01:36:46ID:etpwNEHLdevice呼び出しが長くなるが、面倒なら#define
俺はこんな感じ
無知なんだけど、デバイスて何個も必要になることあんの?
0555名前は開発中のものです。
2009/12/14(月) 01:57:52ID:ViaP5WDz0556名前は開発中のものです。
2009/12/14(月) 03:13:37ID:etpwNEHLそうでないなら同じようなクラスを用意するかな
便利だからグローバルにしてるわけだし
仕方ないとおもってる
必要な関数ごとにデバイス渡すとか面倒すぎる
まあ、何十個もデバイスがいるわけじゃないからできる荒い方法ではあるんだけどな
0557名前は開発中のものです。
2009/12/14(月) 11:05:57ID:QE4kvqHrプレイヤーが増えるとかいった仕様にしたいなら
コントローラのデバイスは動的に管理した方がいいと思う。
0558名前は開発中のものです。
2009/12/14(月) 14:08:44ID:lLcah1pB(左右同時に押された場合は後からの入力を優先)
コントローラが壊れて常に右側に入力があるみたいな状態になるとうざったそうだな
0559名前は開発中のものです。
2009/12/14(月) 15:35:13ID:ViaP5WDz0560名前は開発中のものです。
2009/12/21(月) 22:25:25ID:F5CW/HFFそれらしいことがのってる
more effective c++と、Accelarated C++
のどちらの本が役立ちそうでしょうか?
boostソース読めってのは無しでお願いします。
■ このスレッドは過去ログ倉庫に格納されています