09/03/19 05:21:17 XLj1eEa+
描画能力のあるオブジェクトをリストなりグラフなりに登録しておいて、デバイスハンドルはビジターで渡す、とか。
504:名前は開発中のものです。
09/03/19 19:28:19 ALN5WhPj
俺はこの案では無いなぁ…てかどうせなら
lpD3DDEV->draw(draw_data, ...);
は
draw_data.draw(...);
みたいにしてlpD3DDEVに直接アクセスしない方が…
505:501
09/03/20 00:10:41 /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人では無かったけれど。
506:名前は開発中のものです。
09/03/20 02:39:39 D2lp0Ec4
まずはMVCを試みてみるのはどうだろうか
507:名前は開発中のものです。
09/03/20 04:52:36 09EDEaYz
struct Visitor;
struct 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;
};
続く…
508:名前は開発中のものです。
09/03/20 04:53:53 09EDEaYz
…続き
elementList.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);
}
}
うーむ…。
509:501
09/03/21 12:54:05 Y4F/PoMw
>>506
今回の話では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 の「案」。
だから例えば複数の関数に同一デバイスへのアクセス処理が分散してるのは自分的には問題が解決していないと感じる。
510:名前は開発中のものです。
09/03/22 03:32:29 O7e3N6nq
描画するにはデバイスに対して様々なパラメータを設定しなけりゃならんわけだが
>>501だとそこをどう処理するのかがよく分からない。
各オブジェクトには描画スクリプトみたいのを作らせておいて、draw()がそれを解釈して描画とか?
そうじゃないなら、結局デバイスをやりとりしなきゃならなくなるような。
511:501
09/03/23 00:38:25 /nVLLFvd
>>510
確かに。描画スクリプトかー、どうしよう。
ポリゴンの描画順番の最適化とかやり始めたら必要になりそうな気もするけど
今の自分のプログラムでは大げさすぎるかなぁ。今のところ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()みたいにベタ書きで
どこまでいけるかやってみるかな。
512:名前は開発中のものです。
09/03/25 00:59:33 koP5FPqt
hamigaki::coroutines使ってみた。
513:名前は開発中のものです。
09/03/25 12:39:16 C50L0uFm
yhamigakiさんのexec.jamモジュールにはお世話になっております
514:名前は開発中のものです。
09/04/05 14:24:00 a5PaoF6B
スレッド1..n 仮想描画コマンドをメモリに積む
デバイス用スレッド 仮想描画コマンドを解釈して実際のコマンドを発行
利点 単体テストが容易、移植が容易、マルチコアの恩恵を受けることができる
欠点 仮想描画コマンドバッファの管理にロック、セマフォは必須、上手に使用しないと逆に重い
515:名前は開発中のものです。
09/04/06 03:21:58 NgKFyYts
仮想描画コマンドバッファをスレッドごとに持てばいいじゃない。
516:名前は開発中のものです。
09/07/15 22:32:12 1c2msACv
URLリンク(www6.atpages.jp)
クライアントからサーバーに要求を送って、サーバーから要求を受け取るような機能を付け加えたいんだが、どういう設計にすればいいかわからない。定石みたいなのがあったら教えてほしい。
今のクラス構成
ScreenManger-->ScreenGame-->Title
| |->Main-->Map -|
| -->Unit--->sprite--|
|--------------------------------------------------------------->GraphicsWarpper
517:名前は開発中のものです。
09/07/15 22:40:07 h6KyoexM
WinAPI使ってるなら、WinSockで送信して、ウィンドーメッセージで受信する。他はシラネ。
518:名前は開発中のものです。
09/07/15 22:41:36 3ppQI3l+
>>516
> ScreenManger
画面飼槽
> GraphicsWarpper
グラフィックスワープ装置
何が言いたいのかさっぱりわからないのだが。
519:516
09/07/15 22:46:53 1c2msACv
>>517
忘れてました。
net frameworkを使ってます。
>>518
ScreenMangerはスクリーンマネージャという意味で、シーン全体を管理してます
GraphicsWarpperは単なるラッパーです。
520:名前は開発中のものです。
09/07/15 22:57:45 cL81hhcG
こんな面白い難読化もなかなかないな
521:名前は開発中のものです。
09/07/15 23:01:47 3ppQI3l+
>>519
> net frameworkを使ってます。
.NET Framework を勝手に先頭のドットを省略したり、勝手に小文字に変えたりするなよ・・
> ScreenMangerはスクリーンマネージャという意味で、シーン全体を管理してます
それならMangerではなくManagerだろ。
> GraphicsWarpperは単なるラッパーです。
それなら、WarpperではなくWrapperだろ。
小学校は夏休みなのか・・
せめて中学生になってからにしてくれ
522:名前は開発中のものです。
09/07/15 23:14:16 1c2msACv
>>521
すまん。スペルミスった・・・。
523:名前は開発中のものです。
09/07/16 01:35:23 Ac1CnfQd
まず日本語と英語を勉強するべきでは?
そうじゃなくても、変数名などを略すのはやめた方がいい、複雑なコードになると対応できない
自分はdeleteHandCardListみたいな長い名前つけたりするけど、困ることは1つもないね
ちなみに件の話に関しては書籍があるよ
GameDeveloperのオンラインゲームの青本
MMORPGを作る赤本もある
2chで説明すると1スレ使っても無理だと思う
524:名前は開発中のものです。
09/07/16 02:06:03 Dq9kBSTx
>>523
ありがとう。
それをあたってみる。
525:名前は開発中のものです。
09/07/16 02:29:30 lK28N0n1
質問の内容と関係ない単語にしかつっこめない奴が多くてワラタ
526:名前は開発中のものです。
09/07/16 05:49:13 0eDNLm6a
2~3人で多いのか、寂しい生活してるんだな
527:名前は開発中のものです。
09/07/16 10:25:09 irpkCXOF
言われて悔しいならもっと勉強しろよ
528:名前は開発中のものです。
09/08/14 18:57:02 qfXJNhjS
コミケの影響で最近来なかったここを再び覗くように。変なテンションダァ・・・
>>395
395以前のまとめ
>>404,406-407
シーン遷移考え方
>>408-413,416-425
シーン遷移実装サンプルと問題点。
>>427-433
0からSTGの作成を考える。
根本的な勘違いや非効率的なことがあるのであまり参考にはならない。
>>437-443
オブジェクトと座標管理
>>444-456
オブジェクトと衝突判定と全体効果
>>459-465
デバッグ用処理を考える。(衝突判定表示とか)
>>501-511
DirectXのデバイスの管理とか使い方
>>523
ネットワーク機能参考図書紹介
529:名前は開発中のものです。
09/08/14 19:24:51 qfXJNhjS
STGのビジュアル関連向上に関するメモ。
・・・あんま設計と関係ないな・・・
それっぽい弾の作り方
・コマは2コマは以上用意して、画像の色を通常っぽいのと白っぽいのにする。アニメは4コマあればきれい。
・ケイブっぽい弾を作る場合。1コマ作った後、コピーして1ドットぐらい前後ずらし、形を適当に修正。明るい部分はなるべく中心に近づくよう修正。
・円形の回転する弾の工夫。わざと中心から斜めに1ドットずつずらす。
ちょっと光ったエフェクトとか。
・メイン画像と残像(というか残光)画像を用意。後は適当に残像表示の要領で重ね描画。
・センコロのブーストエフェクト。適当な○画像をブースター付近から扇子状に放射するだけ。それっぽいブーストグラフィックが得られる。
弾やエフェクトはポーズ連打して見てみたりすると、プログラムと画像をうまく考えれば誰でも作れるものが多い・・・気がする。
530:名前は開発中のものです。
09/08/14 22:21:56 FZUQWr9u
>>529
設計というよりは演出(エフェクト)の話でしょうか。
もし続けるなら専用のスレを立てた方がよいと思われ。
531:名前は開発中のものです。
09/10/05 01:40:33 mQYy5BRf
シミュレーションやRPGで
経営状況や主人公の内部パラメータと呼ばれる
データ群がごっそりあると思いますが,
そういったものの管理は
実際のゲーム開発でどういった形でなされるものですか?
データクラスを作ってアクセッサで操作を許す?
それとも,すべてグローバル変数で持たせる?
532:名前は開発中のものです。
09/10/05 04:33:25 /TvwIsfE
シングルトンクラスのオブジェクトをグローバルに定義する
533:名前は開発中のものです。
09/10/05 07:34:29 Rel4l/Gg
SQLiteとか使って手抜くってのもあり
534:名前は開発中のものです。
09/10/14 22:12:56 TwzkU58s
グローバル変数はありえない。データクラス。
ただ、データの表示とかはいつも頭を捻らすなぁ。
535:名前は開発中のものです。
09/10/15 07:50:05 P3b4xThD
アクセッサ書くのめんどいだろ
536:名前は開発中のものです。
09/10/15 08:41:22 OtHf9VTl
なんでそんな両極端なの?
537:名前は開発中のものです。
09/10/15 15:54:18 byjv3si3
0と1しか無いからな
オタクの頭ん中は
538:名前は開発中のものです。
09/10/15 20:13:55 P3b4xThD
別に両極端で構いません.
意見を頂けるだけで嬉しいです.
むしろ噛み付くほうが迷惑です.
539:名前は開発中のものです。
09/10/15 22:16:10 r8d5RKMA
使う人がデータを把握できてるなら好きにすればいいんだよ。
質問は実際のゲーム開発だから、面倒でも形式的にやるしかないんじゃない。
540:名前は開発中のものです。
09/10/15 22:18:05 2byzEsEE
>>535
アクセッサ書くのめんどくさいって言ってたら
コーディングが意味不明になってやる気をなくす自信がある。
実際それで何回も挫折した。分かりにくくなるくらいならメンドイ方がマシ。
541:名前は開発中のものです。
09/10/15 23:29:40 r8d5RKMA
俺は変数に直接アクセスでも分かりにくいと思わないし。
アクセッサ書くのもめんどくさいとは思わない。
542:536
09/10/16 00:35:50 L+kS7tAJ
>>538
悪い、噛み付くとかそういうつもりは無かった。
普通に設計して、グローバルにアクセスする必要があるデータを持ってるクラスだけ
Facade経由でアクセスできれば良いんじゃないかと思っただけ。
グローバル変数はさすがにあり得ない…
543:名前は開発中のものです。
09/10/16 01:18:33 MsmDVyev
2chで素直に謝られると逆に困ります.
参考になりました,ありがとうございます.
544:名前は開発中のものです。
09/10/16 01:38:32 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);
て感じで、結局データを引数で取る形になるから、クラスで実装して方がいいんじゃないかと思う。
545:名前は開発中のものです。
09/10/16 06:29:56 UJ9WR3Zt
代入の時などに別の処理を入れるんでなければ
変数を直接弄るんでもいいかな・・・。
546:名前は開発中のものです。
09/10/16 11:40:43 /PDPq+0/
入力値の正当性をチェックしたり、同時に変更しなければならないパラメータが1つじゃなかったり、
そういう可能性を考慮すると、関数を経由させたほうが便利。
547:名前は開発中のものです。
09/10/16 20:07:25 eJ9LLkd5
アクセッサ経由だとバグっぽい動きも引っ掛けやすいが、
そうでないと大変そうだな。デバッグ一件で1時間とか悩みたくないし。
548:名前は開発中のものです。
09/10/18 12:51:59 Yr/zm5ey
>546
確かに使い方を間違えるってのはよく起こる