ゲーム開発

プロおよび独立系ゲーム開発者向けのQ&A

2
落下ブロックと複雑な形状
私は現在、テトリスのような単純なゲームを持っていて、解決できない問題に遭遇しました。 テトリスとは異なりがある場合、単一の落下形状は、I落下する必要のある複数の、潜在的に連動形状を有しています。最終的な位置を計算する必要があります。以下を検討してください。 緑の形状の最終的な位置を計算するには、別の正方形またはボードの端に当たるまで、すべての正方形をスキャンします。できた 複数の単純な形状の場合は、ボードを上に向かって作業します。したがって、赤は移動する必要がないことがわかり、オレンジは1つ下がり、緑は3つ下がります。できた 連動する緑と赤の形の扱い方がわかりません。#2のロジックを使用すると、空中で「スタック」してしまいます。緑の形状を下にスキャンすると、赤に遭遇して移動しません。赤の場合も同様です。解決策は、2つの形状を1つとして扱うことです。 #3と同様に、このシナリオでは、オブジェクトを1つとして扱うことで成功させることもできます。 #3や#4とは異なり、オレンジのシェイプは1スクエアの高さに浮き上がるため、シェイプを1つとして扱うことができませんでした... 問題#6の別のバリエーション。 ますます複雑なシナリオで織り交ぜる多くの図形がある他のシナリオも考えられますが、上記で問題の最も基本的な部分がカバーされていると思います。 私がまだ出会っていない/考えていないエレガントな解決策があるように感じます。洞察、アイデア、またはリソースに非常に感謝します。 解決 私が思いついた解決策は確かにエレガントです、以下の@ user35958の答えに基づいて、次の再帰関数(疑似コード)を作成しました function stop(square1, square2){ // Skip if we're already stopped if(square1.stopped){ return; } // Are we comparing squares? if(!square2){ // We are NOT comparing squares, simply stop. square1.stopped = true; } else { // Stop IF // square1 …

1
ゲームでプレイステーションのコントローラーボタンアイコンを使用できますか?
私は現在、コントローラーサポート付きのPCでリリースされるゲームに取り組んでおり、ゲーム内でコントローラーアイコンを最もよく表す方法を見つけようとしています。 最初に何らかの形のライセンスがないと、ゲームでプレイステーションまたはXboxコントローラーのアイコンを単純に使用できないと思います(そうですか?)。 では、コントローラーのPCゲームで「Press X to interact」のようなものを伝えるのが最善でしょうか?

3
UKインディースタジオ登録
私はイギリス出身で、インディーズゲームの作成がほぼ完了し、ゲームを販売するいくつかのオンライン小売業者からも興味を持っていました。これには、基本的な契約を結ぶ必要があります。 私は自宅で趣味で働いている1人の男です。それが当たり前だからといって、ゲームのスタジオ名を付けています。 先に進む前に「会社」名を登録する必要がありますか? 編集:私はすでに別の分野での以前の仕事から自営業として登録されています
10 business 

1
マルチプレイヤープラットフォーマー-サーバー上の単一のクライアントでサーバーの修正が通常必要ですか?
私は現在、かなりシンプルなマルチプレイヤープラットフォーマーに取り組んでいます。私は待ち時間を隠すために使用される手法に関する記事をかなり読みましたが、それでも特定の概念を理解することができません。私はこのトピックが非常に興味深く、自分でアイデアを試したいと思っていますが、私の質問にはgamedev stackexchangeに尋ねる方が効率的だと思います。私の現在の状況と、その過程でどんな質問が生じたかを説明するために最善を尽くします。 現時点では、サーバーと同期するプレーヤーを1つだけにしたいと思っています。理論的には、クライアント側の予測を使用するプレイヤーは、自分の動きに影響を与える外部要因がないため、サーバーの修正は不要であると想定しました。したがって、私のプロトタイプでは現在、サーバー修正を送信せずにサーバーと同期しているプレーヤーは1つだけです。 ゲームネットワーキングに精通している場合は、コンテキストセクションをスキップすることもできますが、途中で問題が発生した可能性もあります。 クライアントループ(フレームごとに1回、〜16.67msごとに1回) 単純化されたクライアントループは次のようになります。 ローカル入力(WASD)を確認し、アクション(例:)としてパッケージ化しますType=MoveLeft, Time=132.0902, ID=15。後で送信するために、パッケージ化されたアクションを保持します。また、目的のアクションをゲームのローカルの物理シミュレーションに直接適用します。たとえば、MoveLeftアクションがある場合、プレーヤーの速度を左に向けて力を加えます。 チェックしてアクションを送信します。クライアントの帯域幅を乱用しないようにするには、パッケージ化されたアクションを特定の間隔(30msなど)でのみ送信します。 サーバーの変更を適用します。ある時点で、これはサーバーが受け取ったデルタと修正を処理し、それらをゲームのローカルシミュレーションに適用します。この特定の質問では、これは使用されません。 ローカル物理学を更新します。メインプレーヤーで物理ループを実行します。基本的に、これはプレイヤーの動きのクライアント側の予測を行います。これにより、プレーヤーの速度に重力が追加され、プレーヤーの速度が位置に適用され、途中で衝突が修正されます。物理シミュレーションは常に固定デルタ秒で実行されることを指定する必要があります(実際のデルタ秒に応じて複数回呼び出されます)。 。 物理学およびその他のセクションについては、質問には必要ないと感じたため、いくつかの具体的な詳細はスキップしますが、質問に関連するかどうかは、遠慮なくお知らせください。 サーバーループ(15msごと) 単純化されたサーバーループは次のようになります。 アクションを処理します。クライアントから受け取ったアクションパッケージを確認し、サーバーの物理シミュレーションに適用します。たとえば、5つのMoveLeftアクションを受け取ることができ、力を速度に5回適用します。アクションパッケージ全体が1つの「フレーム」で実行されることに注意してください。これは、アクションが発生するとすぐに適用されるクライアントではなく、 ゲームのロジックを更新します。ゲームの物理演算、プレーヤーの移動、衝突の修正などを更新します。また、後でプレーヤーに送信された重要なイベント(プレーヤーのヘルスの低下、プレーヤーの死亡など)もパッケージ化します。 修正を送信します。私たちは定期的に(たとえば、35ミリ秒ごとに)デルタを他のプレーヤー(たとえば、プレーヤーの位置、ヘルスなど)に最近変更した場合に送信します。この部分は現在実装されていません。クライアント側の予測が適切に機能することを確認するために、単一のプレーヤーのシミュレーションで修正なしでクライアントとサーバーで同じ結果が得られるようにしたいのです。 問題 現在のシステムは単純な状況では問題なく機能し、単純な水平移動でも非常によく似た結果が得られたことを嬉しく思います(この不正確さは浮動小数点の精度エラーが原因であると思います)。 プロトタイプのグラフィックは無視してください。白い長方形=プレーヤー、赤い長方形=障害物、青い=背景 しかし、ジャンプしたり、孤立した障害物に近づいたりするなど、時間に敏感な動きをした後、同期エラーが発生します。 理論的には、クライアントの立場に影響を与える外部要因がないため、どちらも常に同じ結果になると予想します。しかし実際には、問題は理解できたと思います。 そのような障害物の周りをジャンプすることは、プレーヤーのタイミングに大きく依存するため、速度がその位置に適用されたときの小さな変動は、結果に繰り返し実行されます(たとえば、クライアントは、サーバーは後でアクションパッケージ全体を受け取り、障害物にしばらく留まり、最終結果を変更するため、サーバーはそれを行います)。クライアントとサーバーがそれを処理する方法の違いは、サーバーがそれらを受信するときに、サーバーがそれらをすべて一括して実行するのに対し、クライアントはそれらが発生するとすべてのアクションを実行することです。 質問 この長いコンテキストは最終的に私の質問につながります(ここまで読んでいただきありがとうございます):サーバーと同期しているプレーヤーが1人だけの場合でもサーバーの修正が必要ですか、それとも特定の手法を使用して時間に敏感な状況での非同期を回避する必要がありますか? 私はいくつかの可能な解決策を考えましたが、そのいくつかは私にはあまり満足できません: サーバー修正を実装します。これが正常な動作であると単純に想定し、発生したエラーを修正してください。とにかくそれを実装したかったのですが、これまでに行ったことを受け入れられるようにしたかっただけです。 提供されたクライアント時間を使用して、目的のアクションを適用します。これはラグ補償と似ていると思います。「時間をさかのぼって」動きをチェックする必要があります。サーバーの修正を適用するようなもので、時間を遡り、その後の次のアクションを再適用します。本当に嫌いです。それは複雑でリソースが高価に見え、クライアントの指定された時間を信頼する必要があります(ただし、時間がかなり合法に見えることを実際に確認する予定ですが)。 GameDevelopment StackExchangeに、私のすべての問題を解決する優れた新しいアイデアを求めてください。 私はゲームネットワーキングの世界を始めたばかりなので、上記のコンセプトを修正、批判、侮辱したり、ワンダフルワールドオブネットワーキングの旅に役立つアイデアやリソースを提供したりしてください。他の場所で自分の答えを見つけることができたとしたら、失礼します。 貴重なお時間をありがとうございました。

4
タスクの割り当て
壁の構築など、労働者が任務を負うRTSでは、労働者はどの壁を構築するかをどのように決定しますか? プレイヤーは、どの壁をどこに構築するかを決定しますが、個々のワーカーを個々の壁の四角形に割り当てません。多くのRTSゲームでは、ワーカーは近くのタスクを実行するだけですが、RTSでは、特定の正方形で明示的なタスクを戦略的に実行することを主な戦略として使用したいので、どこかにクラスター化してタスクを残さないようにしたくありません。離れて行われません。 私は建物の壁の例を使用しています。それは鉱石、道を作ること、木を集めることなど何でもあり得ます。重要なのは、ユーザーがどこを選ぶかではなく、誰を選ぶかです。 ワーカーは、アクセス可能な正方形に隣接する正方形でのみ作業できます。彼らが自分たちで作業する正方形は、作業が完了するまで通行できない場合があります。 労働者1と2は、正方形A、B、C、Dを採掘するように指示されています。 ゲームティックごとに1マス移動でき、1マスのマイニングには10ティックかかります。 どの労働者がどのマスを採掘するかをどのように決定しますか? 1がAをマイニングし、2がCをマイニングする必要があることは自明のようです。 1はAから4マス離れているため、14ティックでマイニングが完了します。1は次にどこに行くべきですか、そしてなぜですか? そして、Bの真上に採掘される別の正方形-E-があった場合はどうなりますか? ワーカーが次に進むべき場所を決定するために使用するロジックは何ですか?
10 ai 

1
(リアルタイム-)グローバルイルミネーションの開始点[終了]
閉まっている。この質問はトピックから外れています。現在、回答を受け付けていません。 この質問を改善してみませんか? 質問を更新して、ゲーム開発スタック交換のトピックになるようにします。 6年前休業。 リアルタイムのグローバルイルミネーション(ダイナミックライティングシナリオの場合)に入るときに、誰かが注目すべきテクニックはどれですか 主題について何も知らずに、言及されているさまざまな手法を実際に理解することは困難です。GIをグラフィックスエンジンに組み込みたい場合、ベースラインとしてどこから読み始めればよいですか?新しいアルゴリズム(つまり、数か月の作業でマイナーパフォーマンスが得られる高度に専門化されたアルゴリズムではない)が妥当な期間内に実装できるアルゴリズムと、完全に古くなっていないアルゴリズム(つまり、単純にきれいで高速なものに置き換えられるアルゴリズム)はどれですか。 フォトンマッピングは頻繁に登場するようで、ボクセルコーントレースや、より具体的なアルゴリズム(CryEngine 3で使用されているこのテクニックなど)について読んだことがあります。しかし、フィールドについてほとんど何も知らないので、どこから始めればよいかを決めるのは困難です。 調査する価値がある一般的なテクニックは何ですか?

2
Unityプロジェクトでのgitの問題
gitでプロジェクトフォルダーのバージョン管理を試みました。しかし、リポジトリからプロジェクトをプルすることになると、何かがうまくいきませんでした:明らかにスクリプトが欠落しており、プレハブとすべてのグラフィック要素の種類がピンクがかったように見えます。誰かがこれを修正する方法を知っていますか? これは私が現在使用している.gitignoreです: Temp/ Obj/ UnityGenerated/ Library/ ExportedObj/ *.svd *.userprefs *.csproj *.pidb *.suo *.sln *.user *.unityproj *.booproj .DS_Store .DS_Store? ._* .Spotlight-V100 .Trashes Icon? ehthumbs.db Thumbs.db 前もって感謝します。
10 unity  git 

3
何かが消えるのに近づくにつれて、フラッシュ/点滅をより頻繁にする方法を教えてください。
私のゲームでは、敵を倒すと、ヘルスパックやゴールドなどをドロップすることがあります。これには時間制限を設けて、手に取らなければ最終的には消えるようにしたい。ドロップが「死」に近づくほど、アイテムをより頻繁に点滅させたいです。「より頻繁に点滅する」アルゴリズムをどのように実行しますか?

4
「任意のボタンの押下」の検出
プレーヤーが任意のボタンを押してメインページから続行できるようにしようとしています。これを行うには、ボタンのリストを作成し、ボタンをループして、ボタンの1つがダウンしていないかどうかを確認しました。しかし、私はこのコードがちょっと醜いと感じ、私が考えていないより簡単な方法があるかどうか疑問に思いますか? これが私のコードが今どのように見えるかです: if (GamePad.GetState(PlayerIndex.One).IsConnected) { var buttonList = new List<Buttons>() { {Buttons.A}, {Buttons.B}, {Buttons.Y}, {Buttons.X}, {Buttons.Start}, {Buttons.Back}, {Buttons.RightShoulder}, {Buttons.LeftShoulder}, {Buttons.RightTrigger}, {Buttons.LeftTrigger} }; foreach (var button in buttonList) { if (GamePad.GetState(PlayerIndex.One).IsButtonDown(button)) ExitMainMenu= true; } }
10 xna  monogame 

2
OpenGLは複数の重なり合うオブジェクトのアウトラインを取得します
私はc ++でopenglを使用して作成した進行中のゲームのアイデアを持っています。プレイヤーが何かに勝ったときに、複数の重複するオブジェクトに大きなアウトライン(5〜6ピクセル)が欲しいです。 最良の方法はステンシルバッファーを使用することだと思いましたが、ステンシルバッファーを画面外にレンダリングしようとするのは数時間であり、どんな種類の結果も達成できないので、大したことはありません。他にもいくつかテクニックがあります! これは私が入手したいものです: 何か案は?
10 opengl  outline 

1
レイヤー間にキャストされた2Dシャドウを実装するにはどうすればよいですか?
別のレイヤーのオブジェクトによってキャストされる2Dシャドウを実装するにはどうすればよいですか? Catalin Zimaの有名なチュートリアルの動的照明とは異なります。 しかし、このビデオのパイプの影のように: そして、このビデオのプラットフォームの影とキャラクターのように: 多くのレイヤーとさまざまな色の多くのライトがあるシーンで同じ種類のライティングを使用したいと思います。 レイヤーの背後にあるレイヤーの上にレイヤーの黒いコピーを描画し、影がキャストされているレイヤーの穴に応じて調整することで、これを想像できます。しかし、私はこれのためのより安価な、ピクセルシェーダーベースのアプローチがあることを願っています。

1
エンジンレンダリングパイプライン:シェーダーを汎用にする
OpenGL ES 2.0(現在のところiOS)を使用して2Dゲームエンジンを作成しようとしています。私は、Objective Cでアプリケーション層を記述し、C ++で別の自己完結型のRendererGLES20を記述しました。レンダラーの外部ではGL固有の呼び出しは行われません。完全に機能しています。 しかし、シェーダーを使用する際にいくつかの設計上の問題があります。各シェーダーには、メインの描画呼び出しの直前に設定する必要のある独自の固有の属性とユニフォームがあります(この場合はglDrawArrays)。たとえば、いくつかのジオメトリを描画するには、次のようにします。 void RendererGLES20::render(Model * model) { // Set a bunch of uniforms glUniformMatrix4fv(.......); // Enable specific attributes, can be many glEnableVertexAttribArray(......); // Set a bunch of vertex attribute pointers: glVertexAttribPointer(positionSlot, 2, GL_FLOAT, GL_FALSE, stride, m->pCoords); // Now actually Draw the geometry glDrawArrays(GL_TRIANGLES, 0, m->vertexCount); // …

4
エンティティコンポーネントシステムでのエンティティの「タイプ」の識別
エンティティに明示的な「タイプ」(例:プレーヤー)がなく、単にコンポーネントのコレクションである場合、システムで作業する必要があるエンティティとそうでないエンティティを識別するにはどうすればよいですか?たとえば、ポンのゲームでは、パドルとボールの両方がウィンドウの境界に衝突します。ただし、それぞれの衝突処理システムは異なるため、システムは間違ったタイプのエンティティを処理するべきではありません。 void PlayerCollisionSystem::update(std::vector<Entity *> entities) { typedef std::vector<Entity *>::iterator EIter; for (EIter i = entities.begin(); i != entities.end(); ++i) { Entity *player = *i; // How do I verify that the entity is a player? // Get relevant components. PositionComponent *position = player->getComponent<PositionComponent>(); VelocityComponent *velocity = player->getComponent<VelocityComponent>(); SpriteComponent *sprite = …

4
法線マッピングは実際にどのように機能しますか?
法線マッピングの概念を理解しようとしていますが、いくつか混乱しています。つまり、法線マップが視点に依存するかどうか(つまり、同じオブジェクトの周りを回転したときに、同じオブジェクトの別の法線マップを取得できるかどうか)はわかりません。第二に、青みがかった色が法線マップで主な色である理由がわかりません。 法線と、RGBカラーとの関係については、次のように考えています。単位球は可能なすべての単位法線を表します。つまり、単位法線ベクトルのX、Y、Z成分は-1から1の範囲です。RGBカラーの成分はすべて0から255の範囲です。したがって、 -1(通常のコンポーネント)を0(カラーコンポーネント)、0から127または128、および1から255にマップします。その間の値はすべて線形補間されます。 このマッピングを任意の3Dオブジェクトの法線に適用すると、非常にカラフルな画像が得られますが、ほとんどが青色ではありません。たとえば、立方体の場合、6つの面すべてが異なるが均一な色になります。たとえば、法線が(1,0,0)の面は(255,128,128)、法線が(0,0、-1)の面は(128,128,0)のようになります。 ただし、何らかの理由で、私が見つけた立方体の法線マップは完全に青みがかっています(128、128、255)。しかし、明らかに、法線はすべて正のz方向ではありません(つまり、(0,0,1))。これはどのように作動しますか? [編集] さて、上記のアプローチは、オブジェクト空間法線マップまたはワールド空間法線マップと呼ばれるようです。もう1つは接線空間法線マップます。このような接線空間法線マップを使用してジオメトリの法線を変更する方法を理解していますが、実際にどのように計算されるかはまだわかりません(Nicol Bolasの回答の私のコメントを参照)。 [編集2] おそらく、区分的パラメトリックサーフェスを使用していることをお伝えしておきます。これらのサーフェスは一連のサーフェスパッチで構成され、各パッチは独自のパラメトリック空間(u、v)= [0,1] x [0,1]に関連付けられています。サーフェス上の任意のポイントで、法線を正確に計算できます。どうやら、ベクトルT(接線)とB(双接線)—接線空間をまたがるのに必要な—は、単にuとvの方向の表面パッチの偏導関数ではありません...

2
UDK:発射物ProcessTouchでのアクタータイプのチェック
つまり、簡単に言うと、ポーンが発射体に当たったとき(またはゲーム内の武器によって損傷したとき)に、ポーンをテレポートしようとしています。 現在、私は発射体のProcessTouchでPawn.SetLocationを呼び出そうとしています。ProcessTouchはポーンだけでなく任意のアクターを攻撃するため、これは問題です。さらに、ProcessTouchの「Actor Other」を確認しようとすると、エラーがスローされます。 私はたくさんの解決策を試しました(PawnコントローラークラスでイベントTakeDamageを作成することを含む)が、役に立ちませんでした。 simulated function ProcessTouch(Actor Other, Vector HitLocation, Vector HitNormal) { if (Other != Instigator) { //This is where the Other.TakeDamage goes if we are using a traditional gun. if (Other == Pawn); { Other.SetLocation(0,0,0); } } Destroy; } このコードは、Pawnが悪い表現であると文句を言います。ここで他にどのように俳優のタイプをチェックする必要がありますか?
10 udk 

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