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

926名前は開発中のものです。:2006/03/03(金) 21:45:17 ID:0OTmGa8a
>いっしょにつっこむべきだと思う?

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

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

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

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

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

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

暗号化?
ぐぐれよ
950里奈 ◆IQwhCnTrnE :2006/03/07(火) 21:37:19 ID:u/hyaZuL
>>948
それは私のよりスマートそう。
私のもっといい加減だもん。
951名前は開発中のものです。:2006/03/07(火) 21:40:39 ID:FUu2poXA
俺のよりスマート。
952名前は開発中のものです。:2006/03/07(火) 21:58:02 ID:BkDgmlhw
いやfgetcとかforとfscanfを組み合わせてるんだけどどうしても分岐が出てくるしこれは見てて嫌だなって
953名前は開発中のものです。:2006/03/07(火) 22:01:07 ID:P11agiDo
バイナリにしちゃえば?
954名前は開発中のものです。:2006/03/07(火) 22:14:57 ID:FUu2poXA
それだ
で次スレ
955名前は開発中のものです。:2006/03/07(火) 22:58:17 ID:BkDgmlhw
>>953
早速やってみた
変換ツール作りの段階でコンパイラにコンパイルエラー連射されると困る
956名前は開発中のものです。:2006/03/08(水) 01:38:07 ID:FOxUDukT
テキストファイルをバイナリに変換するのと
バイナリをテキストに変換するのを作るのに2時間かかった
マップ以前に今後について考える必要があるかも
957名前は開発中のものです。:2006/03/08(水) 09:37:07 ID: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);
958名前は開発中のものです。:2006/03/08(水) 10:00:00 ID:FOxUDukT
>>957
短いなぁ
ちょっとそっち関連の勉強でもしてみる
959名前は開発中のものです。:2006/03/08(水) 22:10:22 ID:/wiAUAS3
そして、とうとう彼はスクリプト世界から帰ってきませんでした。
960名前は開発中のものです。:2006/03/10(金) 23:11:01 ID: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を参照するとエラーが出る

長々長々とスマソ。ソースは「とりあえずやってみっか」的でかなり雑
961名前は開発中のものです。:2006/03/10(金) 23:25:25 ID:0u3ISKgK
>960
で、何だ?
「暇人の皆さん、このとりあえずやってみっか的ソースをデバッグしやがれ。」
って事か?
962名前は開発中のものです。:2006/03/10(金) 23:51:07 ID:6klj+UjH
963名前は開発中のものです。:2006/03/11(土) 00:34:44 ID: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;
  };
}
964960:2006/03/11(土) 00:49:40 ID:ojp9Bp1N
>>961-962
すまんかった。

>>963
おお、なるほど
オブジェクト側で何かやらかしてるのかと思ってたから
タスク実行ループは疑いもしなかった
実行できました。ありがとうございます
965名前は開発中のものです。:2006/03/11(土) 01:09:54 ID:xs4HFJgg
いいなあ、ロリロリの妹に手取り足取り教えてもらえて
966名前は開発中のものです。:2006/03/11(土) 03:07:50 ID:CNVjlctO
ソースレビューはする方もされる方も勉強になるかと。
967名前は開発中のものです。:2006/03/11(土) 04:58:54 ID:HaVUH+Mi
なんでもかんでもタスクタスクって、あなた達はVOWのファンなのですか?
968名前は開発中のものです。:2006/03/11(土) 05:18:19 ID: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]という余分なスペースを確保し、
追加分の変数のサイズだけ引いていくという方法でやっていますが面倒です。
969名前は開発中のものです。:2006/03/11(土) 08:29:22 ID:r0/M++6p
バージョンでも持てばいいじゃん
970名前は開発中のものです。:2006/03/11(土) 08:37:41 ID:/5hGWtyv
答えてやった奴にはお礼にエロ画像でも見せてやれよ
971名前は開発中のものです。:2006/03/11(土) 09:11:12 ID:czh0rJIG
>>968 まずは次スレを建てるといいよ。
972名前は開発中のものです。:2006/03/11(土) 13:21:52 ID:3b41TJWI
973名前は開発中のものです。:2006/03/11(土) 14:29:54 ID:OQA38ARh
オフセットじゃなくて名前でそれぞれのパラメタを取れるようにしたらどーなのよ?
プロパティシート?プロパティテーブル?プロパティセット?そんな感じのやつ。
それができないようなデータならreservedを設けるしかないな!
974名前は開発中のものです。:2006/03/11(土) 15:30:10 ID:CNVjlctO
チャンク使って、データ単位で分類わけするべし。
いま時だとXMLとかでもいいかもしれず。
975名前は開発中のものです。