06/08/10 20:27:06 BnvyxuCB
具体的なゲーム名を挙げて、
どのようにクラス設計をすればよいか、
継承・委譲関係はどのようにすればよいか、
使えそうなパターンは何かなど語るのもよし。
自作ゲームの内容とクラス図を書いて
改善案を聞くもよし。
設計に関して困ったことを質問するもよし。
関数の具体的な実装内容やゲーム内容に関しては他スレに譲る。
大いに語れ。
2:名前は開発中のものです。
06/08/10 20:45:47 X/dQa2Wp
はっ、意味不明
3:名前は開発中のものです。
06/08/10 20:46:24 8+CwRGdy
設定提案とヲチと批判しかできないこの過疎板で
技術を語れるかが見物だ。
4:名前は開発中のものです。
06/08/10 22:23:22 BnvyxuCB
抽象的過ぎたからひとまずお題を挙げておくか。
⊃「パックマン」
敵に関しては、敵の抽象クラスを継承したサブクラスで
移動アルゴリズムをオーバーライドするよりも、
アルゴリズムを別のクラスで用意して
それに対する参照を敵のクラスに持たせる方がいいのかな?
5:名前は開発中のものです。
06/08/10 23:26:41 BnvyxuCB
+-----------------------+
| CEnemy |
+-----------------------+
| move() |
| (strategy->execute()) |
+-----------<>----------+
| strategy
|
|
+-----V-----+
| Strategy |
+-----------+
| execute() |
+-----A-----+
|
+------+---------+----------+
| |
+------+-------+ +------+------+
|AkabeeStrategy| |PinkyStrategy|
+--------------+ +-------------+
| execute() | | execute() |
+--------------+ +-------------+
クラス図で書くとこうなるのか?まあ絶対ズレているだろうがな…。
俺自身は超初心者だから間違いがあったら指摘お願い。
6:名前は開発中のものです。
06/08/10 23:27:33 BnvyxuCB
ちょw
いくらなんでもズレすぎだ…。
7:名前は開発中のものです。
06/08/10 23:29:52 GhkTPLBd
パックマンごときに大げさなパターンはいらねべ。
敵キャラの個別化をしたければテンプレートメソッドパターンぐらいで十分。
好きにすればよい。
8:名前は開発中のものです。
06/08/10 23:38:42 BnvyxuCB
>>7
確かにその通りなんだが、
まあいきなり大規模なものを持ってきても
話しづらいかなと思って。
9:名前は開発中のものです。
06/08/10 23:39:13 BnvyxuCB
一応>>5のズレ直しverを貼っておこう…。
+-----------------------+
| CEnemy |
+-----------------------+
| move() |
| (strategy->execute()) |
+-----------<>----------+
| strategy
|
|
+-----V-----+
| Strategy |
+-----------+
| execute() |
+-----A-----+
|
+------+------------+----------+
| |
+------+-------+ +------+------+
| AkabeeStrategy | | PinkyStrategy |
+--------------+ +-------------+
| execute() | | execute() |
+--------------+ +-------------+
10:名前は開発中のものです。
06/08/11 00:00:57 YoP5XUOs
シューティングゲームの敵と敵から打たれるミサイルなんかは、
ファクトリメソッドパターンかな・・・
11:名前は開発中のものです。
06/08/11 00:24:48 C/hX80Tz
「こういうキャラに対しては何ちゃらパターンが使えるな」
みたいなことは大体わかるのだが、
全体をまとめようとするとうまくいかないのはオレだけか?
12:名前は開発中のものです。
06/08/11 00:39:49 jjyZUyYu
同じ方向に話を進めるためには
タスクシステムの内容を統一した方がいいんじゃね??
13:名前は開発中のものです。
06/08/11 01:37:19 tpCf6gfL
URLリンク(www.gamedesignpatterns.org)
14:名前は開発中のものです。
06/08/11 05:13:38 XHr3GWC7
名スレの予感
15:名前は開発中のものです。
06/08/11 07:46:49 8h85L6qq
>>9
CEnemyのCって何?
16:名前は開発中のものです。
06/08/11 07:51:46 sJYQdfLa
ClassのCじゃねぇの。
17:名前は開発中のものです。
06/08/11 08:14:44 pd/2z5bI
MFCを知らんのか?
18:名前は開発中のものです。
06/08/11 08:22:18 sJYQdfLa
うん、普通に知らない。
19:名前は開発中のものです。
06/08/11 10:46:52 fe4sLs9R
charだけあれば他は要らない
20:名前は開発中のものです。
06/08/11 11:46:44 YxjqBpJS
Cつけるのはダサいからやめろ。
21:名前は開発中のものです。
06/08/11 13:15:07 NMgVyy7Y
じゃあ、なにつければいいのさ?
22:名前は開発中のものです。
06/08/11 13:16:16 defJrMH6
そのクラスを直感的に理解できるよう努力すれば他に何もいらない
23:名前は開発中のものです。
06/08/11 13:32:51 DmUndduC
Cつけるの癖になってるなぁ。
24:名前は開発中のものです。
06/08/11 14:04:44 XHr3GWC7
コードスタイルはクラス設計とは関係ないだろ
Cの1文字ぐらい脳内削除できんのかね
25:名前は開発中のものです。
06/08/11 15:22:03 AWZ202Sp
大文字で始まる名詞はクラス以外ありえないから、無意味に邪魔なゴミつけるんじゃないよ。
今出回ってる雑誌や書籍、それにオープンソースのコードに
Cつけてるものがどれほどあるか見てみろ。
MSなんか、C#では逆にCを「つけるな」と言ってるしな。
>コードスタイルはクラス設計とは関係ないだろ
わざわざ変なスタイルを使うやつは、高確率で変なクラス設計をする。
普通にコードを書く気が最初からないんだから。
26:名前は開発中のものです。
06/08/11 15:37:25 mPv7ZiBt
>>25
コードスタイルについてはごもっともだけど、
>わざわざ変なスタイルを使うやつは、高確率で変なクラス設計をする。
って誰が言ってたのさ。統計とったの?
そうですか、あなたの経験上ですか。では、変なクラス設計の基準はどこに?
27:名前は開発中のものです。
06/08/11 15:56:24 XHr3GWC7
>>25
お前の言っていることは間違いではないが、焦点がズレているな
俺が言いたかったことは、>>9の敵クラス名がCEnemyだろうがEnemyだろうが
クラス図には何の影響もないということだ
変なスタイルを使う奴は云々という決め付けはいらない
設計がそこに転がっているんだからその優劣を語ればよい
28:名前は開発中のものです。
06/08/11 16:01:15 DmUndduC
>>25
何でそんなに興奮してるんだ?
コードスタイルは分かりやすさ、第一。
別にコード公開する気もないし。
29:名前は開発中のものです。
06/08/11 16:32:11 C/hX80Tz
>>7
Template Methodパターンだと、実行時に移動アルゴリズムを
変更したくなったときに面倒じゃないか?
パックマンがパワー餌を食べたことがMediatorを通して
通知されたとき、strategyを逃げるアルゴリズムに
変更すれば、同じ呼出しで適切な移動が可能。
まあ、オリジナルだと逃げるアルゴリズムは共通だから
それは組み込んでおいて通常移動はオーバーライドでも
問題ないけど、通常移動も動的に変更したいのならStrategyかな。
実際問題、パックマンを作るのにここまで慎重に設計する必要は
ないが、設計スレだし色々探ってみるのがよさそうだ。
30:名前は開発中のものです。
06/08/11 18:51:41 Vuvb9Lvy
>>11
俺もその辺はよく悩むな。
最近はゲーム全体の構造について再度考え直そうと思って、
URLリンク(www.jeffplummer.com)
このあたりを読んで研究中。
GDC'06のTim Sweeneyの講演(Building a Flexible Game Engine)のスライド早く公開されないもんかな。
31:名前は開発中のものです。
06/08/11 20:08:38 Ip8C/yOX
>>30
GDCのじゃないけどTim Sweeneyの別の場所での講演
スライド。参考までに。
URLリンク(www.cs.princeton.edu)
時間表現からレンダリング、シミュレーションの並列実行化という
レベルの全体構造を考えるならGDC06のSim, Render, Repeat
? An Analysis of Game Loop Architecturesおすすめ。
32:名前は開発中のものです。
06/08/11 21:10:41 C/hX80Tz
>>30-31
SUGEEEEEEE!!!
英語苦手だけど頑張って読んでみるか。
33:名前は開発中のものです。
06/08/11 21:44:28 Vuvb9Lvy
>>31
おぉ、トンクス。参考になりまつ。
やっぱり並列化も次世代機を考慮すると重要なトピックになりつつあるんだなぁ…
34:名前は開発中のものです。
06/08/11 21:54:05 Ip8C/yOX
シングルコアを使い切る→マルチスレッド
マルチコアを使い切る→並列同時実行
35:名前は開発中のものです。
06/08/12 00:11:13 Eayw3C5n
お前ら!TCBを格納するのに何使ってる?
STLのlist使ってたんだけど、
動的メモリ確保で遅くなるから配列を使った方がいいと聞いて…。
それから単方向ではなく双方向リスト構造にする利点があれば教えてくれ。
36:名前は開発中のものです。
06/08/12 02:27:39 pnW+o/wl
やだ
37:名前は開発中のものです。
06/08/12 02:41:00 Xdt1RmGF
>>29
>Template Methodパターンだと、実行時に移動アルゴリズムを
>変更したくなったときに面倒じゃないか?
フラグのOF/OFFの分岐でいいべ。パックマン程度だったらその方がずっとコード
が分かりやすい。移動パターンが何種類もあると言うんだったら別だが。
38:名前は開発中のものです。
06/08/13 01:11:05 o/UAG1nJ
ゲームプログラムでMediator使うの微妙じゃね?
オブジェクト同士が相互作用しまくりで
処理内容が多岐にわたるゲームの場合、
updateしたよあとよろしくね♪じゃMadiatorの仕事が多すぎる。
結局俺の場合、例えばシューティングで当たり判定をとるんだったら
自機インスタンスへのポインタを敵のクラスのメンバに持たせたり
自機インスタンスをグローバルにしちゃったりする。
よくないことはわかりつつも。何か良い方法はないものかね。
39:38
06/08/13 02:36:16 o/UAG1nJ
ん?もしかしたら俺は物凄く馬鹿な勘違いをしていたのかもしれん。
今までは、Mediatorクラスが持つ関数は
呼び出し側の参照を引数として取るupdateただひとつだけで、
updateは引数から得られる情報を元に適切な処理を選択し、
適切なオブジェクトに通知するのだと思っていた。が、
Mediatorに複数の関数を持たせて
呼び出す側が選択するというのもありなんだな。
例えば当たり判定処理のためのhitCheckとか。
タスクリストを持つクラスにMediatorを兼任させるのもありか。
ごちゃごちゃするが。
>>35
listのままでおk
40:名前は開発中のものです。
06/08/13 08:56:01 y5vatLvS
この板ですごい久しぶりの良スレ候補だ。
41:名前は開発中のものです。
06/08/13 11:24:21 vE5CRkDF
>>38
まぁゲームシステムにもよるだろうなぁ。自機が一機しかなければ
自機クラスにMediatorの仕事やらせてもまず大差ないだろうし。
弾のような飛び道具出すにしても、
自機の敵キャラクタのインスタンス配列をそのまま渡せば
そこまで複雑になるとも思えない。むしろこっちの方が楽そう。
マリオみたいに敵同士の当たり判定がある場合は、
Mediatorみたいなものは必須だと思うけど。
42:名前は開発中のものです。
06/08/15 01:28:43 mFMpUmTh
デザパタ話か…
昔、GraphicsクラスやらInputクラスやらを
シングルトンにしようとしたが、初期化するための引数が多いせいで
Graphics.getInstance()なんて簡潔な呼び出しをすることが
不可能だと気づいて泣いたぜ
43:名前は開発中のものです。
06/08/15 01:53:25 EK48DUhB
>>42
initializeメンバ関数を別途用意して最初の方で呼び出せばいいだけの話じゃ?
44:名前は開発中のものです。
06/08/15 02:22:10 mFMpUmTh
>>43
それやるくらいなら俺はシングルトンパターンを適用せずに
フィールドを全部staticにする
初回のgetInstance()呼び出しでコッソリ初期化、
表面上は初期化いらずな点がシングルトンの利点だと勝手に思っているから
45:名前は開発中のものです。
06/08/15 03:30:20 EPdRstT4
Monostateパターンか
46:名前は開発中のものです。
06/08/16 12:54:24 kC6PmX5a
Mediator処理関数の呼び出すべき順番が決まっているのに
呼び出し側のタスクがその順番で並んでいないときは発狂する。
47:名前は開発中のものです。
06/08/19 01:00:05 aLDfzS42
Mediatorを適用しているサンプルを見たことがない。
プレイヤーへのポインタを保持する敵タスク(リスト)ばかりだ。
URLリンク(d.hatena.ne.jp)にMediatorの解説があるが
接触判定のような単純な通信にしか使えんな。これは。
48:名前は開発中のものです。
06/08/19 10:25:32 IzB67zRr
このスレでよく出てくるタスクって何の事?
49:名前は開発中のものです。
06/08/19 10:59:20 Br4d5o3I
>>48
タスクシステムでググると出てくる。GameDevPukiWikiにも載っている。
URLリンク(gamdev.org)
50:名前は開発中のものです。
06/08/19 12:03:47 Ozyz6ud5
タスクシステムの考え方は海外ではあまり見ない和製概念だね
向こうではDDAやらエンジン単位でのアーキテクチャが主流なのかな
51:名前は開発中のものです。
06/08/19 12:16:19 IzB67zRr
タスクシステムって要はリストの事なの?
52:名前は開発中のものです。
06/08/19 13:19:26 Br4d5o3I
タスクコントロールブロックがリスト構造を成しているとは限らない。
53:名前は開発中のものです。
06/08/19 14:40:17 NMv1rX3b
オレはCompositeパターンを使ってTCBをTreeにしている。
こうすると走査が面倒ななるから、必要なTCBだけMediatorに登録。
54:名前は開発中のものです。
06/08/23 17:59:02 i8zrNBaj
シューティングゲームなどで、C++タスクシステムにおいて、
敵管理タスクが当たり判定や弾の狙い撃ちをするために、
自機タスクから座標などの情報を取得するにはどうすればいい?
55:名前は開発中のものです。
06/08/23 20:30:16 M0hCP3PA
今北お!
モデルの実装は普通にやればいいと思うんだけれども、
たとえば >>9 のパックマンでキャラ画像情報とかって
どこに持つ?
で、アルゴリズムとどうやって結びつける?
俺はなんかもう面倒くさくなって全部一緒になってんだよねー(最悪)
56:名前は開発中のものです。
06/08/23 20:32:29 M0hCP3PA
>>54
多分、自機情報がグローバルにあるんだと思うよ!
57:名前は開発中のものです。
06/08/23 20:55:16 Y+7SXF19
パックマンクラスかな
58:名前は開発中のものです。
06/08/23 21:23:13 PRMjREAH
つか、誰か>>50の解説を頼む。
59:名前は開発中のものです。
06/08/23 21:28:31 3o00L+nM
>>55
画像情報がビットマップなんかのことだったら殆ど別だな。
ゲーム総まとめクラスから
キャラの座標値、アニメーションインデックス値を吐かせて
それを画像クラスに投げてる。
60:名前は開発中のものです。
06/08/24 00:46:53 YfRhQBsC
【敵機(Enemyクラス)が自機(Playerクラス)の座標の取得する場合】
(GetXY()となっているが、XとYを別々に取ってきても構わない)
・そもそもクラスにまとめていない or 自機も敵機もごちゃ混ぜクラス。
自機の座標の取得には苦労しないよ派。
・Playerのインスタンスplayerがグローバル。
player.GetXY()で座標を取ってくるよ派。
・PlayerがSingleton。
Player::Instance().GetXY()で座標を取ってくるよ派。
・PlayerがMonoState。
player.GetXY()もしくはPlayer::GetXY()で座標を取ってくるよ派。
・Enemyクラスがplayerへのポインタを保持。
player->GetXY()で座標を取ってくるよ派。
・enemyがMadiatorに自機の座標の取得を要求。
Madiatorがplayerの座標を調べて返してくれるよ派。
・playerやenemyが属する統括クラス(GameとかTaskListとか)に
enemyがアクセス可能。
Game.(->)GetPlayer()->GetXY()で座標を取ってくるよ派。
61:名前は開発中のものです。
06/08/24 20:19:35 ioVHmuR2
>>59
キャラの座標やアニメーションインデックス自体は、
やっぱり>>9でいうCEnemyにあるんだよねぇ?
それを総まとめクラスが集約してるみたいな構造かなぁ。
その設計だと、ダーティ領域を消すための前回のスプライト位置は
画像クラスに持ってるんだろうか?
62:名前は開発中のものです。
06/08/25 07:38:55 hwdyVz4L
アニメーションインデックスは
CEnemyのメンバとして直接持つのではなく、
委譲関係にあるインデックス管理クラスが持った方がいいかな。
インデックス管理クラスはmap<String, list<POINT> >みたいな構造にして、
動作の名前を与えるとPOINT構造体を返してくれるというような。
63:名前は開発中のものです。
06/08/25 11:50:36 cXY4CALt
>>61
総まとめクラスにインデックス値を吐かせてるのは
それがフレーム管理もやってるから。
インデックス値はCEnemyには持たしていない。
毎回背景から再描画してるんで、
前回スプライト位置は保持していない。メンドイし。
64:名前は開発中のものです。
06/08/25 14:31:51 7Z0tsXKn
>>63
>総まとめクラスにインデックス値を吐かせてるのは
>それがフレーム管理もやっているから
いやそれ全然理由になっていないと思うぞ…。
65:63
06/08/25 20:56:45 cXY4CALt
あれ?自分で書いておいて訳わかんねw
作ったまとめクラスよく見たらフレーム管理はしてなくて、
1フレーム進めるメソッドがあるだけだった。
んで、そのメソッドを実行するたびに
0~(アニメーション数-1)までくるくる回す
インデックス値のメンバがそこにあった。
数ヶ月前に書いたソースを思い浮かべながら書いたら
記憶があいまいで勘違いしてた。スマソ
66:名前は開発中のものです。
06/08/26 02:58:51 MLjkH/sO
>>65
それをやると、敵を生成したタイミングにかかわらず
同じ敵が同じ状況で常に同じモーションをとることになるな(行進みたいに)。
俺はモーションをバラにさせたいときは>>62みたいなクラスを敵クラスに持たせ、
あえて統一したいときはそれを敵リストクラスに持たせている。
67:名前は開発中のものです。
06/08/27 01:28:02 AkzK5166
簡単なことを難しくやる典型例みたいな…
やっぱしゲームには過度なオブジェクト指向は必要ないかなあ
68:名前は開発中のものです。
06/08/27 01:36:32 ksgBJOiI
3Dゲームはオブジェクト指向無しではやってられまへん。
69:名前は開発中のものです。
06/08/27 01:58:03 8IJYN4+M
>>67
このスレに書かれているようなクラス設計を
どんな規模のゲームにでも毎回採用している奴はいないだろう。
採用した方がむしろ簡単になったり、差し替えが楽になったり
するようなところに適用すればいい。
パックマンとかシューティングとかは説明例に利用されているだけだし。
ゲームに過度なオブジェクト指向は必要ないというのはちと早計。
70:名前は開発中のものです。
06/08/27 09:16:10 6AN46lHX
71:名前は開発中のものです。
06/08/27 11:43:57 1/1wdIdP
こんなスレが出来てたのか。
いわゆるタスクシステム的な、個々のオブジェクト同士の依存関係の記述は、
ここの考え方と同じ方針でやってる。
URLリンク(www.issei.org)
72:63
06/08/27 12:10:26 f+3tvpuV
>>66
まぁ漏れの場合はそこまで凝ったシューティングじゃなかったし。
もっと拘ると最終的にそれに近くなってくるだろうなぁ。
>>67
難しいか?このくらいじゃ慣れの問題でしょ。
大規模なゲーム作るとなると設計をちゃんとしなければ
取り返しがつかなくなって訳若布になる。
それに、そこで作ったコードを再利用するなら
他のゲームも自動的にオブジェクト志向なコードになる。
73:名前は開発中のものです。
06/08/27 13:24:46 DcPmG1mi
そこに時間という足かせとのバランスを考慮するんだろ
74:名前は開発中のものです。
06/08/27 14:46:15 Iv3Ktm5x
過度のオブジェクト指向はゲームじゃなくても要らないっしょ。
過度なんだから。
まぁ、でもパックマンに >>9 ぐらいの設計は全然アリだよね。
CEnemyを直接継承しちゃうかな。俺は。
75:名前は開発中のものです。
06/08/27 20:51:21 e75LZdTl
ゲーム固有のコード全てを持つクラス の名前ってどんな風に付けますか?
Game だと(他のタイトルのコードと)紛らわしいし、ゲームタイトルって選択もあるだろうけど
開発を始めたばかりの頃に気の訊いたタイトルを思いつけるとも限らないし・・・
参考までに聞かせてください
76:名前は開発中のものです。
06/08/27 20:59:17 91MNPNDq
ゲームのすべてのコードが含まれてるなら後で変更しても問題ないんじゃないの
77:名前は開発中のものです。
06/08/28 06:10:31 ylt7gNTk
たとえばJavaならeclipse様の力で名前なんかどうにでもできるんだが、
そういうツールがない場合、開発コード名をつける。
78:名前は開発中のものです。
06/08/29 08:01:09 ewOrOlMJ
>>75
namespaceで区切る。
79:名前は開発中のものです。
06/08/30 08:47:32 nhdG+7sO
良スレだと思うのだがなかなか伸びないな。
やはりこの板は設計論より実装論が先立ってしまう人が多いからだろうか…
80:名前は開発中のものです。
06/08/30 10:33:46 /npQLrEC
単に内容について来られる奴が予想以上にいない説。
スクリプタやプログラム初心者が多いこの板では
このスレでメインに置かれているC++自体がまず敷居高し。
加えてタスクシステムやデザインパターン等の前提知識が必要だし、
ある程度作り慣れた人でないと語られている手法の有用性がわからない。
っていうか>>2が端的にこのスレの性格を表している気がしなくもない。
81:名前は開発中のものです。
06/08/30 10:42:16 ywEU+7yH
イベント駆動型で作れないかな
82:名前は開発中のものです。
06/08/30 11:31:13 9Enygb8x
パズルゲームとかなら
83:名前は開発中のものです。
06/08/30 19:00:19 /p+hSpd6
むしろ糞スレ化せずに80以上のまともなレスがあるのが奇跡だよなぁ。
84:名前は開発中のものです。
06/08/30 23:25:09 YwiXGvRz
実装論先行型が多いと思う
デザインパターンって人に伝えるために作られたものだと思う
一人で作ってる分には必要ないんでない?
あとオブジェクト指向はホント必要、いやまじで、ないと軽く逝ける
どこまでやればオブジェクト指向ってのかは謎だけど
とりあえずデザインパターンとあまり関係ないんだが
クラスの作り方どうやってるか聞きたい
複雑な行動パターンをお手軽に実装できる方法とかない?
85:名前は開発中のものです。
06/08/30 23:37:00 zbf6UWXA
C++で、クラス関連の機能から触り始め
テンプレートの書き方やSTLライブラリまで一通り勉強したけど
デザインパターンにはまだ触れたことがない
今のところ、機能ごとに切り分けたクラスを作りためながら
自前のゲーム用ライブラリを構築するだけで満足してしまってる
86:名前は開発中のものです。
06/08/30 23:42:43 5F9omhv6
どうでもいいことを突っ込まずにはいられない
>85
>STLライブラリ
頭痛が痛いです
87:名前は開発中のものです。
06/08/31 00:11:24 HS89R3Gm
知ってるがな
どうでもいいことには突っ込まずにいてください
88:名前は開発中のものです。
06/08/31 00:17:43 RTC9z+se
プログラムを勉強し始めて間もなく
多くの人が感動したアルゴリズムと同じく、
綺麗なクラス設計を示したのがデザパタだ
みたいなことを誰か言ってたな。
89:名前は開発中のものです。
06/08/31 00:47:27 q0N5Gk6x
83が変なコトいうから微妙な空気が漂ってきた。
90:名前は開発中のものです。
06/08/31 03:24:35 LuxRambo
デザインパターンの意図については語る必要はない気がする。
こっちは利用する側なんだし。実際このスレではパターン名で疎通が取れているし
パターン自体も色々な使用例が挙げられていて役立っているからそれでいい。
>>84
>複雑な行動パターンをお手軽に実装できる方法とかない?
なんとなく、このスレでは扱わない具体的な実装面に踏み込む内容な気がする。
どちらにしろ具体例を挙げてくれないと意見しにくい。
行動パターンがコロコロ変わるというのであれば>>9の方法でいいんじゃないか?
91:名前は開発中のものです。
06/08/31 17:27:49 AP7414ou
こういうスレは、この板では貴重だと思う。
当たり判定のアルゴリズムはわかっても、
それぞれの物体の座標をどうやって取得するか等を語れるスレは少ないし。
92:名前は開発中のものです。
06/08/31 18:34:51 H1On9wAl
>>90
前にSTG作った時に敵の数を20以上作れと言われた
一つ一つ行動パターンを作っていくのがえらいめんどくさかった
既出ですまそ、そしてありがとうございます
93:名前は開発中のものです。
06/08/31 19:32:51 FYTUeEKw
「複雑な行動パターン」ってどういうもん?
キャラの状態が色々あってステートの変化の組み合わせが多い(格ゲー系にありがち)とか、
行動の流れが複雑でプログラムがめんどくさい(シューティングにありがち)とか、
カテゴリはいくらでもありそうだからなぁ
でも大抵はスクリプトを使えば割と面倒なタスク処理が解決すると思うので紹介
タスクを実装するのにvirtual Update() = 0;な関数を用意したクラスを使うのは皆よくやると思うのだが
キャラにとっては一連の流れ(=関数)を一々タイムスライスしてやらなきゃならんのは面倒だ。
そこでスクリプトを使うと結構その辺が簡略化されるよ
例えばシューティングゲームで360度回転しながら弾を撃つ処理を書くときとかが良い例だと思うのだが
class Hoge
{
float m_Angle = 0;
Update() {
m_Angle += AngleVel;
Fire(m_Angle);
if( m_Angle >= 360.0f )
Destroy( this );
}
};
と書くよりは
HogeThread() {
for( float Angle = 0; Angle < 360; Angle += AngleVel; ) {
Fire(m_Angle);
Wait(1);
}
}
と書きたいわけだな。Wiat(1)みたいなのはスクリプトの得意技だ
>>9の例を使うと、class ScriptStrategyみたいな感じのクラスを作るのがいい感じ。
94:名前は開発中のものです。
06/08/31 19:34:21 FYTUeEKw
それにしてもひどい文法エラーだと自分でつくづく思った。
95:名前は開発中のものです。
06/08/31 21:15:01 XOYGLdi+
>>93
ゲームプログラムとしては前者のコードの方が自然だから
わざわざ後者にしたいという理由がわからない。
96:名前は開発中のものです。
06/08/31 21:43:04 WNbosGuA
IEnumerator<IAction> GetAction()
{
for( float Angle = 0; Angle < 360; Angle += AngleVel; ) {
yield return new FireAction(m_Angle);
}
}
C#でこういうのどうだろ
97:名前は開発中のものです。
06/08/31 21:52:59 q0N5Gk6x
>>93の例は微妙に不適当な気がする。
”複雑な状態遷移をスクリプト(というよりこの場合fiber/coroutine)で処理した方が簡単”
というのは言えると思うが、
”毎フレームUpdateを呼ぶよりもHogeThreadを1回だけ起動する方法にしたい”
なんて思う人はごく稀だと思われる。
この場合、>>9のStrategyのサブクラスとしてScriptStrategyを定義して、
excuteが呼ばれるたびにコンテキストを復帰して起動する処理を作る方が自然。
98:名前は開発中のものです。
06/09/01 00:30:03 r4ifVKGE
>>95
そんなことは無いですよ。BulletMLはまさしく後者の方法の一種です。
わざわざこのためにpythonのマイクロスレッドを利用する人もいるくらい。
>>96
まさにその考え方です。
ただC#ではIteratorでしかyieldが使えないので…
>>97
なんか表現を誤った気がします。
結局はおっしゃるとおりコルーチンってことです。
99:名前は開発中のものです。
06/09/01 22:44:26 gcVCkYdV
人それぞれといわれかねない質問だが・・・、
衝突判定は何処で行う?
キャラが他のキャラクタと当たるかどうかを各々チェックする?
衝突クラスなるものがキャラと他のキャラとをチェックする?
100:名前は開発中のものです。
06/09/01 23:18:48 m70wFV1r
衝突判定の対象になるキャラを、障害物クラスに登録しておき、
キャラのメソッドで、判定用ベクトルを格納するクラスを生成し、
その判定ベクトルクラスを、障害物クラスに渡している。
障害物クラスで扱うデータは、
オリジナルだったり複数種のFVFだったりするので、
判定そのものはテンプレートにした。
101:名前は開発中のものです。
06/09/01 23:37:56 PZ94qqHg
5000個くらいのキャラの衝突を総当りでやってたらうざったいもんな。
キャラの最小サイズを1ピクセルになるようにマップを縮小したものを容易。
キャラを移動させたらその位置を塗り替えるが、その場所が既に塗り替えられてれば衝突、もしくは
詳細の衝突判定を行う。
クラスにするまでもないと思うが。
102:名前は開発中のものです。
06/09/01 23:50:16 KqJnfdNw
俺は衝突クラスを作るかな。
実装は>>101みたいな感じだけど4分木を使ってもっと大雑把にやる。
まあ実装に関してはこのスレの範囲外だけど。
103:名前は開発中のものです。
06/09/02 18:17:30 NT+ChiaN
衝突判定でよく話題になるダブルディスパッチだけれども
boost::variant使うと継承無しで実現できちゃうよ。
中身はswitch caseのコンパイル時自動生成してるだけだけど。
継承関係なしで仮想関数の真似事もできるんで、
たまには役に立つかもしれない。
104:名前は開発中のものです。
06/09/02 18:26:27 AcWLcw3K
GameObjectは型クラスの概念に近いことが多いから、
ある程度規模が大きくなると、コンパイル時のダブルディスパッチの確定だけじゃ追いつかなくなるんだよね…
UnrealEngineではスクリプトに完全に委譲してしまってるみたいだけど。
105:名前は開発中のものです。
06/09/02 18:36:54 NT+ChiaN
variant型なんだからもちろん実行時型識別してくれるよ。
具体的には型にid振ってswitch caseしてるだけ。
メモリアロケーションも発生しないからなかなか優秀。
ただオブジェクトサイズが最大のものに揃っちゃうけど。
106:名前は開発中のものです。
06/09/02 18:40:42 NT+ChiaN
こんな感じね。↓
#include <boost/variant.hpp>
using namespace boost;
class visitor : public static_visitor<> {
public:
void operator () (int n, int m) const {}
void operator () (char n, char m) const {}
void operator () (char n, int m) const {}
void operator () (int n, char m) const {}
};
・・・・
variant<int, char> v0, v1;
v0 = int(2);
v1 = char(3);
apply_visitor(visitor(), v0, v1);
v0 = char(2);
v1 = char(3);
apply_visitor(visitor(), v0, v1);
107:名前は開発中のものです。
06/09/02 21:49:46 AcWLcw3K
>>105
いや、突き詰めていくと、同じ型であってもゲーム上で異なる意味を持つ場合がよくあって、
そういう場合は(言語としての)型でのディスパッチだけでは不十分で、
結局、ゲームにあわせたIDなり名前なりで自前のルーチンを組むことになるって話。
特にRTSやFPSみたく、プログラマは基本的な構造とツールを提供するだけで
後はデザイナーの仕事、のように分業されてるゲームではそうなりやすいでしょ。
って書いてて気づいたけど型クラスじゃなくて型オブジェクトだったよ(´・ω・`)スマソ。
108:名前は開発中のものです。
06/09/03 02:35:53 zkit7pB+
それは単に振る舞いを型まで落としきれてないだけでは。
仮に振る舞いが外部設定可能だったとしても
型をパラメータ化したファクトリ作れば良いし。
109:名前は開発中のものです。
06/09/03 02:45:46 zkit7pB+
ああ、”ゲームオブジェクト”のディスパッチでは
足りない、ということであれば同意。
上のは当たり判定オブジェクトを別に作ってそっちで
ディスパッチする前提で話してた。
110:名前は開発中のものです。
06/09/03 20:53:10 IzfZGbvV
てかここまでくるとスレ違いじゃね?
111:名前は開発中のものです。
06/09/03 21:18:48 2Y2SZ/cc
>>110
何故?
112:名前は開発中のものです。
06/09/03 23:09:12 H5xQl2Ix
>>109
そう、そういう意味ですた。
パックマンやテトリスみたく、型とオブジェクトの振る舞いが1:1で対応するようなゲームであれば
boost::variantやLokiのStaticDispatcherで事足りるし、その方が高速なんだけど
ツールでカスタマイズ可能なオブジェクトを導入したとたんに破綻しちゃうんだよね…
普通はどうするもんなんでしょうか。
113:名前は開発中のものです。
06/09/04 00:35:37 Q7Y7fGRp
>>110
話題が無いよりマシ
>>112
>>108、>>109にも書いてあるけどStrategyパターン使ったら?
114:名前は開発中のものです。
06/09/04 22:45:10 rb/d93oY
衝突は悩みますよねー。
まぁ、衝突判定のためのクラスを作って、そこに対象をごっそり
addしていくような感じですかね。わたしは。
115:名前は開発中のものです。
06/09/04 23:02:41 IU7YOKU2
2Dの衝突判定の話と3Dの衝突判定の話が混在しているから困るw
116:名前は開発中のものです。
06/09/04 23:16:45 FM5ShwwG
次元1つ違うだけジャン
117:名前は開発中のものです。
06/09/04 23:41:18 sQ13V/oj
判定アルゴリズムを語っているわけではあるまいし、問題ないだろう。
118:名前は開発中のものです。
06/09/05 00:52:09 ZZN1keOu
さすがに>>101のやり方は3Dじゃやらんだろww
119:名前は開発中のものです。
06/09/05 01:15:43 XCG3Ame9
画像だとめんどいけど多次元配列にすればいけるんじゃね?
120:名前は開発中のものです。
06/09/05 01:32:48 N2PWUf7J
>>119
普通はAABBのツリー構造にするけどな
121:名前は開発中のものです。
06/09/05 04:06:58 9I8P67h+
グリッドでやるのは現実的じゃないけど、オクツリーなら。
122:名前は開発中のものです。
06/09/05 05:52:03 b0Le55Md
こういう話題も一応『データ構造』の内に入るのかな?
レンジ広めな良スレだな。
123:名前は開発中のものです。
06/09/05 07:11:57 WVxlLvIu
まとめ
・形状衝突判定とゲームオブジェクト衝突判定の話が混在してて紛らわしいお
・VisitorパターンはAcceptor側の個数が暴発するときには使いづらいお
・挙動をStrategy化すればAcceptorが暴発しにくくなるお
・次元を問わずグリッドよりツリーのほうがお勧めだお
124:名前は開発中のものです。
06/09/08 23:55:09 NaDeRAxZ
群体を制御するプログラムのいい案ない?
複数の個体で整列したり陣形を作るっていうのが目標
どっちかというとAIの分野に入ると思うけど
そこまで複雑な物じゃなくてもいいかなと思ってる
125:名前は開発中のものです。
06/09/09 00:04:25 htHhZzlR
チーム全体の行動を担うダミーエージェントを用意して、
そいつが全エージェントの操作を行うというのが楽なんじゃね?
昔からある多間接キャラとかはこういうタイプなんだろか
個々のエージェントが周囲の状態を見て次の移動地点を決めたりするのは
まさしくAIって感じだが果てしなく重くなりそう
126:名前は開発中のものです。
06/09/09 00:27:32 8XOJrFUy
>>125
> 個々のエージェントが周囲の状態を見て次の移動地点を決めたりするのは
> まさしくAIって感じだが果てしなく重くなりそう
そうでもない。
今のクラウドシミュレーションの基礎になってるレイノルズの方法では
3つの単純な操作を各個体に適用するだけでリアルな挙動を作り出せる。
これに、基準になる目標点を個々に与えたり、パラメータを調節・追加することで整列や陣形も表現できる。
といっても完璧に意図した陣形にしたければ、予め動きを指定しておくしかないけど。
127:名前は開発中のものです。
06/09/09 03:06:35 KrPaatUc
boidっ言ってちょ。1行目だけ読んで「レイノルズって誰だ?」とか思っちゃった。
ツリー的な構造にしてセパレーション以外の適用範囲を限定したりすると、
複数の集団が扱えるし、(影響力の強くした)ツリーの親で操作できて手軽。
128:124
06/09/09 11:31:36 c7q33UAv
まとめると
チーム全体の指揮をするエージェントを作る
個々に単純な操作や状況判断する機能をつける
ツリー構造で処理する
思い出したんだがそういえば鳥の群れのシュミレーションとか参考になりそうだと思った
URLリンク(www.red3d.com)
>>125と>>126のやり方を組み合わせられれば理想的なプログラムになりそう
129:名前は開発中のものです。
06/09/09 13:29:03 QcPvLvjH
階層ステートマシーンってどんなものか知ってる人いる?
130:名前は開発中のものです。
06/09/10 00:43:16 20rok1qS
>>129
従来のステートマシン(全てのステートが完全に等価)に
クラスなりパッケージ化で階層を加えて
オブジェクト指向との親和性を高めた物って認識をしてたけど、違うのかな?
131:名前は開発中のものです。
06/09/10 06:09:51 lBlbiG31
>>128
リンク先の動きが魚っぽい。
132:名前は開発中のものです。
06/09/13 09:43:56 NFAfFOse
魚に吹いたw
133:名前は開発中のものです。
06/09/17 13:13:30 w8QCz84O
2chからリンクされていたから何かと思ったら、こういう話かw 一安心。
>>129
ふつーのステートマシンだと全ての状態が対等なので、状態×入力に
比例して記述が増えていく。似た状態をまとめて、必要な記述量を減ら
そうってのが階層ステートマシン。
たとえば RPG の主人公キャラなら、まず「生きてる」「死んでる」で状態を
分けて、さらに「生きてる」の中に「通常」「混乱」「スリープ」とか入れ子に
して挙動が異なる部分だけ書く。
>>130
> オブジェクト指向との親和性を高めた物って認識をしてたけど、違うのかな?
直接は関係ないです。OOPL を使ったほうが書きやすいかな、って程度。
むかし、ゲーム屋さんやってたときに作った代物があるので、どーぞ。
URLリンク(www.issei.org)
参考書
URLリンク(www.amazon.co.jp)
134:名前は開発中のものです。
06/09/17 13:24:01 yvndUkUn
strategyのstrategyみたいなもんか。
135:名前は開発中のものです。
06/09/22 22:18:45 u76SSGNK
質問です。
まず、動的にメモリ上に作成されたオブジェクト、AとBがあります。
ある時、オブジェクトBはオブジェクトAへの参照を保持したとします。
しかしその後、オブジェクトAは消失してしまいます。
こういった場合に、オブジェクトBの保持していたオブジェクトAへの参照が
無効になったことが分かる、良い参照構造がありましたら教えてください。
スマートポインタをちょっと調べてみましたが、あれってこういう場合に使うものではないですよね?(むしろ逆のような感じ)
言語はC++です。
136:名前は開発中のものです。
06/09/22 22:33:30 zpdtl+m6
>>135
boost 使うなら shared_ptr と weak_ptr 組み合わせて使う。
或いは、非参照オブジェクトに
bool isTerminated() const;
みたいなメンバ変数を持たせて、参照側はスマートポインタで保持。使う前に
if (p->isTerminated())
p = NULL;
みたいなチェックを入れる。私は intrusive_ptr 好き人間なので、後者で統一
してました。
137:名前は開発中のものです。
06/09/23 10:55:14 gkZ8TjvK
>>135
インスタンスのポインタのポインタ持たせておけばおk。
Aのインスタンス開放時は必ずぬるぽを指定する。
138:名前は開発中のものです。
06/09/23 14:31:03 HUIkr9ZU
>>136
weak_ptr使ってみました。これは良いですね。
セットされていたshared_ptrが消失すると以降のlock()が無効になる。
これで私の希望は叶ったように思います。
ただ・・これって内部ではどのような処理が行われているのでしょうか?
ソースを読んでみようかと思いましたが・・私にはちょっと難しかったです。
どなたか、簡単に解説していただけませんでしょうか?
intrusive_ptrについては、よく分かりませんでした。
>>137
Bがインスタンスのポインタのポインタを持つとして、
その「インスタンスのポインタ」にあたるデータは
Aが持つのでしょうか?それとも違う者が持つ?または誰も所有しないのでしょうか?
ちょっと具体的なイメージが沸きませんでした。
宜しければサンプルコードみたいなものを書いて頂けるとありがたいです。
139:名前は開発中のものです。
06/09/23 15:44:06 LShRrPtb
>>138
# boostは使ってないけど、weak_ptrの実装に興味あったのでソース見てみた。
# 間違ってたらごめんね。
intrusive_ptrは参照されるオブジェクトに参照カウンタの仕組みが備わっている場合に
使えるスマートポインタ。shared_ptrは参照カウンタをヒープに確保してて何にでも使える
汎用性がある代わりにオーバーヘッドがありゲーム用ならintrusive_ptrが好まれるという
ことだと思われる。
weak_ptrはそのヒープに確保される参照カウンタ(オブジェト)自身の参照カウンタを
上げ下げするもので、weak_ptrが全部消えるとその参照カウンタオブジェクトが
消えるという仕組みのようだね。
# detail/sp_counted_base_w32.hpp
class sp_counted_base
{
long use_count_; // #shared
long weak_count_; // #weak + (#shared != 0)
virtual void destroy() // nothrow
{
delete this;
}
void weak_release() // nothrow
{
if( BOOST_INTERLOCKED_DECREMENT( &weak_count_ ) == 0 )
{
destroy();
}
}
};
140:名前は開発中のものです。
06/09/23 20:21:11 gkZ8TjvK
>>138
こんな感じだな。インスタンスのポインタは別に誰が持ってても良い。
っつかポインタのポインタ持ってる時点でそれと同義だし。
class clsA;
class clsB;
class clsB
{
int val;
public:
clsB(int v){val=v;}
int getVal(){return val;}
};
class clsA
{
clsB **pb;
public:
clsA(clsB **b)
{pb=b;}
int getVal()
{
if((*pb))
{return (*pb)->getVal();}
else
{return -1;}
}
};
141:138
06/09/23 20:22:09 gkZ8TjvK
改行が多いって怒られた。
int _tmain(int argc, _TCHAR* argv[])
{
clsA *a;
clsB *b;
int ret;
b=new clsB(256);
a=new clsA(&b);
delete b;
b=NULL;
ret=a->getVal(); //ret==-1
return 0;
}
142:140=141
06/09/23 20:22:57 gkZ8TjvK
名前ミスった。気にせんでくれ。
143:名前は開発中のものです。
06/09/25 21:33:59 hvNCBo59
ここで挙げられたパターンや何やらを使っているような、
小規模でわかりやすいサンプルってありますかね?
シューティングを作ろうとしているのですが、設計で悩むことが多くて、
参考になるものが欲しくなってきたので、何かあればよろしくお願いします。
144:名前は開発中のものです。
06/10/10 21:23:54 yCqIkWyw
>>143
シューティング製作スレから.
ただし,漏れはまだ読んでないので内容については保証できんが.
URLリンク(ime.nu)
145:名前は開発中のものです。
06/10/31 10:38:39 xPxE7qYC
146:名前は開発中のものです。
06/11/04 23:26:00 fX21zZRx
タスクシステムって本当に有効なのか?
逆にプログラミングが煩雑になりそうな気がするんだが。
147:名前は開発中のものです。
06/11/04 23:30:01 gABtDaTi
>>146
何度か挙がってるネタだな。まず「タスクシステム」を定義しないと、
いつもどおりグダグダになるだろう。
148:名前は開発中のものです。
06/11/04 23:49:54 fX21zZRx
>>147
タスクシステムというのは、
処理関数とワークエリアがセットになったタスクがリスト構造になっていて、
順番にタスクの処理関数を実行していく仕組みだと思ってる。違うかもしれんが。
あるタスクが、ほかのタスクの保持するデータを参照するのが難しそうだ。
149:名前は開発中のものです。
06/11/05 01:52:09 SWu+bHZ4
>>148
関数とワークエリアがセットって言ったら仮想関数使えばいいだけの話。
あとは抽象クラスへのポインタをコンテナに保持すればできあがり。
システムって名付けるほどのもんでもないよな。
そこで済ませておけばいいものを、なんでもかんでもそのリストを
使ってやろうとすると、バグの温床となる「タスクシステム」ができあがるんじゃないか
と思っている。
150:名前は開発中のものです。
06/11/05 02:16:36 luPotGyi
実際C++だと必要ないよ。
151:名前は開発中のものです。
06/11/05 09:28:27 x/qHNT/o
>150
そうでもない。組み込み方面からもたらされたと思われる非プリエンプティブな
スレッドみたいなもうちょっと複雑なものとするなら、C++のみでは無理、
アセンブラが必要。WindowsならCreateFiberを使えるが、NT系で
しか使えない。
これからマルチコアが当たり前になると、スレッドをタスクと名づける人が増える
かもね、おおややっこしい。
152:名前は開発中のものです。
06/11/05 09:43:30 wi810l51
>>151
147の発言を地でいってるな。
153:名前は開発中のものです。
06/11/05 14:05:29 zA+hRC02
>>151
そういう意味のタスクじゃなくて
154:名前は開発中のものです。
06/11/07 04:30:19 grfbgSgu
初心者だがレスさせてくろ
タスクシステムはビデオ屋でいうポストレンタルシステムではないでしょうか
ゲームプログラムにおいてはリアルタイム戦略ゲームのAIに有効かと
例えば自立スレッド型のユニット(目的地を指定すれば、勝手に動いてくれる)をA地点に移動したのち、B地点に移動させるAIを組もうとしたときなど。
ユニットのスレッドが行動リストをもっていて、AIはぼんぼんリストに行動をaddしていけばいい
ユニットのスレッドはリストの下から行動を処理する。
このシステムがないとAIはユニットがA地点に到着した情報を取得し、
その後でB地点に池という命令を出さなければならないのでAIの手間が非常にかかる おやすみなさい
155:名前は開発中のものです。
06/11/07 10:26:39 vi/Nuttr
>>154
それは >>148 の言うようなタスクシステムとは全然違う。
コマンドのキューと言えば十分。システムなんて呼ぶほどのものでもない。
「タスクシステム」の共通な定義が無いのが
一番の問題なのかもしれないと思った。
俺様解釈が多すぎていまさら定義も難しい。
156:名前は開発中のものです。
06/11/07 10:45:17 FxrEUOug
少なくともこのスレでのタスクシステムの共通定義は
>>148でいいんじゃないの?
今までずっとそれ前提で話が進められていたし、
そうでないと思っているのは的外れな>>154だけだと思うんだが。
タスクに親子関係持たせるとか優先度がどうだとかいった細かい部分は
その都度最適なものを選べばよし。
157:名前は開発中のものです。
06/11/07 19:23:55 qUpAvALP
Cでリスト使ってて、
C++に移行したら「それタスクシステムだよ」って言われた。
どうすればいいでしょう?
158:名前は開発中のものです。
06/11/07 21:40:27 3jPQsnxn
もうすこしkwsk
159:名前は開発中のものです。
06/11/08 10:10:54 U+HCvDbD
>>157
そうだよ。って答えれば解決。
160:名前は開発中のものです。
06/11/10 11:57:52 bWKjGfw+
ところで
URLリンク(d.hatena.ne.jp)
ここのブログのこの問題といてみない?
161:160
06/11/10 11:58:41 bWKjGfw+
すまね、上げちまった
162:名前は開発中のものです。
06/11/10 13:40:25 0fi4/IIn
この板にしては珍しく良スレだな
163:名前は開発中のものです。
06/11/10 21:25:10 ZkgdRmE9
>>160
>koei.co.jp scei.co.jp square-enix.co.jp みてるんだったら会社いれてよ!!!!!!
お題とは関係ないがこの辺にワロタw
proxyぐらい使いましょうね、大手の皆さんw
164:名前は開発中のものです。
06/11/10 22:26:18 HTGezavx
>>163
別に問題ないと思うけど。さすがに社内サーバのアドレスを referer で飛ばしてくるのは
どうかと思うが>k社
165:名前は開発中のものです。
06/11/11 01:08:30 YsMNBgEw
自意識過剰
166:名前は開発中のものです。
06/11/12 00:41:12 uTWo+6kj
んで問題はとかねーの?
167:名前は開発中のものです。
06/11/12 01:35:58 R+1O/KH4
>>166
マジメに考えるほどのもんじゃない気がするが。
メモリの断片化や使用量見積もりを考えると、全オブジェクトを必要最小限の寿命で
確保・解放なんてせずに、シーン毎に必要なファイルぶち込んだアーカイブ作って
終わりだし。
168:名前は開発中のものです。
06/11/16 13:28:43 S/Ecbdk+
コーエーといえば寝るおもしろす事件だなw
169:名前は開発中のものです。
06/11/16 14:51:20 fgcxjfqh
>>167
いつ何時どういう顔でどういう武器を持ったアバターが登場するかわからない
MMOとかだとシーンとか生ぬるいこといってられないんじゃない?
170:名前は開発中のものです。
06/11/18 00:38:40 hjek6YSO
>>169
組み合わせが分からないなら、ワーストケースでも対応できるようにする必要があるから、
賢いメモリ管理はしない方が良いと思うが。
171:名前は開発中のものです。
06/11/18 00:45:51 Blaci8UD
10000とか決めうちで適当にアバター(?)放り込む領域とっときゃい~じゃん。
クライアントで10000人同時表示とかどうせ無理だからw
なんかが湧いたとしても、
射程外の見かけ小さく見えるアバターから削除しちまえばOK。
172:名前は開発中のものです。
06/11/18 18:42:03 uDXwDRk4
>> 171
その領域のどこに確保されたのかを示すハンドルやポインタはどうすんのよ。
173:名前は開発中のものです。
06/11/18 19:28:39 GUEcKJwf
スケーラビリティはガン無視がゲームにおけるデータ構造・クラス設計の常識?
174:名前は開発中のものです。
06/11/19 04:21:52 qRasGZX0
コンシューマならそれでも良いと思うけど、
昨今のPCゲーム開発であればスケーラビリティは必須では?
なんせ環境が数倍以上違うことだってあるからね。
175:名前は開発中のものです。
06/11/19 06:35:18 2miANHZG
> その領域のどこに確保されたのかを示すハンドルやポインタはどうすんのよ。
領域が決めうちでも決めうちでなくても発生する問題。
> スケーラビリティ
MMOなんだから、クライアントの更新でスケーラビリティを代替すればいい。
逆にPCの優劣で、プレイヤー間に格差が出るほうが問題と言えば問題。
176:名前は開発中のものです。
06/11/19 09:18:23 GnePFvEb
んで問題はとかねーの?
177:名前は開発中のものです。
06/11/19 10:07:08 P05vv5BZ
あれは、クラスデザインで対応すべき問題ではない、っつーのが答え
だろうな。
178:名前は開発中のものです。
06/11/19 15:53:33 3G1y/i2K
>> 175
だから、それを採用してもその問題が残るんだろ?
この問題の本質はそこだろ。どうやってデータへのアクセスを共有させんだ?
179:名前は開発中のものです。
06/11/19 16:36:03 2miANHZG
いや、エンジン書いてもそれはゲームじゃないからw
さっさとゲーム上の具体的なシーンについて見積もりを建てなさい。
領域なんて初期化時に必要な領域全部取ってしまえば問題無い。
180:名前は開発中のものです。
06/11/19 16:54:45 3G1y/i2K
>> 179
件のサイトってMMORPG作ってるわけで、
MMORPG開発を前提にした問題を出してるんだがなあ。
シーンなんて簡単なもんじゃ見積もれないって。
181:名前は開発中のものです。
06/11/19 17:17:03 2miANHZG
↓↓↓ここから見積もれる/見積もれないの一点だけで100年戦争↓↓↓
182:名前は開発中のものです。
06/11/19 20:33:12 GnePFvEb
なんか虎をつかまえてほしいなら虎を屏風からだしてくれみたいな回答だな
あきれた
183:名前は開発中のものです。
06/11/20 01:22:30 SHLy4x4v
>>180
URL貼った上で「件のサイト」を持ち出すのは、
あまり良くないと思うのだが…
184:名前は開発中のものです。
07/01/14 05:03:57 gu/ia/06
良スレあげ
185:名前は開発中のものです。
07/01/19 02:34:32 RsBU2cJ/
シーン・・・
昔すべてのシーンはスタックのみで再現可能と思ってた時が俺にも有りました。
実際大半はOKだけど、相互に行き来できるような仕組みを作りたい場合
別の方法をとらないといけないし、平行して動かす場合や
一部をストップさせたいときはいっそシーンクラスじゃなく
スレッドで動くクラスの方が良いと思えてきました。
まだ研究中。
186:名前は開発中のものです。
07/01/19 13:33:30 GdZe8cga
俺はそれは兄弟関係をコンポジットにして解決しとるよ
187:名前は開発中のものです。
07/01/19 14:48:25 RsBU2cJ/
コンポジットパターンですか?
なるほど。
188:名前は開発中のものです。
07/01/27 00:03:58 Mwc3VMrB
良スレ発見。
皆様のお知恵をお借りしたい。
効果音、BGM、描画エンジンなどの管理オブジェクト(コンテキストっていうのか?)をどうやって、
キャラクターなどから参照させるかということについてです。
キャラのオブジェクト生成時に、必要なものだけ渡してやるのがベストなんでしょうか?
今は、全部持ったGameクラスっつーのを作って、そのインスタンスのローカル変数一個を
どこからでも参照できるようにして、
各キャラクターから参照できるようにしているんだが、
今の流行的に、ローカル変数がイヤンなので、
なんとかしてやりたいのです。
ABAさんのソースとか見ると、生成時に引数で渡しているんだけど、
うちのDelphiだと、各ユニット間の循環参照問題を回避できなくて真似できないんだよね・・・。
189:名前は開発中のものです。
07/01/27 00:27:08 GLW5syD3
ローカル変数?グローバル変数だよね。
その方法がまあ無理なくやれると思う。
グローバル変数がどうしても嫌なら
インターフェイス宣言を使えば、循環参照は回避できるよ。
190:名前は開発中のものです。
07/01/27 00:46:55 Mwc3VMrB
ごめん。グローバル変数です。
インターフェースか、Delphiのインターフェースって普通じゃないからなあ。
過去レスに出てた↓こちらのCtxってのが参考になるかもしれんけど。
或曰: お仕事
URLリンク(www.issei.org)
191:名前は開発中のものです。
07/01/27 01:29:23 lX9/hWgh
音はコンテクストとは違うのでは?リソース?
そのインスタンスの性質そのものなんだからバリバリ依存してていい
描画デバイスはそれ自体のステートがあるんで外からもらう必要があるだろうけど
別にグローバル変数で問題ないでしょう?
まあ描画するときにだけ引数でもらうように改変するのを無理して止める気はないけど
>URLリンク(www.issei.org)
おもしろいなーfacade+visitorかぁ
192:名前は開発中のものです。
07/01/27 05:01:28 Cu/waNhi
サウンドみたいなものはモロにシングルトンにしてしまって
CSoundManager::GetInstance().Play( FX_HOGE );
こんなんでよいのでは
193:名前は開発中のものです。
07/01/27 14:40:32 lX9/hWgh
>URLリンク(www.issei.org)
何か違和感があったので、寝ながら考えたんだけど
こいつの問題はゲームエンティティのクラスとctxのインターフェイスが1対1になってるとこかな。
まったく同じ汎用的なインターフェイスを複数のエンティティへ公開したいとしても
いちいち別の実装とインターフェイスを設けなくてはならなくなる。
意味のない制約を守るために重複コードができてしまう。
194:名前は開発中のものです。
07/01/27 15:41:16 lX9/hWgh
それにゲームエンティティクラスが増えて、継承の階層とかができても
ctxの実装は全部の名前に_ctxつけたインターフェイスを全部同時に多重継承するんだろか?
ctxにmixinするインタフェイスはゲームエンティティのクラス群の構造に依存しないで
区分けそのものに対する名前をつけてやる方がきれい、というか合理的に思う。
例えばとにかく弾をつくるインタフェイスを公開するctxインターフェイスならICtxShootとか。
195:issei
07/01/27 22:48:39 +PYaC1IQ
>>193
> まったく同じ汎用的なインターフェイスを複数のエンティティへ公開したいとしても
> いちいち別の実装とインターフェイスを設けなくてはならなくなる。
そうですね。
ただ、純粋仮想関数のプロトタイプが同じなら実装は一つで済むから、ヘッダ
ファイルをメンテするのが多少面倒って程度です。
struct ICtxEnemy { virtual void createShot() = 0; };
struct ICtxField { virtual void createShot() = 0; };
class Manager : public ICtxEnemy, public ICtxField { virtual void createShot(); };
// これで実装は両方に提供できる
このスキーム使って仕事で RPG のリアルタイム戦闘を作ってたんだけど、面倒で
手に負えないって状況には至らなかった。むしろインターフェースごとに公開する
関数が限定されていたから、仕様変更時にチェックが短期間で済んだ感じ。細かい
数字を残してないから、具体的に何パーセント改善とは言えないけどさ。
汎用的なインターフェースをどうするかってのは悩みどころだけど、やりたければ
sturct ICtxEnemy { virtual ICtxCommon& getCommonCtx() = 0; };
とかかなぁ。私は汎用インターフェースは結局作らずシングルトンで済ませちゃった
けど。
196:名前は開発中のものです。
07/01/27 22:53:18 FT2+QYPW
>188
個別にオブジェクトのアドレスを渡した場合、パラメータの個数が膨大になるのと、
きれいにまとめないとかなり手間がかかるね。
シングルトンで実装して、グローバルアクセスがよいのではとおもう。
197:名前は開発中のものです。
07/01/28 01:11:39 aVNVY6/P
>>issei(誰?w)
>// これで実装は両方に提供できる
確かにそうだね。書いてみてから気がついた。
具体的に書くコードの量とかの増減をあげつらう批判をしたいわけじゃないだホントは
また寝ながら考えたんだけど、要はこれはエンティティクラスの主要なメソッドを使うには
このctxインターフェイスを実装しているオブジェクトをなんとかして用意してください。
というエンティティクラスからの表明が主題で、managerが全部を継承して実装するというのは、
たまたま今回採用されたやりかたに過ぎない、別にどうでもいい部分なんだね。
エンティティクラスが継承ツリーをつくるようなときは最上位のクラスのctxに
下位層のクラスが使おうとする純粋仮想関数も書き加えてかなきゃいかんね。
つまり最上位のオブジェクトを以って、主要メソッドを実行しても、
その下位の継承したクラスの機能追加されたものが呼ばれる可能性があるわけなので。
なんで俺が日記の作者も言ってない手法の使い方をまとめてんだ…
ぜんぜん関係ないけどcontextってのはあんまり実態にそぐわない名前だと思うなぁ。分かるけど。
relianceとかdependencyとかのがいいような気がする。
198:issei
07/01/28 01:38:40 ViuHLna9
>>197
> >>issei(誰?w)
日記の人です。
> また寝ながら考えたんだけど、要はこれはエンティティクラスの主要なメソッドを使うには
> このctxインターフェイスを実装しているオブジェクトをなんとかして用意してください。
そうそう。
本当のマネージャとは別に、エンティティの単体テスト用とかデバッグ用に ICtx***
インターフェースを実装した別のマネージャーも作ってました。
確か別のプログラマがエフェクト用の対話型エディタを作ってたんだけど、そこで
デザイナからキャラクタにエフェクト乗せて見たいとリクエストがあって、エフェクト
エディタにキャラクタ用のコンテクスト実装してたんじゃなかったかな。もちろん、
大半の仮想関数はダミー(ヒット判定なんかの関数は、常にヒットしないと返す
だけ)だけど。
199:名前は開発中のものです。
07/01/28 19:27:03 aVNVY6/P
風呂はいりながら考えたんだけど
ようは移植用区画、エンティティクラス、実装を委譲したい関数群、
それぞれをシステム内で1対1対1。ひとまとめにしたいわけだ。それはわかる。
だが無駄に暗黙的な命名の制約を持ち込むvisitorインターフェイスには反対。
contextというが、それらが文脈として差異を持たされるのは結局はプロジェクト全体で複数作られる
実行単位ごとなわけだ。それに対してvisitor風に関数レベルで型への依存を表明するのは
適当だとは思えない。何がどのレベルで変わるのかがきちんと示せてるのがいいコードっすよね。
ついでに実装をまとめるだけが目的の節操のないmixinも反対だ。
俺はこうする。
class Player
{
public:
void exec() { CreateShoot(); }
void Method0();
private:
static void CreateShoot(); // どこか他のコンパイル単位で定義してやる
};
どこか他のシステムへもっていってもstatic関数を定義した.cppの方だけ取り替えれば移植が完了する。
200:名前は開発中のものです。
07/01/31 00:35:16 NKCnpIjT
クラス名・変数名に迷ったら書き込むスレ。Part9
スレリンク(tech板:113-132番)
から誘導されてきました。
・こんな構造の名前はなにがいいですか?
・タスクっぽいですねー
・擬似マルチタスクっぽいかも?
・スタック使え!
・え?スタック?
・segregated storage使え。
・boostのpool?
まあ、そんな感じで、ゲーム向けのデータ構造をどうするかって話になりました。
201:名前は開発中のものです。
07/01/31 00:44:13 YqKTmdjS
>>200
答えでてんじゃん。
ここで何が聞きたいの?
202:名前は開発中のものです。
07/01/31 00:49:48 jNUdiQRe
フラグ立ててるだけなのがなー。
削除と同時に最後尾のデータをコピーしちまえ。
203:名前は開発中のものです。
07/01/31 01:00:05 8/b3tbHY
>>200
そのアルゴリズムのどこが高速なのか本当に分からない。
フラグを立てて何に使うの?
204:名前は開発中のものです。
07/01/31 01:08:05 kxHbC4YN
いや、向うで煙たがられて誘導されたからって、
本当にこっちに来る事もないだろww
205:名前は開発中のものです。
07/01/31 01:09:38 8/b3tbHY
今適当に書いたけどフラグなんか使うよりこっちのほうがいいんじゃないか
template<typename T,int N>
class FixedAllocator
{
union Block
{
T Data;
Block* pNext;
};
Block* m_pGarbage;
Block m_Pool[N];
public:
FixedAllocator()
{
m_pGarbage = &m_Pool[0];
for( int i = 0; i < N-1; i++ )
m_Pool[i]->pNext = &m_Pool[i+1];
m_Pool[N-1]->pNext = NULL;
}
T* Alloc()
{
Block* pRet = m_pGarbage;
m_pGarbage = m_pGarbage->pNext;
return &m_pGarbage->Data;
}
void Free( void* p )
{
static_cast<Block*>(p)->pNext = m_pGarbage;
m_pGarbage = static_cast<Block*>(p);
}
};
206:名前は開発中のものです。
07/01/31 01:10:11 94hlWcQw
>>202
フラグ管理より双方向リストでつないどくのが良いと思うけどな。
struct PoolNode
{
struct PoolNode* pn_next;
struct PoolNode* pn_prev;
char pn_padding[8]; //必要なら
char pn_buf[PN_BUFSIZE];
};
static PoolNode nodes[NODENUM];
// 未使用ノードは、こっちにつなぐ
static PoolNode* free_first = &nodes[0];
// 使用中ノードは、こっちにつなぐ
static PoolNode* inuse_first = 0;
現実には、俺なら自前で書かずに STLport の node allocator にお任せして、
STLコンテナ使っちゃうか、boost::pool だけと。
207:名前は開発中のものです。
07/01/31 01:13:52 NKCnpIjT
boostみて、なんじゃこりゃーな感じだったので、
>>206とか、見るとわかりやすいですね。
配列でデータは持つんだけど、使用中ノードは、連結リスト風につないでおくっと。
未使用ノードも同じようにもつ。
これだけで、済む話かー。
208:名前は開発中のものです。
07/01/31 01:14:36 YqKTmdjS
>>205
それが segregated storage だろ。
209:名前は開発中のものです。
07/01/31 01:15:32 8/b3tbHY
>>208
そう言うのか
210:名前は開発中のものです。
07/01/31 01:17:52 kxHbC4YN
欲しいのはクラス名だけであって、
>>200が考案した以外のクラスなんて興味ないんだろw
だって、>>200より優れたクラスなんて存在しないんだからwww
つ 【ステフ18クラス】
つ 【次世代コミュクラス】
つ 【バキュンバキュンクラス】
この板ならではのクラス名を授けるから好きなの選べ
211:名前は開発中のものです。
07/01/31 01:18:10 8/b3tbHY
そう言うっていうか、boostのクラスなのか。
boost、まだ知らん機能多すぎる…orz
212:名前は開発中のものです。
07/01/31 01:22:57 94hlWcQw
boostは、知ってても使いこなせてないクラスも多いなぁ。fusionとかmplとか。
普段お世話になってるのは、stdafx.h 見るとこんな感じ。
#include <boost/array.hpp>
#include <boost/bind.hpp>
#include <boost/call_traits.hpp>
#include <boost/crc.hpp>
#include <boost/cstdint.hpp>
#include <boost/function.hpp>
#include <boost/format.hpp>
#include <boost/intrusive_ptr.hpp>
#include <boost/lambda/lambda.hpp>
#include <boost/lambda/bind.hpp>
#include <boost/lexical_cast.hpp>
#include <boost/noncopyable.hpp>
#include <boost/ref.hpp>
#include <boost/scoped_ptr.hpp>
#include <boost/scoped_array.hpp>
#include <boost/static_assert.hpp>
213:名前は開発中のものです。
07/01/31 01:24:55 NKCnpIjT
>>210
変数名つけろスレから着たけど、
いまや、クラス名だけでないです。
>>210さんが、私のデータ構造を最高!マンセー!他はクズ!>>200様に一生従います!
と言ってくださるのは、うれしいのですが、
他に、どんな効率のよい、データ構造があるかというのを知りたいのです。
Delphiには、boostねーよー。うらやましい。
214:名前は開発中のものです。
07/01/31 01:26:10 NKCnpIjT
× >>200様に一生従います!
○ >>200様に一生を捧げます
間違えました。
215:名前は開発中のものです。
07/01/31 01:26:40 94hlWcQw
>>213
効率はデータの使い方に依存する。で、何に使おうと思ってるの?
216:名前は開発中のものです。
07/01/31 01:46:00 94hlWcQw
もしかしたら、主要なデータ構造を一通り勉強したいってこと? それなら、
まずは(データ構造を処理するアルゴリズムとセットで)
・Cプログラマのためのアルゴリズムとデータ構造
・珠玉のプログラミング
・プログラム設計の着想
・プログラミング作法
あたりの書籍を読むのがお薦めだが。
217:名前は開発中のものです。
07/01/31 02:00:35 kxHbC4YN
>>213
いや、普通に皮肉だから、無理にレスしなくていいよ。
218:名前は開発中のものです。
07/01/31 02:31:13 sTyDsN4F
この板で数少ない有用なスレッドだな
219:名前は開発中のものです。
07/01/31 15:38:04 CxDF9OMM
>>215
パーティクルや弾幕のように、
追加、削除の頻度が高い場合に使える構造はないかと探していました。
>>216
勉強したいだけ、というわけではないのですが、
参考になります。
220:名前は開発中のものです。
07/01/31 19:22:58 WbpDldoh
弾幕だったら各機で同時に発射しうる最大数に応じた領域確保しちゃうかな。
頂点バッファは1つあれば十分だし。
221:名前は開発中のものです。
07/01/31 20:28:29 94hlWcQw
>>219
パーティクルは出現数の上限を決めて、それを超えたら適当に消すのが常套手段。
多少消えても人間は気づかんから。
メモリ管理自体は PS2 以降のハードなら大した工夫は要らなくて、pool なり STLport の
node allocator なりで十分な性能が出る。それよりベクトル演算効率化することを考えとけ。
222:名前は開発中のものです。
07/01/31 22:47:38 YNrC6zK6
>>221
おまいの賢さは分かったが数個前のレスくらい読んでやれ
223:名前は開発中のものです。
07/01/31 23:00:17 94hlWcQw
>>222
同時に発射しうる最大数を確保して超えないことを保証するのと、適当な数を
確保しておいて越えたときに消しちゃえってのは、一見似てるけど使いどころが
違う。
一般にヒット判定があれば前者、単なる見た目だけなら後者。ヒット判定がある
ものを適当に消すと致命的なバグになったり、予期せぬ挙動をすることがある
ので。
224:219
07/01/31 23:25:03 NKCnpIjT
まあ、実際、別のプロジェクトで、毎回、インスタンス生成しても、
描画の方が圧倒的に遅すぎるというプロファイル結果が出たりしたので、
そんなに神経質になる必要はないんですけどね orz
(動作環境は、PCです)
新しいプロジェクトで、
パーティクル一杯出したいから、それぐらいは、pool化したいなって思ったんです。
225:名前は開発中のものです。
07/03/21 22:27:58 /cwA8n13
>>224
シミュレータの場合、速度最優先で描画をしない状況もあるから、
それが免罪符にならない場合もあるんだよね
226:名前は開発中のものです。
07/03/23 13:48:25 vxAgs8Dc
良スレage
227:名前は開発中のものです。
07/03/26 06:10:31 mFbF2Qb2
ところで、
キャラクターの構造体は何で取ってる?
今じゃ普通にダブルでとっても問題ないよな。
むしろ、その方が微調節がしやすくって良いよね。
俺は貧乏癖がついててイントでとって微調節がやり辛くなって、
結局後で困ったりしてるんだよね。
皆は何で取ってる?
228:名前は開発中のものです。
07/03/26 06:11:56 mFbF2Qb2
あ、ゲームは普通の2dのアクションゲームとかです。
229:名前は開発中のものです。
07/03/26 08:35:24 I1HKFzJn
doubleでおk
次の話題どうぞ
230:名前は開発中のものです。
07/03/26 12:51:40 74T0tUus
単純にintのかわりにすると計算誤差で困ることも多いからちゃんと使ってくれ
具体的にはイコールで判定とかやっちゃだめだぞ
231:名前は開発中のものです。
07/03/26 18:43:03 /edWn9Q+
>>227
自分で固定小数点数作るのが楽ちんだろ
浮動小数点数の等号問題も出ないし
232:名前は開発中のものです。
07/03/26 19:09:19 I1HKFzJn
桁落ちの誤差で困ったことはないなあ。
「本当はセーフだったのに、桁落ちしたせいで等号が成立して
敵に当たったことになって死にました」みたいな状況は
あるだろうけど、まず気づかないと思うし。
そのあたりを完璧にしたいのであれば、丸め誤差も考慮に入れて
10進固定小数点数クラスを作らなければならないだろうけど、
そこまでしたくないというのが正直なところ。
233:名前は開発中のものです。
07/03/26 19:20:52 /edWn9Q+
>>232
そんなクラス作らなくてもいいんじゃね?
16ビットシフトするだけでゲームの精度的には十分かと。
234:名前は開発中のものです。
07/03/26 21:35:29 /T0E1d66
URLリンク(shinh.skr.jp)
235:名前は開発中のものです。
07/03/26 22:10:26 xV5pAsSl
>>232
なんか勘違いしてるけど、固定小数点数にするのに10進は関係ないぞ。
236:名前は開発中のものです。
07/03/26 22:13:45 I1HKFzJn
>>235
10進って言ったのは、丸め誤差を考慮しての話なんだけど。
桁落ちとは関係ない。
237:名前は開発中のものです。
07/03/27 01:42:55 0naF3MYn
10進でも2進でも丸め誤差は出るってば。
238:その1
07/03/27 06:12:21 6cy45QrY
「キャラの座標の型に関して」
・整数か小数か -> 断然小数
・小数の表現方法
-> 浮動小数点数 or 固定小数点数
-> 2進表現 or 10進表現
・浮動小数点数
○ 基本型であるので扱いが楽
× 演算速度が遅い
△ 非常に近い値同士を比較したときに桁落ちが発生する
(桁落ちが発生したところで別段問題がない場合も多々ある)
・固定小数点数(クラス実装)
○ 比較による桁落ちが発生しない
○ 実態は整数型なので演算速度が早い
-> × 汎用性の高い実装(シフト数の異なる固定小数点数同士でも演算を
可能にするなど)を行うと、結局浮動小数点数以下の演算速度に
× 固定小数点数オブジェクトの生成が頻繁であると遅くなる
(特にオペレータ・オーバーロードに注意)
△ 小数点以下の精度(桁数)が固定
(ただし、精度が足りなくて困ることはまず無いと思われる)
239:その2
07/03/27 06:13:22 6cy45QrY
・2進表現
○ 基本型は2進表現なので扱いが楽
× 10進表現で有限小数となるが2進表現で循環小数になるような値の場合、
表現できない桁が切り捨てられるなどして丸め誤差が発生する
・10進表現
○ 循環小数に対する丸め誤差が起きない
-> × 一般によく使われるであろう加算減算処理では問題ないが、
除算を行うなどすると何進数であろうが丸め誤差は発生する
XX 基本型とは程遠い別次元の演算手法が要求される
(2進表現で循環小数となるような値を基本型で記述した時点でアウト)
× 同じバイト数で表現できる値の範囲が2進表現より狭い
勝手にまとめっぽい形式で書いてみた。
固定小数点数に関してはクラスとして実装した場合を想定した。
個人的に、固定小数点数を素のintで表現して、その都度シフト変換を行うような手法は、
変換方法に依存した関数/クラスを大量発生させるので論外だと思う。
240:名前は開発中のものです。
07/03/27 06:39:01 AmaYqa2T
10進表現ってBCDのことだったの?
俺はてっきりintを10^nで割って使う話だと思ってた。
241:名前は開発中のものです。
07/03/27 06:42:53 6cy45QrY
色々書いたけど、結局俺は無難なdoubleを使っちまうかなあ。
試しに固定小数点数クラスを作ってみたけどあんまし早くならなかった。
っていうかコンパイラによって速度が大きく変わりそうな予感。
10進表現での計算は、誤差が出たら切腹必至の
銀行システムとかでのみ使うものだと思っている。
言語的にサポートされていれば話は別だけど。
以上長文&駄レスすまん。
242:名前は開発中のものです。
07/03/27 06:45:51 6cy45QrY
>>240
俺は流れ的にBCDのことだと思ったが…。違ってたらすまん。
243:名前は開発中のものです。
07/03/27 10:06:48 KORunXqt
昔は、固定小数点使ってたな
今は、さすがに、浮動小数だわ
問題は、環境によっては、リプレイでずれるとかその辺
(D3DXの最適化とか最適化とか最適化とか)
244:名前は開発中のものです。
07/03/27 12:34:52 WDGoOIYE
浮動小数点だと0.1ですらがあらわせないからな
表せないのに無理しているのが浮動小数点
あらわせないのなら扱わない、問題が出ないようにするのが固定小数点
0.1を10回たしたら1になるとか思ってるような人は固定小数点つかっとけと
245:名前は開発中のものです。
07/03/27 14:36:14 DOw2VNK3
アナログコントローラーとか3D処理やったこと無いのかな
246:名前は開発中のものです。
07/03/27 19:55:06 OAIOW3b5
Flashとかだと0.5ずつずらさないと隙間が空くとかあるんだよね
247:名前は開発中のものです。
07/03/27 20:06:13 6cy45QrY
微妙に関連する話題だと思うんだけど、
皆は(無限)多倍長精度整数を使ってたりする?
248:名前は開発中のものです。
07/03/28 00:55:28 3c8pkg+a
>>247
固定小数点数使ってたら、上の桁が足りなくて、
仕方なしに64ビット整数を使っちゃったことはある
249:名前は開発中のものです。
07/03/28 05:12:49 cMkZ8VMH
>>247
そういうのは学術用だと思うよ。
ゲームなら実際問題そんないらんっしょ。
250:名前は開発中のものです。
07/03/28 05:53:37 vQ7wya7A
得点計算で使われることもあると思う。
32bit符号なし整数では40億程度しか表せないし。
恐ろしい桁数の得点をガンガン加算させて、
かつ一の位までキッチリ使っちゃうような
血も涙もない鬼の方御用達です。
251:名前は開発中のものです。
07/03/28 07:59:56 cMkZ8VMH
無限多倍長精度整数って書いてるんだよな。
long longより上だと3倍長で7.9x10の28乗とかになるけど……要るか?
252:名前は開発中のものです。
07/03/28 11:11:39 xf4mLohJ
>>249
んなーこたーない。
経営シミュレーションで多倍長な変数を使うことはあるよ。
キャッシュとか資産とかの額で。
まさか、浮動小数点使うわけにはいかんし。
253:名前は開発中のものです。
07/03/28 12:08:50 hyD2GS3G
ビルゲイツの資産とか32bitに収まりきらんもんな
254:名前は開発中のものです。
07/03/28 12:54:06 HnZM11tF
そもそもビルゲイツの資産は、株価がちょっと変わるだけで
とんでもない額が変動するから、下の方の桁にあまり意味はない。
255:名前は開発中のものです。
07/03/28 15:10:12 +k+f3/yD
32bitどころじゃないだろ。
まあ、毎年訳分からん団体に1兆寄付してるおっさんだからな。
寄付してるのは妻の方だけ?
256:名前は開発中のものです。
07/03/28 16:57:57 erfbPR6U
自分の設立した財団じゃないのあれ?
257:名前は開発中のものです。
07/03/30 00:16:52 xOzIjQQy
Delphiの日付用構造体TDateTimeを馬鹿にするなよ?
日付なのに、不動小数
258:名前は開発中のものです。
07/03/30 01:10:16 /yTpVVer
不動ならいいや('ー`)
259:名前は開発中のものです。
07/03/30 03:52:48 HXn7HlKm
MSのAccessも日付はdoubleでもってたような・・・
260:名前は開発中のものです。
07/04/01 02:13:01 aK7v4JwN
いいシーン管理方法が思いつかない…。
「シーンはスタックに積む」って話をよく聞くけど、
積みっぱなしでメモリは大丈夫なのかとか、
タイトルシーンやメニューシーンはその都度生成した方が
再初期化の手間いらずで楽なんじゃないかとか、
ロードの際にスタックの中身をいちいち
再現しなきゃいけないんじゃないかとか、色々疑問が残る。
261:名前は開発中のものです。
07/04/01 13:27:10 vpNPV10r
>>260
何が「いい」かは作るプログラムによって違うからな。
疑問に思うんならやってみろとしか言えない。
262:名前は開発中のものです。
07/04/01 14:21:19 XdYqPGRk
なるほどそういうときにシリアライズを使うのか
263:名前は開発中のものです。
07/04/01 15:15:13 Sn7iJUNq
>>260
Gemsの5巻にスタックを使ったシーン管理が載っている。
試してみたら、なかなか使い易かったよ。
264:名前は開発中のものです。
07/04/01 15:35:35 gVILklLW
>>262
javaのシリアライズの話ならそういう時の為のものじゃないぞ
265:名前は開発中のものです。
07/04/01 20:39:12 4uyw/V8k
>>260
作ってるゲームによるでしょ。
シーン切り替えの度にブラックアウト & ロード処理が入るふつーの RPG だと、
シーンは必要な都度 new して作る(ただしテクスチャ・モデル等のリソース類は
事前に割り当て決めておく)、状態遷移はプログラム側でベタに行う…で十分に
管理できる程度だった。
266:名前は開発中のものです。
07/04/05 20:02:57 53u6wZm0
>>263
Gemsうp!!
って、無理だw
ソースコードだけでも配ってないのか・・・
267:名前は開発中のものです。
07/04/06 02:24:49 jVhSsUiB
【警告】
日本はカルト教団に支配されてしまいます。
選挙に行きましょう。
268:名前は開発中のものです。
07/04/06 16:07:18 +BNVME6N
スタックベースのシーン管理に参考になるページはないですか?
269:名前は開発中のものです。
07/04/07 09:34:17 ok5ggep+
どっかのやねうの昔のサイトに解説がなかったか。
270:名前は開発中のものです。
07/04/07 12:47:03 lstp6MTf
YaneSDK.Netのソース読め
271:名前は開発中のものです。
07/04/08 01:31:41 TWCxMGaJ
本人がいらっしゃるようなので一言申し上げますが
yaneSDK3rdの更新してください><
2ndからトランジエントビルトを移植しようとしたんですが正直無理です><
272:名前は開発中のものです。
07/04/08 01:42:46 Svf9QlZ3
無理とか言ってたらなんも成長しないがな。
つか本人が来たとか本気で思ってるのか。
273:名前は開発中のものです。
07/04/08 02:50:06 l6t1YJuf
皮肉にマジレスしてどーする
274:名前は開発中のものです。
07/04/08 13:14:13 8g6onocj
そういや、やねうらおの会社の社員が、やねうらおを訴えた件はどうなったんだろうな。
275:名前は開発中のものです。
07/04/09 03:25:15 /ygJ9fwS
騙された馬鹿が、ギャーギャー文句言ってただけ
276:名前は開発中のものです。
07/04/09 03:38:12 TJO4g1v+
いい加減スレ違い。
277:名前は開発中のものです。
07/04/09 13:14:13 /ygJ9fwS
スタックベースのシーン管理について質問
つくってみたけど、いまいち利点がわからん・・・
何が便利なんだろう・・・
278:名前は開発中のものです。
07/04/09 15:13:20 bk7kEELW
スタックみたいな古臭いのじゃなくて
デザインパターンでオブジェクト指向的にスッキリと出来ないものなんだろうか
279:名前は開発中のものです。
07/04/09 16:14:10 3UDAKRrm
シーンをオブジェクトと見なしてスタックに積むんだから、
十分オブジェクト指向じゃないかと思うんだけど、そういうことではない?
280:名前は開発中のものです。
07/04/09 18:50:04 CrOX57BA
>>277
利点かー。
末端のシーンがどこに戻るか把握しなくていいから、シーンを柔軟に組めるとか、シーンを再利用しやすいとか。
ごめん、思いつきで書いた。
281:名前は開発中のものです。
07/04/09 20:46:27 d0StE6D+
>>279
うん。
それ自体が定型になるなら、スタックベースのシーン管理というのも
ゲームにおけるデザインパターンといっても過言ではないと思う。
282:277
07/04/09 20:49:46 d0StE6D+
とりあえず、googleして、定番とおもわれる
・呼び出し(Call)
・移動(GoTo)
・呼び出し側に戻る(Return)
をシーン管理オブジェクトに、実装して、シーンを状態遷移してみたりしたんだけど、
これって、シーンを遷移するときって、前のシーンは開放しちゃっていいのか?
開放しちゃうと、
しなかったらしなかったで、リソース圧迫するし
クソー、Game Programing Gems 5がほしいZE
283:277
07/04/09 20:54:13 d0StE6D+
> 開放しちゃうと、
開放しちゃうと、呼び出し(Call)の意味あんのかな?と思うし
284:名前は開発中のものです。
07/04/09 23:33:21 HDs+xqt8
ところでシーン間の関係はだれが持つの?
シーンクラス?シーン管理クラスとか他のクラス?
分岐のあるゲームだとこれ重要。
次に進めるべきシーンを決める奴が持てばいいのか・・・?
シーン遷移管理とシーン関係管理+フラグ管理に分けるとか?
>シーンを遷移するときって、前のシーンは開放しちゃっていいのか?
javaだとこれ厄介なんだよね。何しようが使ってなかったら勝手に拾われるから。
一応クリーンアップなりシャットダウンなり処理して放置かな。
こういうときにファイナライザ使うもんじゃないしね。
285:名前は開発中のものです。
07/04/10 00:13:19 NhbAQuFj
>>277
シーンは最初に全部確保して
最後に全部解放してるよ。
シーンスタックそのものが「アクティブなシーン」のスタックであって、
今アクティブじゃないシーンは別のリストに保管してる。
でスタックに積まれてるものは一通り処理する。
こうすることで移動画面中にメニューも表示して移動もメニュー選択も可とか
裏画面でデモ(通常ゲーム処理)回しながら上にウィンドウ表示とか
出来ますよ って趣旨だったと思う >Gems5
ただ、ウィンドウ関係以外には特に利点は無さそう。
286:名前は開発中のものです。
07/04/10 01:08:35 wXzQkwkx
マルチスレッドを実現する手段の一種ということ?
287:名前は開発中のものです。
07/04/10 01:12:58 vYIHoF6r
>>285
>でスタックに積まれてるものは一通り処理する。
これ、厳密にはスタックって呼べなくね?
LIFO≠スタック
288:名前は開発中のものです。
07/04/10 01:16:37 EIMh3HFt
なんだ、シーンの遷移がスタック的なのかと思ってた。
289:285
07/04/10 01:26:00 NhbAQuFj
>>287
上にシーンを積んだときにサスペンド処理(シーンクラスのメソッド)を呼ぶようにして
サスペンド中も実行したいシーンはその処理でサスペンド時も実行してねフラグを立てる
とかそんな処理になっていたと思うから 一応一番上に積まれているのが
現在のシーンってことになる。
立ち読みだから細かいことは忘れたw
スタック全体をなめるんだからスタックとは言わないと俺も思う。
290:277
07/04/10 01:59:26 9N2vtVIw
わかった。
かなり勘違いしていた・・・。
>>288
俺もそう思ってたww
291:名前は開発中のものです。
07/04/10 09:19:06 xnqcZNCE
これ読んで、久々にパックマン作りたくなったな~。
アクションゲームは、作ってないけど、デザインパターンを、正しく使うと、プログラムがスッキリするし、大好き。
デザインパターンって、しらない人多いのかな?
292:名前は開発中のものです。
07/04/10 09:47:11 9N2vtVIw
Large-Scale Stack-Based State Machines
James Boer
Game Programming Gems 5, 2005.
293:名前は開発中のものです。
07/04/11 01:26:38 hEaakUMM
>>291
> デザインパターンって、しらない人多いのかな?
んなわきゃない
294:名前は開発中のものです。
07/04/11 05:40:08 6fD2+qm/
スタックベースのシーン管理、結局、状態遷移をスタックベースに作ってしまったw
これで、
タイトル画面→(呼び出し)→ゲーム処理→(戻る)→タイトル画面
とか、
タイトル画面→(呼び出し)→リプレイのメニュー→(呼び出し)→ゲーム処理→(戻る)→
リプレイメニュー→(戻る)→タイトル画面
とかできるようになったw
スタックベースといったらやっぱりこっちだろw
295:名前は開発中のものです。
07/04/11 05:56:16 M15Cgj6f
スタック的に自然な状態遷移しかしないのであれば役に立つだろうけど、
そうではない大部分のゲームにとっては役立たず以外の何物でもないと思う。
296:名前は開発中のものです。
07/04/11 07:47:20 J6IpVt/X
スタックというデータ構造を状態遷移を表現するために利用するからには
・次のシーンに移る=push操作
・1つ前のシーンに戻る=pop操作
という対応関係が常に成り立っていて、この操作のみで完結すべきなんだが、
これだけの操作でOKなゲームがどれだけあるかっていうと、ぶっちゃけほとんどない。
スタックにこだわるあまり、データ構造を破壊したり
オブジェクトの役割を破壊したりするような例が後を絶たないのだが、
>>279と>>281のようなやり取りが行われている現状では仕方がないか。
297:名前は開発中のものです。
07/04/12 03:38:40 AG1SAh/k
実質が状態遷移ならstateパターンでいいやんって事ですか?
298:名前は開発中のものです。
07/04/12 04:43:05 0Ip1HTkJ
>>297
Stateパターンとか全く関係ないよ。
シーンの遷移をうまく表現するためのデータ構造に関する話。
どこまで理解しているかわからないから基礎から説明する。
Stackというデータ構造は、
・オブジェクトを1つStackに積むpush操作
・最後にStackに入れたオブジェクトを1つ取り出して捨てるpop操作
・最後にStackに入れたオブジェクトを参照するtop操作
を持つ。ここで、
・push操作=次のシーンに移る
・pop操作=1つ前のシーンに戻る
・top操作=現在のシーンを取得する
と対応付けると、これはシーン管理に使えそうだぞってことになる。
これが、今話題に上がっているStackベースのシーン管理。
これをStateパターンにしたところで、Stackの中に入るオブジェクトが
シーンオブジェクトから状態オブジェクトに変わるだけで、
シーン遷移のための操作やベースとなるデータ構造は変化しないってのはわかる?
299:名前は開発中のものです。
07/04/12 05:16:23 0Ip1HTkJ
(続き)
で、何故Stackベースのシーン管理に関して
>>295と>>296(俺)のような批判が出るかって言うと、
>>298で挙げた3つの操作だけでうまく管理できるような
状態遷移になっているゲームが少ないから。
例えば、Stackの状態が
タイトル <- メニュー <- ゲーム処理 <-
だとして、ゲームオーバーシーンに移りたいとする。そうするとpush操作で
タイトル <- メニュー <- ゲーム処理 <- ゲームオーバー <-
となるが、次にタイトルシーンに移りたくなったときに、
これに対応する操作がない。あくまで与えられている操作は、
次のシーンに移るか、1つ前のシーンに戻るかだけだから。
"ゲームオーバーシーンから戻るときだけは
topがタイトルシーンになるまでpopする"というような特例を
不都合が生じる度に設けると、Stackベースにした意味がなくなる。
これが>>296で言った『データ構造の破壊』に相当する。
"Chain of Responsibilityパターンを使ってシーンオブジェクト間で
データをリレーしていけば実現できるよ"って意見をどこかで
見たことがあるのだが、そもそもシーンオブジェクトには
状態遷移を正しく行う責任はないので、オブジェクトの動作的に不自然。
これが>>296で言った『オブジェクトの役割の破壊』に相当する。
ここまで神経使うかよって思うのが普通だとは思うけど、
せっかくのデータ構造スレなので色々グダグダと言ってみた。
よさげなデータ構造があれば是非ともそれを利用したいし。
300:名前は開発中のものです。
07/04/12 07:27:37 KA8mV/7R
Stackのシーン管理を、必要なところだけ使うようにすればいいんじゃないの。
セーブ画面とか、オプション画面とか。
301:名前は開発中のものです。
07/04/12 11:44:45 dOVFJA3U
>>185-
ちょっと参考になるよ
302:名前は開発中のものです。
07/04/12 18:19:58 sR+tFe8j
色々考えて、俺はスタック的な遷移も結構いいんじゃないかと思えてきた。
スタックだと、シーンの遷移の責任は全て親に任せることができる。
キャンペーンモードなのか、単独のマップを遊ぶだけのモードなのかは、自分は
知る必要もなく、遷移する理由(勝利、敗北、キャンセル…etc)だけを伝えれば
次にどのシーンになるかは親が決めてくれる。
各シーンが自分で次のシーンを選んでダイレクトに遷移していくよりは、
親に一任した方がすっきりするね。
スタックそのものでなくても、スタック的な遷移ができることは便利だと思う。
303:名前は開発中のものです。
07/04/12 20:03:01 +rjgMuLJ
うむ、完全にpush/popに収める必要はないよな。
304:名前は開発中のものです。
07/04/12 20:15:13 BUTEbHo0
素直に多方向リンクリストでやれよ。
305:名前は開発中のものです。
07/04/12 20:25:07 +rjgMuLJ
それは実装・データ構造の話じゃん。
306:名前は開発中のものです。
07/04/12 21:46:48 V5BuRGqQ
>>302
遷移する理由を伝えることによるシーン遷移ってのはいいね。
が、これは別にスタックに限った恩恵ではない
(っていうのは>>302もわかってると思うけど)。
>>304の言う多方向リストでも可能(っていうか本来はこっち)だし、
イテレータが指すシーンを現在のシーンとする双方向リストでも可能。
多方向リストで工夫して実装すれば、
リソースを食うシーンに移ったときに
前のシーンをいくつか解放するといった処理が行えるし、
シーンを激しく前後するような操作をしても
オーバーヘッドがかからないのでいいかも。
もっとも、ゲーム起動時にリソースを全部先読みしても
全く問題ないようなゲームだったら、
積みっぱなしのスタックで全く問題ないし、
これが一番簡単だと思うけど。
307:名前は開発中のものです。
07/04/12 22:34:50 Yo7l8Dzb
"多方向リンクリスト"に該当するページが見つかりませんでした。
308:名前は開発中のものです。
07/04/13 01:17:14 FDWvNnME
双方向リンクリストじゃない?
309:名前は開発中のものです。
07/04/13 01:37:40 maKmelpg
色んな方向につながってるってことは…
vectorじゃねぇの?
310:名前は開発中のものです。
07/04/13 02:13:59 ye+8qT/8
遷移元シーン番号と遷移事由コードで
テーブルから遷移先シーン番号(またはシーンオブジェクトの参照)を
引くだけというのはだめだろうか
311:名前は開発中のものです。
07/04/13 04:18:27 VGgK68eb
ヒント:C言語などの関数
312:名前は開発中のものです。
07/04/13 04:47:41 sVc4IdNT
>>311
エレガントじゃない気がする
313:名前は開発中のものです。
07/04/14 05:39:36 0P7qLuwH
状態の保存方法なんて画面にあわせて stack なり queue なり
vector なり list なり、適当に作ったツリー構造なりを使えばいいよ。
コンテナ実装するのも一苦労だったアセンブラやCで組む時代じゃないんだから、
全体でどれに統一するか悩む必要なんて無いでしょ。
314:名前は開発中のものです。
07/04/15 10:34:45 PbHNo8Qe
ログ
315:名前は開発中のものです。
07/04/15 14:31:59 GX7kX5Cm
参照カウント付きスマートベクトルポインタ使ってシーンの遅延生成や破壊を自動管理したり
夢が広がりまくりんぐ
316:名前は開発中のものです。
07/04/19 13:16:55 WPH1WRyj
シーン間の遷移(例えばクロスフェード)とかどうやってる?
317:名前は開発中のものです。
07/04/19 13:42:33 1tbYRD5H
俺はシーン別に切り分けてバッファを持っている。
318:名前は開発中のものです。
07/04/19 22:50:53 ofjIK8wt
自分は、Viewで処理してて、Modelでのシーン自体は完全に移行済みにしとく。
あくまで、表示(演出)は表示(演出)ときりわけやったほうがいいと思うし、
また、切り分けとくと変更も楽だし、テスト時とか演出要らん場合はさっさと飛ばせるし。
319:名前は開発中のものです。
07/04/20 18:21:55 NDgAfFd0
やべ。意味が分からん^^
ちょっと確認させて欲しい。
class IScene {
virtual void update(ISceneContext& ctx);
virtual void draw(ISceneContext& ctx);
};
class SceneStack {
void push(IScene *scene);
void pop();
void call(IScene *scene);
void update(ISceneContext& ctx) { /*登録されたシーンの更新*/ }
void draw(ISceneContext& ctx) { /*登録されたシーンの描画*/ }
};
自分の理解では、こんなのがシーン処理の実装なんだけど、
まずこの解釈はあってる?
当然、シーン変更時はscenestack.call(new_scene)とかやるわけね。
>>317
シーン別にバッファを持ってるってことは、
シーン遷移時の処理はSceneクラスで遷移を行うか、
他の遷移専用クラスがあるってことですか?
>>318
↑の例でいうと、ISceneまたはSceneStackのdraw内のみで
遷移処理を実行するということですか?
全然分かってないかもです。
理解が足りなくて申し訳ない。
320:316
07/04/20 18:22:39 NDgAfFd0
>>319も316です^^
321:名前は開発中のものです。
07/04/20 23:58:50 jHP7m8qh
やねうら臭がする
322:名前は開発中のものです。
07/04/21 04:53:19 upqCn/9t
>>319
俺もおおよそそんな感じ
323:名前は開発中のものです。
07/04/21 09:13:46 jPfR3hGz
沖縄県の方へ(命に関わる注意事項です)
沖縄県での選挙ですが、どうか民主党だけは避けてください。県民の生命に関わる可能性があります。
民主党の最大の公約は一国二制度(※)ですが、一度「一国二制度 沖縄 三千万」等で検索をお願いします。
この際、民主党のHPで調べても良いです。以下の注釈↓と矛盾することは書いてないはずですから…
※一国二制度
簡単に言えば沖縄を中国と日本の共有物にし、そこに3000万人の中国人を入植させます。
(つまり沖縄人口の 96% を中国人にして、実質、沖縄を中国人の居住地とします。)
さらに「自主」の名の下、沖縄で有事が起きても自衛隊は干渉できません。
3000万人の中国人が、少数派となった130万人の日本人に何をしても、です。
そして反日教育を受けた中国人の反日感情の強さは、ほとんどの日本人の理解を超えるものです。
今回の選挙で民主党が勝った場合、「自主」「発展」を連呼しつつ段階的に進めていくことになります。
自主と言っても、自主を認めるのが「住人の96%が中国人となった」後だということに気をつけてください。
発展と言っても、新沖縄の少数派となった「少数民族日本人」の発展ではないことに気をつけてください。
324:317
07/04/23 17:44:03 jyQ0IgwD
>>318とほぼ同じと思うけど
シーンに関してスタックは使ってないので、並列処理しているとき
それぞれのシーンが自分用の裏画面などを持ってないと都合が悪い
表示(演出)は別クラスにして任意シーンの裏画面を複数使って料理する
ぶっちゃけ、カメラを切り替えている感じ
325:名前は開発中のものです。
07/04/24 20:58:04 LmvfBEf6
>>324
なーる。表示用クラスが裏画面(テクスチャだよね?)
を複数使って演出してるわけね。
ありがとう^^
326:名前は開発中のものです。
07/04/30 13:33:52 rkXlhSNv
RPGでマップとかイベントはゲームスタート時に全部ファイルから読み込んでメモリに置いておくほうが普通でしょうか?
それともマップに入ったときにファイルからロードするほうがいいでしょうか?
327:名前は開発中のものです。
07/04/30 13:38:16 Omqviadr
普通なら、使いもしないデータを主記憶に展開しておくのは無駄としか思えないが・・・
328:名前は開発中のものです。
07/04/30 14:13:55 +32zYLn2
環境とか開発の容易性とかいろいろ考えた上で全部入れるのはべつにかまわん
重いのは画像や音声だったりするわけでそれがないので別に大丈夫かと
規模によっちゃそれすらもまるごといれてもかまわんけどな
1MBもあればFF4がまるごとはいるわけで
329:名前は開発中のものです。
07/04/30 14:36:40 rkXlhSNv
動的に読み込むってなかなか難しくて・・・
FF4で1MBなら自分の程度なら全部読み込んでも大丈夫かも。
330:名前は開発中のものです。
07/04/30 16:15:04 1Z2FVuUn
シームレスは少し難易度高いが、区画ごとに区切っていいなら難しくないんじゃ?
あっちこっちでグローバル変数使うような原人は知らん。
331:名前は開発中のものです。
07/04/30 17:45:14 QczQVIdr
最初は難しいことに手を出すよりも、楽なほうでやったほうがいいよ。
後からだんだん発展させていけばいいと思う。
ぐちゃぐちゃになったらリファクタリングで。