タグ付けされた質問 「game-loop」

実行中のゲームプレイを処理する中心的なコードループ。最も基本的な状態では、入力を受け入れ、エンティティのアクションを解決し、シーンをレンダリングします。

11
いつ固定または可変の時間ステップを使用する必要がありますか?
ゲームループは固定または可変の時間ステップに基づいている必要がありますか?常に優れているのですか、それとも正しい選択はゲームによって異なりますか? 可変時間ステップ 物理の更新には「最後の更新からの経過時間」引数が渡されるため、フレームレートに依存します。これは、計算を行うことを意味する場合がありposition += distancePerSecond * timeElapsedます。 長所:スムーズで、コーディングが簡単 短所:非決定的で、非常に小さいまたは大きなステップで予測できない deWiTTERSの例: while( game_is_running ) { prev_frame_tick = curr_frame_tick; curr_frame_tick = GetTickCount(); update( curr_frame_tick - prev_frame_tick ); render(); } 固定タイムステップ 更新は、各更新が一定期間のものであると想定するため、「経過時間」を受け入れない場合もあります。計算はとして行うことができますposition += distancePerUpdate。この例には、レンダリング中の補間が含まれています。 長所:予測可能、決定論的(ネットワーク同期が容易?)、より明確な計算コード 短所:v-syncを監視するために同期されない(補間しない限りグラフィックが不安定になる)、最大フレームレートが制限される(補間しない限り)、フレームワーク内で動作しにくい可変時間ステップ(PygletやFlixelなど)を想定 deWiTTERSの例: while( game_is_running ) { while( GetTickCount() > next_game_tick ) { update(); next_game_tick += SKIP_TICKS; } interpolation …

3
メインゲームループを作成するにはどうすればよいですか?[閉まっている]
メインゲームループを作成するにはどうすればよいですか?ゲームループで行うべきことと、ゲームループですべきでないことは何ですか? 私はそれらをたくさん書きましたが、ゲームループを実際に読んだことがありません。私はそれらをかなり改善できると確信していますが、どうすればいいかわかりません。

5
ゲームループでの独立したレンダリングの更新のポイントは何ですか?
ゲームループに関する記事、書籍、ディスカッションは多数あります。しかし、私はかなり頻繁にこのようなものに出くわします: while(running) { processInput(); while(isTimeForUpdate) { update(); } render(); } このアプローチについて基本的に私を悩ませているのは、「更新に依存しない」レンダリングです。たとえば、まったく変更がないときにフレームをレンダリングします。だから私の質問は、なぜこのアプローチが頻繁に教えられているのですか?

5
ゲームの俳優は自分自身を描く責任がありますか?
私はゲーム開発は初めてですが、プログラミングは初めてです。 私は(再び)JavaScriptのcanvas要素を使用してPongタイプのゲームで遊んでいます。 Paddle次のプロパティを持つオブジェクトを作成しました... width height x y colour 次のPongようなプロパティを持つオブジェクトもあります... width height backgroundColour draw()。 draw()現在、メソッドはをリセットしてcanvasおり、そこで問題が発生しました。 必要があるPaddleオブジェクトが持つdraw()その描画方法は責任、または必要があるdraw()のPongオブジェクトがその役者を描くための責任がある(私が間違ってる場合、私はそれが正しい用語であると仮定し、私を修正してください)。 私はのためにそれがadvantagousだろうと考え出しPaddle自体を描画するために、私は2つのオブジェクトをインスタンス化するように、PlayerとEnemy。それはでなかった場合Pongのdraw()、私は二度同様のコードを記述する必要があると思います。 ここでのベストプラクティスは何ですか? ありがとう。

3
複数のクラスが同じデータにアクセスする必要がある場合、データはどこで宣言する必要がありますか?
C ++で基本的な2Dタワーディフェンスゲームを持っています。 各マップは、GameStateを継承する個別のクラスです。マップは、ゲーム内の各オブジェクトにロジックと描画コードを委任し、マップパスなどのデータを設定します。擬似コードでは、ロジックセクションは次のようになります。 update(): for each creep in creeps: creep.update() for each tower in towers: tower.update() for each missile in missiles: missile.update() オブジェクト(クリープ、タワー、ミサイル)は、ポインターのベクトルに格納されます。タワーは、新しいミサイルを作成してターゲットを特定するために、クリープのベクトルとミサイルのベクトルにアクセスできる必要があります。 質問は次のとおりです。ベクトルをどこで宣言しますか?それらはMapクラスのメンバーであり、引数としてtower.update()関数に渡されるべきですか?またはグローバルに宣言されましたか?または、私が完全に欠けている他のソリューションはありますか? 複数のクラスが同じデータにアクセスする必要がある場合、データはどこで宣言する必要がありますか?

3
標準のC#/ Windows Formsゲームループとは何ですか?
昔ながらのWindowsフォームとSlimDXやOpenTKなどのグラフィックAPIラッパーを使用するC#でゲームを作成する場合、メインゲームループはどのように構成する必要がありますか? 正規のWindowsフォームアプリケーションには、次のようなエントリポイントがあります public static void Main () { Application.Run(new MainForm()); } そして、クラスのさまざまなイベントをフックすることで必要なものを達成することはできますがForm、それらのイベントは、ゲームロジックオブジェクトへの一定の定期的な更新を実行したり、レンダリングを開始および終了するためのコードのビットを置く明確な場所を提供しませんフレーム。 そのようなゲームは、標準に似た何かを達成するためにどのようなテクニックを使用する必要がありますか while(!done) { update(); render(); } ゲームループ、そしてパフォーマンスとGCへの影響を最小限に抑えますか?

2
OpenGLでゲームループを構築する良い方法
現在、私は学校でOpenGLを学び始めており、先日(学校ではなく自分で)簡単なゲームを作り始めました。私はfreeglutを使用しており、Cで構築しているため、ゲームループでは、渡された関数を使用して、glutIdleFuncすべての描画と物理を1回のパスで更新していました。これは、フレームレートをあまり気にしないシンプルなアニメーションでは問題ありませんでしたが、ゲームはほとんど物理ベースであるため、更新の速度を抑える必要があります。 そのため、私の最初の試みは、関数をglutIdleFunc(myIdle())に渡して、前回の呼び出しから経過した時間を追跡し、物理(および現在のグラフィックス)を数ミリ秒ごとに更新することでした。timeGetTime()(これを使用して)これを実行していました<windows.h>。そして、これは私に考えさせられました、アイドル機能を使用することは本当にゲームループを進める良い方法ですか? 私の質問は、OpenGLでゲームループを実装するより良い方法は何ですか?アイドル機能の使用を避けるべきですか?
31 opengl  c  game-loop 


4
このコードの「デルタ」のポイントは何ですか?ゲーム開発の標準的なものを反映していますか?
私はゲームのプログラミングについてほとんど知りませんが、もっと学びたいです。このゲームのコードを理解しようとしています。私はコードがShipcontrols.jsに「デルタ」を渡している理由を理解しようとしています。これはユーザーの入力に基づいて船の方向を変更します。 基本的に、ゲームはループごとに「デルタ」を計算します... これは、1つのループを介してデルタを使用するスタックの短縮バージョンです... var delta = now - this.time; this.time = now; this.current.render.call(this.current, delta, this.renderer); ここへのステップ... ctx.manager.add("game", scene, camera, function(delta, renderer) { if(delta > 25 && this.objects.lowFPS < 1000) this.objects.lowFPS++; var dt = delta/16.6; this.objects.components.shipControls.update(dt); ここへのステップ... bkcore.hexgl.ShipControls.prototype.update = function(dt) { var pitchAng; var yaw; var roll; if (undefined != hand){ …

5
複数のフレームを完了するゲームアクション
これまでにゲームプログラミングをしたことがないのですが、かなり簡単な質問です。 メインループが次のように見えるテトリスゲームを作成しているとします。 for every frame handle input if it's time to make the current block move down a row if we can move the block move the block else remove all complete rows move rows down so there are no gaps if we can spawn a new block spawn a …

4
メインゲームループが制御されずに実行されても問題はありませんか?
私のゲームループがシステムの許す限り高速で実行されたときに、害が生じる可能性があるかどうか疑問に思っていましたか? 現在、ナノ秒単位で経過時間を測定することで、問題なく事前定義された速度でゲームロジックとレンダリングロジックを実行するループがあります。実際、私がループ内で行うロジックは、毎秒一定量の呼び出しに合わせてクロックされます。 ループ自体は、私のマシンでは1秒間に約1,170万のループに達するのと同じくらい高速で実行されます。 ループ(単純な擬似コード): while(!isGameOver){ if(canPollInputs){ pollInputs() } while(canStepLogic){ stepLogic() } if(canRender){ render() } } 私の質問は、基本的に、その単純なループが、制御された速度で実行されていない場合、システムに害を及ぼすことができるかどうかです。 編集:つまり、ロジックは1秒に30回(30 tps)で実行され、レンダラーは60 fpsで実行され、入力を1秒に100回ポーリングしています。 。ただし、ループ自体は調整されません。 編集:Thread.sleep()たとえば、メインループを1秒あたり250ループまでスロットルすると、削減につながりますが、ループは目的の250ではなく、1秒あたり約570ループで実行されます(デスクトップマシンにいるときにコードを追加します。) 編集:ここで、物事を明確にするために動作するJavaゲームループに行きます。また、自由に使用できますが、あなたのものではありません;) private void gameLoop() { // Time that must elapse before a new run double timePerPoll = 1000000000l / targetPPS; double timePerTick = 1000000000l / targetTPS; double timePerFrame = …

1
ビヘイビアツリー:: 1ティック以上かかるアクション
私がビヘイビアツリーで理解していることから、各ビヘイビアは、数回の反復で実行できる短い目標指向のアクションである必要があります。 したがって、たとえば、以下はビヘイビアツリーの画像です。 ここで、Drive To Enemyの動作には、ツリー内で数回以上の反復が必要であると想定しましょう。そのため、各パスでDrive To Enemyが呼び出されるのは、現在実行状態になっているためです。 問題は、敵が近くにいる場合、Evade Enemyに電話したいことです。Drive To Enemyが常に呼び出されることを考慮すると、Evade Enemyを呼び出す機会はありません(おそらく、Enemyを避ける必要があります)。 万一私はツリーを横断し、各アクションが現在実行されているものに関係なく渡しますか? 私はこれについて正しい方法で行っていますか? そのような動作を処理する適切な方法は何ですか? もともとStackoverflowで尋ねられました。ここで考えたほうが、この質問をするのに適した場所です。
19 ai  game-loop  behavior 

3
アクションに副作用があるターンベースのゲームの設計
私はゲームDominionのコンピューター版を書いています。アクションカード、​​トレジャーカード、および勝利ポイントカードがプレイヤーの個人デッキに蓄積される、ターンベースのカードゲームです。クラス構造はかなりよく発達していて、ゲームロジックの設計を始めています。私はpythonを使用していますが、pygameで簡単なGUIを後で追加するかもしれません。 プレイヤーのターンシーケンスは、非常に単純なステートマシンによって管理されます。時計回りに回すと、プレイヤーはゲームが終了するまでゲームを終了できません。シングルターンのプレイもステートマシンです。一般的に、プレイヤーは「アクションフェーズ」、「購入フェーズ」、「クリーンアップフェーズ」をこの順番で通過します。ターンベースのゲームエンジンを実装する方法の質問への回答に基づいて?、状態マシンはこの状況の標準的な手法です。 私の問題は、プレイヤーのアクションフェーズ中に、自分自身または他のプレイヤーの1人以上に副作用のあるアクションカードを使用できることです。たとえば、1枚のアクションカードを使用すると、プレーヤーは現在のターンの終了後すぐに2ターン目を取ることができます。別のアクションカードを使用すると、他のすべてのプレーヤーは手札から2枚のカードを捨てます。さらに別のアクションカードは、現在のターンでは何も行いませんが、プレーヤーは次のターンに追加のカードを引くことができます。物事をさらに複雑にするために、新しいカードを追加するゲームへの新しい拡張が頻繁にあります。すべてのアクションカードの結果をゲームのステートマシンにハードコーディングすると、見苦しくなり、適応できなくなります。ターンベースの戦略ループへの答え この問題を解決するための設計に取り組む詳細レベルには入りません。 ターン内で行われるアクションによってターンを取るための一般的なパターンを変更できるという事実を包含するために、どのようなプログラミングモデルを使用すべきですか?ゲームオブジェクトは、すべてのアクションカードの効果を追跡する必要がありますか?または、カードに独自の効果を実装する必要がある場合(たとえば、インターフェイスを実装することによって)、十分なパワーを与えるにはどのようなセットアップが必要ですか?この問題に対するいくつかの解決策を考えましたが、それを解決する標準的な方法があるかどうか疑問に思っています。具体的には、アクションカードがプレイされた結果としてすべてのプレイヤーがしなければならないアクションを追跡する責任を負うオブジェクト/クラス/その他、および通常のシーケンスの一時的な変更との関係を知りたいターンステートマシン。

2
衝突検出ロジックはどこに配置する必要がありますか?
私は小さな2Dゲームエンジンを開発しています。文字には、現在次のことを行うpaintメソッドがあります。 速度などに応じてキャラクターの新しい位置を計算します。 コリジョングリッドセルを更新します** 新しい位置にキャラクターを描く **交差点チェックの回数を減らすために衝突グリッドを作成しました 今、衝突を検出するために私が考えた基本的なアルゴリズムは次のとおりです。 For Each Character Check intersection with characters in surrounding 8 cells このメソッドをpaintメソッドに配置するだけです。しかし、ここに私が予想する問題があります。 2つの文字AとBが衝突グリッドの隣接するセルにあるとします。これで、上記のアルゴリズムに従って、文字Aの反復でBと衝突したことが検出されます。文字Bの反復で、文字Aと衝突したことが検出されます。 しかし、AがBと衝突したことをAが検出すると、Aと衝突したことをBに通知する必要があるという考えがあります。これにより、衝突するアクタが2人以上いる場合に多くの比較を保存できます。しかし、私はこれをどのように扱うかわかりません。すべてのキャラクターが衝突をチェックする代わりに、ゲームループ内で衝突をチェックする必要があると思います。 このアプローチは正しいでしょうか?この種の問題をどのように処理しましたか?衝突グリッドのことは自分で考えました。コリジョングリッドロジックに代わるものはありますか?

2
マウスを動かすと、スプライトプレーヤーの動きが速くなるのはなぜですか?
Pygame(Pythonライブラリ)で作られたシンプルなゲームを開発しようとしています。 のspriteオブジェクトがあり、player矢印キーを使用して移動します。マウスを動かさないと、スプライトは普通に動きますが、マウスを動かすと、スプライトは速く動きます(x2やx3など)。playerオブジェクトが内部にあるcharsGroupVAR。 ゲームをW7とUbuntuで実行しました。両方のOSで同じことが起こります。 NPCや弾丸のように動くエンティティがもっとありますが、影響を受けるのはプレイヤーだけです。これを考えると、問題はおそらくプレイヤーの移動システム(矢印キー)と直接関係があると思います。 オブジェクトのupdate()メソッドは次のplayerとおりです。 def update(self): for event in pygame.event.get(): key = pygame.key.get_pressed() mouseX, mouseY = pygame.mouse.get_pos() if event.type == pygame.MOUSEBUTTONDOWN: self.bulletsGroup.add(Bullet(pygame.image.load("bullet.png"), self.rect.x + (self.image.get_width()/2), self.rect.y + (self.image.get_height()/2), mouseX, mouseY, 50, 50)) if key[pygame.K_RIGHT]: if not self.checkCollision(): self.rect.x += 10 else: self.rect.x -= 10 if key[pygame.K_LEFT]: if not self.checkCollision(): …

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