トップページgamedev
981コメント424KB

ゲームプログラミング相談室【Part6】

レス数が950を超えています。1000を超えると書き込みができなくなります。
0001名前は開発中のものです。04/03/06 01:25ID:d2e/eEyg
ゲームプログラミング全般の質問スレッド。
扱う話題のダイナミックレンジはやや広め。包容力高め。
他の初心者質問スレとの棲み分けを探りつつ
これからもマターリと活用しておくれ。
 
■過去スレ
【Part2】http://pc.2ch.net/tech/kako/985/985540361.html
【Part3】http://pc.2ch.net/tech/kako/1002/10028/1002894129.html
【Part4】http://game.2ch.net/gamedev/kako/1005/10050/1005040025.html
【Part5】http://pc2.2ch.net/test/read.cgi/gamedev/1036410116/
■関連スレなど
>>2-5
0881名前は開発中のものです。2006/03/01(水) 02:16:32ID:MsffCk59
>>875
関数ポインタを使ってしたいことは、処理の共通化でもあるんだけど、
タスクの場合は主に長い処理を1フレーム分に分割することにある。
マイクロスレッドなりスレッドなりを使わないと、どうしてもぶつ切りにせざるを得ないので。
もちろん、templateメソッドみたいに呼び出すメソッドがあらかじめ分かっていれば、
継承元側に仮想関数を追加しておくことはできるよ。
ただタスクシステムの場合、それはほとんど不可能。

>>877
Stateを使うってことは、状態一つに対してクラスを一つ作るってことなのかな?
例えば、>>873にあげた1)2)3)でそれぞれに対してクラスを作るの?
これの代替機能としてはswitchやマイクロスレッドがあげられると思うんだけど、
何でステートパターンにこだわるんだか、俺には分からない。
これだと粒度大きすぎると思うんだけど。
(細切れの関数に対していちいちクラスを作らないといけないってことね)

>>878
> そんなに必死に正当化しなくても、非標準なんだから使わないようにすれば済む話。
> 「共通拡張」なんて胡散臭い言葉を持ち出すのは混乱の元。
一緒に示したソース見た?
その中に「共通の拡張」って表現があるから、それを借りただけなんだけど・・・
この辺は>>868や俺のように間違えてる人が多いから、一応確認しただけ。
これは本題ではないので、こちらからはこれ以上レスしないよ。

あと、>>880に示したプログラムではテンプレートを使ってないので、
@に何を書いてもAでキャストすることになる。
使わない方法があれば、俺も知りたい。
0882名前は開発中のものです。2006/03/01(水) 02:36:11ID:MsffCk59
>>881
× @に何を書いてもAでキャストすることになる。
○ @に何を書いてもset_taskの呼び出し時にキャストすることになる。
0883名前は開発中のものです。2006/03/01(水) 03:14:04ID:IPZ1L++y
>>880,881
キャストが要るようになったらプログラムが間違ってるのを疑えよ。
なんで仮想関数で得られる型安全を自ら壊すような「タスクシステム」に
こだわるんだ?そんなシステム要らない。

↓これでいいんじゃないの。

class State {
public:
 virtual void update() = 0;
};

class State1 : public State {
public:
 State1() : m_update_task(&State1::begin_task) {}
 void update() { (this->*m_update_task)(); }
private:
 void (State1::*m_update_task)();
 void begin_task() { m_update_task = &State1::task1; }
 void task1() {}
};
0884名前は開発中のものです。2006/03/01(水) 04:00:38ID:MsffCk59
>>883
ようやく伝わったようだ。イメージとしてはそんな感じ。
で、テンプレートを使えば m_update_task 周りの処理をすべて
継承元の xxx<Task1> に投げられますよというだけの話。
例でtemplateを使って無いのは、>>882に説明するため。
0885名前は開発中のものです。2006/03/01(水) 04:08:48ID:DYhzXIPk
一体何を話しあっているのか分からない俺ガイル

State1() : m_update_task(&State1::begin_task) {}
void (State1::*m_update_task)();
void begin_task() { m_update_task = &State1::task1; }

この辺りの記述ははじめた見た
詳細きぼん
0886名前は開発中のものです。2006/03/01(水) 04:18:04ID:DYhzXIPk
あーすまん分かった
コンストラクタとメンバ関数ポインタか
コンストラクタでbegin_taskを関数ポインタに代入して
それが呼び出されれば関数ポインタにtask1を代入するわけか
またひとつ賢くなった
0887名前は開発中のものです。2006/03/01(水) 04:25:23ID:MsffCk59
>>884
また分かりにくいかもね。
>>883の例でいくと、
class State1 : State<State1> { ... };
とすれば、m_update_task 周りの処理を
継承元であるState<>で行うことができますよという話。
0888名前は開発中のものです。2006/03/01(水) 06:34:35ID:FsQhIhlt
根本的に勘違いしてると思うんだよねぇ。
つーかさ、switchでつくりゃいいじゃん。ポインタにしてもいいことないよw
最適化かからなくなるし。

switch( TaskType )
{
case TaskType1: funcType1(); break;
case TaskType2: funcType2(); break;
case TaskType3: funcType3(); break;
 default: assert( false /*TaskTypeError*/ );
}


ああ、安全安全。
0889名前は開発中のものです。2006/03/01(水) 07:51:41ID:LeN+sImJ
タスクの良い点は状態遷移が単純なときに状態変数みたいなものをつくらずに
関数に分けて、特定の状態のときに行う処理がかけることかな。
状態遷移が複雑だったり外部の環境の変化によって遷移の仕方が大きく変わるようなら
Fiberつかったほーがいいけど、適材適所ということで。

キャストとかtypedefとか必要ない俺のつくったタスクシステムのきれっぱしを参考にしてくれ
正直つくったはいいがザコキャラがでてきてうろうろしたり弾幕があったりするようなゲームを
つくらなかったので使いどころがなかった。

// タスクの管理者はlist<TaskManagable*>をメンバに持ち、Run()を順番に呼んでいくのだ
class TaskManagable {
public:
 virtual void Run() = 0;
};

//タスクになりたいクラスは class MyEntityTickTask : public Task<MyEntityTickTask>
// … とやってMain()を実装する。ChangeTask( hoge ) で自分のメンバ関数 void hoge() へ状態遷移できるよ
//管理者に登録するのはこのMyEntityTickTaskクラスをnewするやつの仕事だ。当然だね(^ー^b
template <typename T> class Task : public TaskManagable {
public:
 Task() { ChangeTask(Main); };
 void Run() { (((T*)this)->*m_doit)(); }
protected:
 virtual void Main() = 0;
 void ChangeTask(void (T::*fp)()) { m_doit = fp; }
 void (T::*m_doit)();
};
0890名前は開発中のものです。2006/03/01(水) 09:15:15ID:IPZ1L++y
>>889
> キャストとかtypedefとか必要ない俺のつくったタスクシステムのきれっぱしを参考にしてくれ
> void Run() { (((T*)this)->*m_doit)(); }

キャスト入ってるよ。まぁ型安全は使い方で確保されてると言えるけど。
あんた、たぶん VC 使いだな。メンバ関数ポインタの &ClassName:: は
規格では省略できないことになってるから、気をつけてな。

>>884,887
たぶん 889 と似たような形のことだろうな。

これまでに挙がったコードだと template も継承も持ち出さずに
自分でメンバ関数ポインタを宣言(>>883)すれば十分に見えるんだけど、
「 m_update_task 周りの処理」ってのは代入と呼び出し以外に何か有るの?
State の実装がメンバ関数ポインタによる処理に切り替えを必要とするとも
限らないし、これをわざわざ「システム」として組み込んでしまうのは
template や継承(特に自己言及的 template など)おぼえたてで
使いたいだけに見えなくも無い。ほんとでそんな構成に利点があるんだろうか?
0891名前は開発中のものです。2006/03/01(水) 09:45:30ID:SKz1zCk0
Cマガのやつじゃだめなの?
0892名前は開発中のものです。2006/03/01(水) 11:08:16ID:LeN+sImJ
>>890
ほとんど似たようなコードを置きながらちっともリスペクトしなかったのは俺の不注意だが
そこまで嫌味をいわんでもええやん
0893名前は開発中のものです。2006/03/01(水) 19:11:17ID:FsQhIhlt
C#あたりでポインタのない世界を勉強するほうがいいかも。
C++がこんな言語なのはCとの互換性を保っているからだしね。

なんつーか、WindowsのDOS窓でプロテクトモードじゃないと動かないような
プログラムをいまさら作ってるくらい違和感がありますよ関数ポインタ。
0894名前は開発中のものです。2006/03/01(水) 19:11:48ID:FsQhIhlt
勉強として使ってみるのは十分ありだと思う。
0895名前は開発中のものです。2006/03/01(水) 21:06:02ID:IEMguq9O
>>888
あたし、一生あなたについていきます(*・_・)
0896名前は開発中のものです。2006/03/01(水) 21:06:39ID:CUoSF3s4
少なくともC++において設計の時点でキャスト前提に話してるのって絶対おかしいだろ
0897名前は開発中のものです。2006/03/01(水) 21:44:02ID:MsffCk59
>>890
分かってるとは思うけど>>880はサンプルだし、
実際に使うとなると他にもいろいろと書き加えないといけない。
そうなったときに、継承先クラスの実装とタスクシステムが
分離されてることはいいことだと思うけど。

>>893
もちろん実装として、メンバ関数ポインタの代わりに
boost.functionやらそのたぐいを使うことは十分に考えられる。
そういったことはすでに提案されている。
0898名前は開発中のものです。2006/03/01(水) 23:16:45ID:1kpkO4CI
俺も昔はC++で関数ポインタ使うタスクシステムってのを作ってたけど、
今はtemplateとstateパターンだなぁ
0899名前は開発中のものです。2006/03/01(水) 23:24:58ID:DYhzXIPk
グローバルに宣言した変数ならextern使えば他ファイルのクラス内からでもアクセスできるんだな
ファイル分割の辺りを飛ばしてたから初めて知った
グローバル変数をクラスにポインタ使って渡してた自分が馬鹿みたいだ・・
0900名前は開発中のものです。2006/03/01(水) 23:32:08ID:FsQhIhlt
その変数をローカルにするんだ。
0901名前は開発中のものです。2006/03/01(水) 23:32:30ID:hlrpUZzF
>>899
いきなりC知らない人間がC++やると碌なことが無い
0902名前は開発中のものです。2006/03/01(水) 23:38:46ID:qSXqEEUp
>>899のやってる事の中でC++独自の機能を目を皿のようにして探す漏れ。
っていうかぁ、


 ○ ○ ○ シ ス テ ム 云 々 っ て 馬 鹿 ぁ?


達成すべき処理に対して最適なアルゴリズムで組んでいけば、
それが最強のシステム。「よし○○○導入するぞ?」ってのは、
自分でまともなアルゴリズム組めない思考停止。PG才能無し。
0903名前は開発中のものです。2006/03/01(水) 23:46:27ID:CUoSF3s4
>>902
これは ひどい
0904名前は開発中のものです。2006/03/02(木) 00:14:44ID:DSQKJe+A
自分は間違えを犯さないという絶対的な自信があるならそれでもいいと思うけど
そこまで自身がないなら既に完成しているシステムを組み込む安全な方法のほうがいい
0905名前は開発中のものです。2006/03/02(木) 06:45:23ID:kEb75Hs9
>>902
自分以外の同業者が何か敵か見下す対象なのであれば
同一のパーソナリティが出す見解としてはあってる。
0906名前は開発中のものです。2006/03/02(木) 11:14:39ID:An/IP3MA
だいたい設計なんて自分でいくら考えたところで
がいしゅつか糞かのどっちかだろ。よっぽど今までに無い
特殊な課題が出てきたってなら話は別だけどな
0907名前は開発中のものです。2006/03/02(木) 11:59:46ID:0lN5e5iu
彼は天才なんだよ。最適なアルゴリズムや設計が
常に湧いてくるなんて尊敬しちゃいます(><)
0908名前は開発中のものです。2006/03/02(木) 13:48:40ID:xnVjPOfM
ogreって日本語使えますか・・・?使う前に聞きたいんですビットマップテクスチャなのかさえ
0909名前は開発中のものです。2006/03/02(木) 19:06:30ID:TkjXSKpG
その前に、君が日本語を使えるのか確認したほうが良さそうだが・・・
0910名前は開発中のものです。2006/03/02(木) 19:33:56ID:7Bu1OvIg
>>904
そのとおりなんだが、上で出てるタスクシステムとやらは超絶に危険だろ?w
ツリー構造のタスクシステムをC++で作ったときはリンクリストにしてポインタ使ったけど
アップキャストだけにしてスマートポインタで管理して、タスクを利用する人からは極力
隠蔽するようにしたもんだけどなぁ。
0911名前は開発中のものです。2006/03/02(木) 19:38:50ID:An/IP3MA
糞システム導入して痛い目に遭って>902のような結論に辿り着くとか愚かすぎ
0912名前は開発中のものです。2006/03/02(木) 20:22:45ID:FRBQKYqS
結局は”最終的に評価されるゲームを作った”奴が勝ちなんだよ。
100行以上に及ぶ関数やグローバル変数や状態変数の乱立。
内部でスパゲッティーコード組もうがハードコーディングしようが、
最終的に俗世間に評価されればそれが勝ちなんだよ。
一般大衆はコーディング云々なんて気にしない。
面白ければそれでいい。
オナニーはエロ動画だけで十分って事だよ。

まぁ、いいもん作ろうぜ。
0913名前は開発中のものです。2006/03/02(木) 20:38:34ID:An/IP3MA
ゲ製クオリティ
0914名前は開発中のものです。2006/03/02(木) 20:40:18ID:e+7b9NqL
オマエのそのクソ設計やクソコード、何十年使う気でいるんだよw
っていつも思う。
0915名前は開発中のものです。2006/03/02(木) 20:41:22ID:EQr6DVKB
面白さなんて飾りです。一般大衆にはそれが分からないのです。

勝ち負けなんて気にせず、
自己満足のための美しい設計に心血を注ぐ者がいても良いじゃない。
0916名前は開発中のものです。2006/03/02(木) 20:43:53ID:ODhfrfjk
C丼でデリゲート使うことにしますぅ
0917名前は開発中のものです。2006/03/02(木) 21:18:05ID:FRBQKYqS
設計でオナニーしたい奴はすればいいじゃん、止める義理はないからな。
でもオレは要求された仕事を期日以内にキチンとこなして女と遊びに行くほうがずっといいからな。
お外で遊びな? まじ楽しいぞ?
0918名前は開発中のものです。2006/03/02(木) 21:30:25ID:mDiMfB+6
>>917
俺にはWindowsXPたんがいるからいいもんね・・・
もうすぐもう一人増えるんだもんね・・・
0919名前は開発中のものです。2006/03/02(木) 21:50:15ID:An/IP3MA
この会社辞めようと思ったソースコード#13
http://pc8.2ch.net/test/read.cgi/prog/1139744052/l50
0920名前は開発中のものです。2006/03/02(木) 22:26:24ID:7PybzmE4
>>914
むしろ糞コードでも良いからそれが何十年も使える世界になって欲しい
0921名前は開発中のものです。2006/03/03(金) 10:12:47ID:RMA/DLWO
>>909
え、いやほんとに教えてください・・・・サンプルでは英字しか無理でしたけど・・・
Irrlichtはやろうとしたけど・・・・でしたので
0922名前は開発中のものです。2006/03/03(金) 17:43:23ID:Es3EQncu
基本的な2Dアクションゲームを話題になったタスクで組みたいんだけど
自キャラ、敵キャラはいいとして重力計算とか当たり判定はどこで行うの?
0923名前は開発中のものです。2006/03/03(金) 17:48:31ID:mnIw+zDn
次スレ
0924名前は開発中のものです。2006/03/03(金) 18:07:00ID:b9kujG94
犯罪とかのニュースのたびに怒りでどうしようもない
http://life7.2ch.net/test/read.cgi/jinsei/1140716130/l50
ここで偽善者がオナニー暴れしてます
0925名前は開発中のものです。2006/03/03(金) 20:40:36ID:K58rYxW9
>>922
自キャラさんとか敵キャラさんとかが入ってるリストの中に
重力計算さんとか当たり判定さんとか本来実体のないものを
わざわざ実体のあるように見せかけていっしょにつっこむべきだと思う?
まぁ最初なんだからすきにしたらいい間違ってるのがわかったらその時なおせばいいよ
0926名前は開発中のものです。2006/03/03(金) 21:45:17ID:0OTmGa8a
>いっしょにつっこむべきだと思う?

思う。
0927名前は開発中のものです。2006/03/03(金) 22:42:51ID:o73IJu/M
関数をリストにつっこんでおけば放置しておいても1ループに一度は必ず実行される
ってのが基本的なタスクシステムのキモの一つなわけで
実体の有無(画面に表示されるかどうかって意味だよな?)はあまり関係ないんだな。

ただ、当たり判定や重力計算を独自のタスクで組むと、それを適用したいキャラを
リストからいちいち探さなくちゃいけないしあまり効率がいいとは言えない。
関数の内容によってリストを別けるとか解決策はいくらでもあるが
そこまでして使うものか?とも思う。
0928名前は開発中のものです。2006/03/03(金) 23:00:14ID:Es3EQncu
>>925
欲張りだから最初から失敗が嫌
とか言っても一発で成功したこと一度もない・・・
コンパイルの度に”必ず”ひとつはエラー出す
タスクとしてリストにぶっ込みたいんだけど色々問題があって

>>927
「リストからいちいち探さなくちゃいけない」
この辺でずっと悩んでた
タスクリストの一番最初に入れるのはもちろん無理だし
一番最後に入れるとタスクリスト内のデータをまた最初から検索しなおさなくちゃならないから単純に処理2倍だし
各タスクの行動関数に組み込むと再利用性がうんこ
0929名前は開発中のものです。2006/03/03(金) 23:07:35ID:LreP13W+
タスクリストに入れて問題があるんだったら入れなきゃいいだろ。
なんでタスクリストに入れたいの?

「タスク」とか「タスクリスト」の意味が曖昧なまま話しても無駄っぽいから
もっと実のある話にしたければ次スレ立てて
「タスクで組む」の意味を具体的にしてから話すことだね。
0930名前は開発中のものです。2006/03/03(金) 23:09:42ID:fF4cU66H
タスクじゃなくてオブジェクトとして素直に考え方が楽そうだな…
重力計算クラスはどんな機能が必要で
外からはどんなインターフェースが必要なのか。
0931名前は開発中のものです。2006/03/03(金) 23:11:40ID:o73IJu/M
>>928
実行順優先度とか設けてないの?
入れるなら最初か最後でしょ。
優先度ごとにリストを設けておけば総なめしなくても済むし
一本のリストで全てをまかなおうと考えない方がいいよ。
0932名前は開発中のものです。2006/03/03(金) 23:13:51ID:YtzA4e+Q
>それを適用したいキャラをリストからいちいち探さなくちゃいけない
適応したい処理の対象のリストを、フレーム毎に作成すればいいんじゃね?
検索の約一兆倍スマートでクールだと思うよ??(当社調べ)
0933名前は開発中のものです。2006/03/04(土) 11:27:18ID:N+C0gx8b
ttp://ntd.way-nifty.com/blog/20040516.gif
0934名前は開発中のものです。2006/03/04(土) 14:05:42ID:ja9F3fLO
流れが読めないならROMってればいいと思うよ。
0935名前は開発中のものです。2006/03/05(日) 02:39:49ID:UHXFHf4y
何度みても笑える。
0936名前は開発中のものです。2006/03/05(日) 05:38:38ID:YPNEIoPd
笑いどころがどこかわからん。
プログラマのとこか?
0937名前は開発中のものです。2006/03/05(日) 12:16:19ID:n3bvOOgL
2Dの当たり判定についでなんですが、
1pixelずつの移動であれば移動する場所の座標で当たり判定をして
ヒットしていれば移動しない、ヒットしていなければ1pixel進むでいいですよね。
けど、通常の3倍で進むような場合は3pixel進んだ場所の座標で当たり判定をして
ヒットしていれば移動しない、ヒットしていなければ3pixel進むではよろしくないです。
3pixelは進めなくても2pixelは進める可能性があるからですが、
こういう通常の3倍で進む場合は1pixel進む処理をx3してやるのが普通なんでしょうか?
それともほかに良い方法がありますか?
0938名前は開発中のものです。2006/03/05(日) 12:58:26ID:5Th9ilrN
>>937
真っ当に考えれば、n pixel進むためには、
n 回ループで 1 pixel ずつ判定するしか方法はないと思われる。

状況によっては、先に n pixel進めてみて
移動不可だったら (n-1) pixelを試すという逆順のほうが効率がいいかも試練が。
0939名前は開発中のものです。2006/03/05(日) 12:58:30ID:ZGr9k1wh
当たっていたら
何ピクセル埋まったかを計算してその分戻せば?
0940名前は開発中のものです。2006/03/05(日) 14:07:05ID:cQK4mU/u
跳ね返る時はかなりいい加減でもごまかせるけど
ぴったり止まるなら>939が丁寧な方法で>938が簡易だな。
0941名前は開発中のものです。2006/03/05(日) 18:42:16ID:n3bvOOgL
>>938-940 どうもです。
       >>939 まさにそれですね。
       ジャンプして天井にぶつかったり
       落下して地面に着地した時、
       キャラクターの移動速度を上げたときに
       挙動が変だったのがこれで直りそうです。thx。
0942名前は開発中のものです。2006/03/05(日) 20:55:44ID:UHXFHf4y
>>936
いや全部。 仕事でプログラマとか実務側の方をやってると
全部がだいたいそのとおりなので笑える。

笑えないのは現在進行形の場合だな。
0943名前は開発中のものです。2006/03/05(日) 23:50:36ID:VVgrQx5R
うむ
0944名前は開発中のものです。2006/03/07(火) 13:47:15ID:/9MR8SBK
文字をゆっくり表示させようと思ってるんですが、SetTimer()で時間をとってくる方法しか思いつきません。他に方法はないのですか?
0945名前は開発中のものです。2006/03/07(火) 13:54:24ID:ZvqJ1rtZ
なぜ他の方法を探そうと思ったのか、現状の方法でどのような問題があるのかを説明する方が先だろう。
0946名前は開発中のものです。2006/03/07(火) 14:05:02ID:gwpzJjwD
timeGetTime
0947名前は開発中のものです。2006/03/07(火) 17:59:12ID:FUu2poXA
本屋寄ったらエフェクト関連の本が二冊あった
けど買えなかったorz
0948名前は開発中のものです。2006/03/07(火) 20:37:37ID:BkDgmlhw
マップ読み込みがわかんね・・・
縦,横,チップサイズ \n
番号,番号,番号,番号,番号 \n
番号,番号,番号……
とかなってるマップの読み込みをスマートにできないかな
暗号化とかもまた意味不明
0949名前は開発中のものです。2006/03/07(火) 21:07:51ID:/Dd4UB8z
スマート?
とってもスマートなのだが。

暗号化?
ぐぐれよ
0950里奈 ◆IQwhCnTrnE 2006/03/07(火) 21:37:19ID:u/hyaZuL
>>948
それは私のよりスマートそう。
私のもっといい加減だもん。
0951名前は開発中のものです。2006/03/07(火) 21:40:39ID:FUu2poXA
俺のよりスマート。
0952名前は開発中のものです。2006/03/07(火) 21:58:02ID:BkDgmlhw
いやfgetcとかforとfscanfを組み合わせてるんだけどどうしても分岐が出てくるしこれは見てて嫌だなって
0953名前は開発中のものです。2006/03/07(火) 22:01:07ID:P11agiDo
バイナリにしちゃえば?
0954名前は開発中のものです。2006/03/07(火) 22:14:57ID:FUu2poXA
それだ
で次スレ
0955名前は開発中のものです。2006/03/07(火) 22:58:17ID:BkDgmlhw
>>953
早速やってみた
変換ツール作りの段階でコンパイラにコンパイルエラー連射されると困る
0956名前は開発中のものです。2006/03/08(水) 01:38:07ID:FOxUDukT
テキストファイルをバイナリに変換するのと
バイナリをテキストに変換するのを作るのに2時間かかった
マップ以前に今後について考える必要があるかも
0957名前は開発中のものです。2006/03/08(水) 09:37:07ID:cf7g5b6+
そういうツールをちゃちゃっと作るならスクリプト言語が楽でいいぞ。
例えばperlで>>948のCSVをバイナリ化するならこう書ける。

open(IN, 'map.txt');
while (<IN>) {
 chomp($_);
 my @linedata = split(/,/, $_);
 foreach my $data (@linedata) {
  $out .= pack("s", int($data));
 }
}
close(IN);
open(OUT, '>map.dat');
binmode OUT;
print OUT $out;
close(OUT);
0958名前は開発中のものです。2006/03/08(水) 10:00:00ID:FOxUDukT
>>957
短いなぁ
ちょっとそっち関連の勉強でもしてみる
0959名前は開発中のものです。2006/03/08(水) 22:10:22ID:/wiAUAS3
そして、とうとう彼はスクリプト世界から帰ってきませんでした。
0960名前は開発中のものです。2006/03/10(金) 23:11:01ID:eoGMdw8P
ttp://dream.my-sv.net/upload/src/up0144.zip
タスク構築していろいろやってみたんだけど、デバッグ中にタスク削除辺りでエラーが出る
WinMain.cpp - エントリ。タスクやキャラクラスの宣言
CTask.cpp - タスクシステム
CChar.cpp - キャラクラス。タスククラスを継承。全キャラクタの継承元クラス。
CUser.cpp - 自キャラ管理。爆発クラスの呼び出し。 キャラクラス派生
CExplosion.cpp - 爆発クラス。一定時間経過で開放。
CRenderer.cpp - DirectX
ChipPoint.h - テクスチャ座標配列

クラスCUserがカーソルキーによる移動時に一定間隔でCExplosionをnewしてタスクリストに追加、
CExplosionが一定フレーム爆発し続ければメンバ関数Proc内で
CTask::TaskKill(TASK* t)にthisポインタ渡して開放待ち状態に移行
TaskKill内では渡されたタスクのタスク用デストラクタを実行してそのタスクのStatusメンバにステータス列挙体のSTATUS_KILLを詰め込む
その後にCTask::TaskExecution()を実行してTASK_KILLのタスクをCTask::TaskDelete(TASK* t)に渡して開放したいんだけど、
そのTaskExecution()内のswitch文でTASK::Statusを参照するとエラーが出る

長々長々とスマソ。ソースは「とりあえずやってみっか」的でかなり雑
0961名前は開発中のものです。2006/03/10(金) 23:25:25ID:0u3ISKgK
>960
で、何だ?
「暇人の皆さん、このとりあえずやってみっか的ソースをデバッグしやがれ。」
って事か?
0962名前は開発中のものです。2006/03/10(金) 23:51:07ID:6klj+UjH
>>960
ソースを上げるスレッド
ttp://pc8.2ch.net/test/read.cgi/gamedev/1005038280/
0963名前は開発中のものです。2006/03/11(土) 00:34:44ID:fYcMiC+y
>>960
(1)(2)(3)の順に読んでね、お兄ちゃん。

for(TASK* i=Top->Next; i!=End; i=i->Next)  ← (2) 次のi->Nextは開放後の不定値になり
{
(中略)
  switch(i->Status)   ← (3) そして、どかーん☆
  {
    case STATUS_KILL:
      TaskDelete(i);    ←(1) ここでiの実体を開放した場合、
      break;
  };
}
09649602006/03/11(土) 00:49:40ID:ojp9Bp1N
>>961-962
すまんかった。

>>963
おお、なるほど
オブジェクト側で何かやらかしてるのかと思ってたから
タスク実行ループは疑いもしなかった
実行できました。ありがとうございます
0965名前は開発中のものです。2006/03/11(土) 01:09:54ID:xs4HFJgg
いいなあ、ロリロリの妹に手取り足取り教えてもらえて
0966名前は開発中のものです。2006/03/11(土) 03:07:50ID:CNVjlctO
ソースレビューはする方もされる方も勉強になるかと。
0967名前は開発中のものです。2006/03/11(土) 04:58:54ID:HaVUH+Mi
なんでもかんでもタスクタスクって、あなた達はVOWのファンなのですか?
0968名前は開発中のものです。2006/03/11(土) 05:18:19ID:HaVUH+Mi
ゲームのデータ(マップやキャラクタのデータなど)の構造変更時に旧ファイルとの互換性を楽にもたせられる方法はありませんか?

例えば
class map_data
{
public:
BYTE chip_x,chip_y;//チップのインデックス
};
というクラスがあり、これをそのままサイズ分ファイルに書き込みます。
このクラスはマップファイル用に使われるので実際はマップの編集作業に大変時間を取られます。

しかし、このクラスに何かの変数を追加する必要が生じまして
class map_data
{
public:
BYTE chip_x,chip_y;//チップのインデックス
char flag[4];//
};
こうなったとすると、クラスのサイズの違いから読み込み位置にズレが生じてしまい、
前回頑張って作ったマップのデータが意味の無いものになってしまいます。
これを回避するために上手い方法は無いでしょうか。
今はファイル読み込み関数を旧式、書き込み関数だけを新しいものにして、
一旦新形式でセーブしてから読み込み関数を新形式にする方法と、
あらかじめchar reserved[1000]という余分なスペースを確保し、
追加分の変数のサイズだけ引いていくという方法でやっていますが面倒です。
0969名前は開発中のものです。2006/03/11(土) 08:29:22ID:r0/M++6p
バージョンでも持てばいいじゃん
0970名前は開発中のものです。2006/03/11(土) 08:37:41ID:/5hGWtyv
答えてやった奴にはお礼にエロ画像でも見せてやれよ
0971名前は開発中のものです。2006/03/11(土) 09:11:12ID:czh0rJIG
>>968 まずは次スレを建てるといいよ。
0972名前は開発中のものです。2006/03/11(土) 13:21:52ID:3b41TJWI
次スレ
http://live19.2ch.net/test/read.cgi/ogame/1142050870/
0973名前は開発中のものです。2006/03/11(土) 14:29:54ID:OQA38ARh
オフセットじゃなくて名前でそれぞれのパラメタを取れるようにしたらどーなのよ?
プロパティシート?プロパティテーブル?プロパティセット?そんな感じのやつ。
それができないようなデータならreservedを設けるしかないな!
0974名前は開発中のものです。2006/03/11(土) 15:30:10ID:CNVjlctO
チャンク使って、データ単位で分類わけするべし。
いま時だとXMLとかでもいいかもしれず。
0975名前は開発中のものです。2006/03/12(日) 02:10:41ID:v/iGtfpN
次スレ:http://pc8.2ch.net/test/read.cgi/gamedev/1142096974/
0976名前は開発中のものです。2006/03/12(日) 10:32:49ID:9Xx2pFM6
おつ〜♪
0977名前は開発中のものです。2006/03/12(日) 10:37:21ID:bZfGY06E
じゃぁ、埋めです。

MMOFPSで常時一万オーバー接続で快適に稼動させるには、
どのあたりから手をつけr
0978名前は開発中のものです。2006/03/12(日) 10:53:06ID:FjM9fEPE
まずはIPv6が標準プロトコルになるまで待つ。
0979名前は開発中のものです。2006/03/12(日) 11:07:49ID:bZfGY06E
迅速なレスありがとうございます。

>まずはIPv6が標準プロトコルになるまで待つ。
では、その日を夢見てゲ製をサボリ、マターリ惰眠を貪ろうかと思います。
本当にありがとうございました。
0980名前は開発中のものです。2006/03/12(日) 13:28:50ID:zIFbhKP6
>>978
IPv6になれば速度上がるの?
レス数が950を超えています。1000を超えると書き込みができなくなります。