RogueLikeゲームでさまざまなアクション速度を管理する方法は?
つまり、ターンベースのゲームでは、アクションやその他の特性に応じて、異なる「速度」で行動する俳優がいる場合があります。アクターは、スピードが速いかどうかによって、他のアクションよりも効果的にアクション/ターンを行います。
アクターが行動できるようになる時期を決定する方法(スケジューリングを変える?)
それを行うにはさまざまな方法があるように見えますか?アルゴリズムでいくつか説明できますか?
RogueLikeゲームでさまざまなアクション速度を管理する方法は?
つまり、ターンベースのゲームでは、アクションやその他の特性に応じて、異なる「速度」で行動する俳優がいる場合があります。アクターは、スピードが速いかどうかによって、他のアクションよりも効果的にアクション/ターンを行います。
アクターが行動できるようになる時期を決定する方法(スケジューリングを変える?)
それを行うにはさまざまな方法があるように見えますか?アルゴリズムでいくつか説明できますか?
回答:
ローグライクゲームTyrantでは、アクションポイントとスピードレーティングのシステムを使用しました。
基本的に:
その後、ゲームループは次のようになります。
hero action AP cost * 100 / hero speed
creature speed * elapsed time / 100
このシステムは全体的に非常にうまく機能し、素晴らしい機能の例は次のとおりです。
アクションが複数のターンを取ることを意味しますか(つまり、50ターンまっすぐ寝ます)。
私がすることは、オブジェクトplayer.currentActionを保持することです。currentActionには、アクションに必要なターン数、アクションの解決方法、およびアクションをキャンセルする状態のリスト(危険、攻撃を受けている、暑すぎるなど)が含まれる場合があります。各ターン、プレイヤーの入力を確認する前に、プレイヤーが現在アクションの最中であるかどうかを確認し、次のようなことをします...
if(!player.currentAction.interrupted())
{
if(player.currentAction.complete() == true)
{
player.currentAction.doAction(); //Some actions, like casting a spell, would have something happen here. Others, like sleeping, may or may not, depending on how you coded it.
player.currentAction = null;
}
else player.currentAction.decreaseTimer(); //Decrease our timer by one.
}
else
{
player.currentAction.interrupt(); //Let the player know he's been interrupted. Bungle the spell, cancel sleep, etc.
player.currentAction = null;
}
アクションポイントを使用できますが、ターン自体はありませんが、ティックは非常に小さくなります。すべてのアクターにアクションポイントの蓄積速度(たとえば、ティックごとに2 AP)があるとします。たとえば、10 APに相当するアクションを開始します。ゲームは5ティック先に進みます(これは、俳優がアクションのAP価格を支払うのにどれだけかかるかです)。
俳優が複数いる場合。このアクションが実行されるポイントで誰かがAPの価格を支払うまで、ゲームはティックごとに進みます。
アプローチは@mikeraに似ていますが、負のAPはありません。