「ゲームロジックコード」とは何ですか?


50

私はC#/ XNAを使用していますが、更新コードと描画コードを混在させないように何度も言われていますが、私はそうではないと確信しています!しかし、誰もが正確に「論理コード」とは何かを説明してもらえますか?

ここに見られるように:http : //blogs.msdn.com/b/shawnhar/archive/2007/07/25/understanding-gametime.aspx

[...]ゲームロジックをすべてDrawメソッドではなくUpdateメソッド内に配置すると、すべてが一定の速度で実行されます。

私のゲームの速度はFPSに比べて変動するため、これを求めています。遅いFPSは遅い動きのオブジェクトに等しく、その逆も同様です。そして、はい、私は予想されるposition += speed * (float)gt.ElapsedGameTime.TotalSeconds;コードを含めています。

これはおそらく大きな新人の質問ですが、この定義については絶対に明確にしたいだけです。


私はあなたが意味したと思いますposition = speed * ...TotalSeconds。で=はないことに注意してください+=。それだったら+=、あなたが入力しただけのように、そしてあなたの位置は、ほぼ瞬時に画面をオフに飛んでいくのです。
DrZ214

「位置+ =方向*速度* ... TotalSeconds」のようなコードがあり、非常にうまく機能しています。私は何かをタイプミスしたかもしれませんが、位置=速度はすべての更新を割り当てます。あなたのやり方はうまくいくかもしれませんが、私のコードはこのように動作しています。(方向は正規化されていることに注意してください)
シェイガイ

gt.ElapsedGameTime.TotalSecondsプログラム(ゲーム)を開始してから経過した秒数だと思いました。速度にそれを掛けると、5秒の再生後に速度が5倍速くなります(速度が0に設定されている特別な場合を除く)。あなたがそれを持っていることが他に何がそれを真実ではないかわからないが、私は興味をそそられる。
-DrZ214

1
ああ、それは最後の更新以来です。gamedev.stackexchange.com/questions/67968/...
Shyyガイ

2
魅惑的な私はそれを推測することはなかったでしょう。数秒でiiiそれを望んでいないので、私は手動ですべての更新をインクリメントするという独自の変数を個人的に使用しているので、ステップやフレームが必要です。しかし、あなたの方法は物事をソフトコーディングする有効な方法であることがわかります。
DrZ214

回答:


102

それはあなたのゲーム世界の状態を変えますか?それは論理コードです。

ゲームの世界の状態を表示しますか?レンダリングコードです。


コードを一目見れば100%確実になります。良い説明、ありがとう。
シェイガイ

38
入力を処理しますか?そのコントローラーコード。コントロールをロジックから分離し、同じロジックを異なるタイプのコントロールで使用できるようにします。たとえば、FPSInputController + CharacterMotor vs. AIInputController + CharacterMotor vs NetworkInputController(マルチプレイヤーインスタンスの他のプレイヤーなど)+ CharacterMotor。モーター(ロジックコード)は、命令がどのように取得されるかを気にしません。提供される(この種のデカップリングにより、プレーヤーからAIボット(Left 4 Deadおよびidleプレーヤーを考えてください)への簡単な移行が可能になります)とりわけ)。
Draco18s

10
ドラコは良い点を持ち出します。コードに含めることができる多くの異なる部門があります。Nilsの分割は、ロジックとレンダリングの間の典型的な分割と考えるものですが、他にも多くのレイヤーがあります。それらをレイヤーに分離する本当の理由は、各レイヤーが、類似した要件を持つ類似したスタイルのコードを必要とする類似したアクションで構成されていることです。たとえば、多くのゲームでは、2〜3フレームで完了するゲームロジックを回避できますが、各フレームのレンダリングを行わないと、ユーザーの目はすぐに気付きます。
コートアンモン

それらを明確に保つことは、要件が緊張の原因になり始めたときに要件を管理するのに役立ちます。
コートアンモン

6
また、MVCをあまりにも多く投げると、クロールが遅くなる可能性があるため、保守性と最適化のバランスを常にとるようにしてください。ただし、何をしているのかが確実に分からない限り、あまりにも早く最適化しないでください。また、いつでもリファクタリングできることを忘れないでください。そして...ええと、多くのゲームを作り、あなたの間違いから学びます。
モーリシー

24

次の場合、分離は正しいです。

  • Update()の呼び出しを散在させずにDraw()を連続して複数回呼び出しても、呼び出し間で目に見える変化は生じません。
  • Draw()を散在させずにUpdate()を連続して複数回呼び出すことは、画面をオフにしてゲームをプレイするようなものです。

5
適切に書かれたものDraw()は、時間が経つにつれて異なる絵を描くことがあります。たとえば、アニメーション化されたスプライトのフレームは変化し続ける場合があります。また、レンダリングコードが一般的なトリックを使用し、velocity * time since last update / period of updateオブジェクトの表示位置に追加する場合(実際の位置は変更されないまま)、オブジェクトは視覚的に前進し続ける可能性があります。
HolyBlackCat

2
iffif-and-only-ifを意味しますか?
BalinKingOfMoria

3
@HolyBlackCat:それは議論の余地があります。グラフィックを一時停止する場合はどうなりますか?アニメーションのフレームがゲームに影響する場合(ヒットボックスに対応する攻撃アニメーションなど)視覚的な補間は、(ゲームのデルタ時間のように)「時間」が経過していることを意味しますが、時間が経過していUpdateて、他の何が同期していないのですか?プレイヤーの入力を見逃している、ネットワークイベントが処理されていないなど?ゲームは単一のクロックから駆動する必要があり、そのクロックから派生したゲームロジックまたは物理学の固定「ティック」と、同じクロックによって駆動される派生グラフィックス状態も必要です。
ショーンミドルディッチ16年

@SeanMiddleditch私は同意します、ほとんどいつもあなたはDraw()そのような方法で書くことができるので、連続して数回呼び出されたときに常に同じ絵を描きます。可能であればそれを行う必要があります。ただし、どの周波数Draw()で呼び出されるかわからない場合があります。たとえば、新しい120hzモニターの完全なサポート(実際の120 FPS)が必要な場合、vsyncをオンにします。What if I want to pause graphics?次に、実際のデルタ時間の代わりに0をに渡しますDraw()
HolyBlackCat

2
@HolyBlackCat:120hzレンダリングの使用を妨げるものは何もありません。私は絶対に固定ドロー率を推奨していませんでした。それはただの素人です。固定レートのゲームロジックティックの累積値にフィードするレンダーフレームの観点からデルタが測定されるグローバルゲームクロックが1つ必要です。そのグローバルクロックは、補間を含むグラフィックスを駆動します。クロックスケールをに設定すると、グラフィックを一時停止でき0ます。階層的なクロックを持つことができるので、たとえば、文字補間も非常に簡単に停止している間もUIが実行およびアニメーション化されます。
ショーンミドルディッチ

7

ここでのポイントは、モデルではないモデル物の分離です。

ゲームロジックは、

これらはすべて、異なる、関連するソフトウェアアーキテクチャパターンです。しかし、すべての場合において、モデルは同じものであり、実際のロジックと実際の状態です。

ビジネスソフトウェアを作成するとき、ビジネスロジックと呼ばれることもあり、ビジネスポリシーの一部をエンコードします。たとえば、クレジットカードの請求書を計算するために銀行向けに何かをコーディングしている場合、30日以内に借金を清算すれば利息を支払わなくても済むようにする機能はビジネスロジックの一部であり、型。たとえば、表示レイヤーの1つには存在しません。請求書を印刷するためのコードは、たとえば、アクションに基づいてテキストを編集しません。この例はおそらく、コードをそのように整理する必要がある理由を明らかにしています。

ゲームロジックについても同様です。

ある時点で、ゲームが別のコンソールに移植されたと想像してください。現在のターゲットとは本当に異なる何かを想像するのに役立つかもしれません。たとえば、ゲームパッド/コントローラーを使用してターゲットを設定している場合、ゲームがタッチスクリーンタブレットに移植されることを想像してください。ゲームロジックは、移植しても変わらないコードの一部です。

ゲームが軍事戦略ゲームのようなものである場合、世界で最も複雑なボードゲームに変換されることを想像してください。ゲームロジックは、ルールブックの行に直接対応するコードのセクションです。(ルールブックのすべての行ではなく、ピースの移動に関する行ではなく、いくつかの行。)

ゲームのロジックは、フォームに関係なく、決して変わらないものです。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.