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


2310  2004-02-08 23:53:49  No: 7002

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

そこで質問なのですが、

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

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

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

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

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

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

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

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

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

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

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

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

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

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


にしの  2004-02-10 01:18:10  No: 7003

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

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

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

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


Helena76  2022-01-17 22:59:34  No: 149965

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


mam  URL  2022-01-19 16:37:13  No: 149968

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

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

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


※返信する前に利用規約をご確認ください。








  このエントリーをはてなブックマークに追加