ゲームの時間操作メカニズムが一般的にどのように設計されているのか疑問に思っています。私は特にタイムリバースに興味があります(最新のSSXやPrince of Persiaのようなものです)。
ゲームは2Dトップダウンシューティングゲームです。
私が設計/実装しようとしているメカニズムには、次の要件があります。
1)プレイヤーキャラクター以外のエンティティのアクションは完全に確定的です。
- エンティティが実行するアクションは、レベルの開始以降に進行したフレームおよび/または画面上のプレーヤーの位置に基づいています
- エンティティは、レベルの設定された時間に生成されます。
2)時間逆転は、リアルタイムで逆転することで機能します。
- プレーヤーのアクションも逆になり、プレーヤーが実行したものとは逆に再生されます。リバースタイム中はプレイヤーはコントロールできません。
- リバースに費やす時間に制限はありません。必要に応じて、レベルの最初までリバースできます。
例として:
フレーム0-50:プレイヤーはこの時間内に前方に20ユニット移動します。敵1がフレーム20でスポーンします。フレーム50
これを逆にすると、リアルタイムで再生されます。この間、プレーヤーは20ユニット後方に移動します。敵1はフレーム50で復活します。弾丸はフレーム50で再出現します。フレーム20。
動きを見るだけで、これを実現する方法についていくつかのアイデアがありました。時間を進めたり、逆転させたりするときの動作を変えるインターフェースを持つことを考えました。このようなことをする代わりに:
void update()
{
movement += new Vector(0,5);
}
私はこのようなことをします:
public interface movement()
{
public void move(Vector v, Entity e);
}
public class advance() implements movement
{
public void move(Vector v, Entity e)
{
e.location += v;
}
}
public class reverse() implements movement
{
public void move(Vector v, Entity e)
{
e.location -= v;
}
}
public void update()
{
moveLogic.move(new vector(5,0));
}
ただし、これは最適なパフォーマンスではなく、より高度なアクション(カーブしたパスに沿ったスムーズな移動など)を行うとすぐに複雑になることに気付きました。