ゲームにおける擬似マルチタスクシステムについて


2310  2004-02-08 14:53:49  No: 7002  IP: 192.*.*.*

現在ゲーム製作のための擬似(マルチ)タスクシステム(クラス)を作っています。

そこで質問なのですが、

1.キャラクタを動かす場合、基本的に

    各キャラクタのタスクを生成→キャラクタ移動タスク(座標の移動)→
      →当たり判定タスク→描画タスク

    という流れになると思うのですが、
    当たり判定タスク・描画タスクで、
    各キャラクタの座標をどのように取得すればよいか悩んでいます。

    座標は各タスクのワークエリアにもっています。
    今、思いつくのは、

        1)当たり判定クラス・描画クラスを別に作って、
            各キャラクタの座標を登録する形式にして、当たり判定タスク・描画タスクが、
            自動的に処理するようにする。

        2)各タスクのリストを順にたどっていき、タスクの属性(敵・味方等)を元に、
            各タスクのワークエリアから座標を取得する。

    です。
    
    なにかよい方法はないでしょうか?


2.タスクシステムは、双方向リストで動的にメモリを確保・開放しています。
    動的確保のため、タスクの生成・削除が多いとメモリが虫食い状態になってしまいます。
    
    静的配列を使った方がよいのでしょうか?

    ただし、静的に確保するためには各タスクのデータ構造は構造体で定義しなくてはいけないため、
    (クラスだとポインタを使うのと代わりないため)
    外部から操作される可能性がでてきてしまいます。

    それを考えると、
    やはりクラスを使って動的に確保したほうがよいでしょうか?
    

3.現在、各タスクの登録時には実行する手続きを登録しています。
    手続きではなく、基本となるタスククラスを継承した各クラスを登録したほうが、
    
    コンストラクタ・デストラクタを自然に使えるので実装が簡単なのですが、

    そうすると、タスク内でタスクをチェンジした場合に、
    タスクの情報(座標等)を引き継ぐことができません。

    そのへんがクリアできれば、クラスの利点を生かしたタスクシステムが作れそうなのですが。


長くなってしまいましたが、ぜひ、アドバイスをよろしくお願いします。

編集 削除
にしの  2004-02-09 16:18:10  No: 7003  IP: 192.*.*.*

私個人の意見ですが、移動処理と当たり判定処理は同時に行った方が便利かと思います。
同じ処理をするタスクが複数あれば、それはマルチタスクでは??
1つのタスクで複数のデータを処理させれば、わざわざタスクの生成・削除はなくなりますよね。

メモリ管理は、定量のメモリをブロック単位で確保・破棄すれば、ある程度は断片化が防げると思います。

クラスの利点を生かしたいのであれば、仮想関数を持つ基底クラスを定義し、それから派生したクラスで処理を持たせます。
あとは、クラス参照型を利用すればOKです。

クラス参照型は、こういうとき便利ですよ。

編集 削除
Helena76  2022-01-17 13:59:34  No: 149965  IP: 192.*.*.*

静的配列の使用を支持します。すでに知られている技術であり、理解されている。だから、新しいものを発明する意味がないと思っているんです。私は古い技術に賛成です)

編集 削除
mam  URL  2022-01-19 07:37:13  No: 149968  IP: 192.*.*.*

随分前に、FMXでシューティングゲームを作りました。

https://mam-mam.net/download/notitle2/

全てのキャラクタ(自機、敵機、玉)は同じ基底クラスから派生し、プロパティに座標、幅高さ、当たり判定座標と幅高さ、シナリオ等を持ち、パブリック関数に、シナリオ進行(移動や玉の発射)関数、当たり判定関数(判定対象のキャラの座標、当たり判定幅高さ等を渡す)を持つようにして作った記憶があります。
メインシナリオクラスが敵機の出現、ボス破壊までシナリオ停止、ステージクリアなどの進行、
存在するキャラクタの一斉シナリオ進行、一斉コリジョン判定、、、
そんな感じだったと思います。
わかりにくくて、すいません。

編集 削除