スクロールでゲームを作成するには?


7

シティストーリーファームのようなゲームでは、スクロールをどのように実装しますか?

  1. UIScrollViewを使用してスクロールするには、EAGLViewのサイズを大きくする必要があります。これらのゲームでは、EAGLViewのサイズは1024 * 1024を超えています。ただし、iphoneデバイスのビューポートサイズには制限があります(3G iphoneの最大値は1024)。

  2. 私はそれらがうまく機能している3G iphoneでそれらのゲームをプレイしました。

  3. 彼らがスクロールメカニズムをどのように実装したか考えていますか?

回答:


4

まあ、彼らは確かにUIScrollViewのようなものを使用していません。カメラを静止した世界の上に移動するか、静止したカメラの下で世界を移動します。私のGLは少し錆びていますが、すべての描画の前に新しい変換マトリックスをプッシュするだけでしょう。

実際のドラッグ部分については、自分で実装することもできます。これはおそらく、「ドラッグ」または「クリック」であるかどうかを確認するために、特定の時間内に一定量のカーソル/指の動きのデルタがあったかどうかを確認するためのものです。または、ユーザーがUI要素などをクリックしない限り、常にドラッグすることもできます。それは、システムをどのように機能させるかという設計に本当に依存します。


彼らがOpengGL翻訳を使用していると思っていても...
Shetty SP

それはそれを作ることの問題ですので、あなたが世界の端に到達するときにハードクランプをしないでください。カメラを動かすことができれば、バウンスを模倣する方法を見つけることができます。
Tetrad 2010

4

スクローラーは、スクロールする方向から新しいタイル/オブジェクトを押し出す「仮想ビューポート」という非常にシンプルなものです。

これを確認する簡単な例は、単純な1行のマーキー(textscroller)を作成することです。

例として、20文字/文字/文字の行があるとします。

次のように文字列/配列に配置します。

String viewport = "....................";
String text = "Hello World (how original!)";

これを印刷すると、「ドット」のみが表示されます。

Console.WriteLine(viewport);

スクロールするには、ドットを左に移動する必要があります。これで、入ってくるテキストを読むことができます。

これを行うには、左から最初の文字を削除し、右から次の文字を追加します。

だから私たちは言う:

viewport = viewport.Substring(2);

2番目の文字を受け取り、それ以降のビューポートの現在のコンテンツと同じになるように転送します。

これで、ビューポートは1文字/ナロー文字になるため、スクローラーから次の文字を追加する必要があります。したがって、スクロールテキストのどこにいるかを制御するための変数が必要です。

// place this outside your scroll loop
int scrollPos =0;

このインデックスで、次の文字を見つけることができます。

char next = text.substring(scrollPos,1);

次に、これをビューポートに追加します。

viewport += next;

そして、スクロールテキストであなたの位置を増やします。

scrollPos++;

内容を1文字左にスクロールしました。

これを繰り返し続けると、「Hello World」がビューポートをスクロールしているように見えます。

今、このトリックをあらゆる方向に想像してみてください。文字の代わりに、独自の「タイル」を使用します。次に、スムーズにするために、スクローラー内に「ピクセルスクロール」を追加するか、単純にするためにscrollposを複数追加します。次に、次に追加するタイルを特定する必要がある場合は、現在のscrollposをタイル幅で分割するだけで、ビューポートのスクロールコンテンツを任意の方向に移動する必要があるかどうかがわかります。

(タイル/ブロックデータを含む)配列をスクロールする必要がある場合は、単純なforループで実行できます。

左スクロール

for (int pos=0;pos<viewwidth;pos++)
{
    tilemap[pos] = tilemap[pos+1];
}

tilemap[width] = newTile; // from maparray.

ふew

それは長い説明でした。ここで私のポイントを理解していますか、それともさらに説明が必要ですか?


ビューポート/カメラの概念を示す良い方法は、将来の説明で使用する= D
DFectuoso

1
いい説明...それは彼らがビューのサイズを修正していて、スクロールを表示するために翻訳を使用していることを意味します。
Chandan Shetty SP

私はこれを発明しませんでした。私は昔のCommodore 64日間(64ビットRAMの8ビット)の時代から戻ってきたので、難しい方法で学びました。豪華なビューポートやGUIはなかったので、スクロールを行うための何らかの方法を開発する必要がありました。スーパーマリオや他の多くの多くの古いタイルベースのゲームでも同じです。ただし、3Dベクターゲームにも使用できます。「タイル」は少しだけ異なります。この3d.d9.dk/biplane/?test-scrollerを
BerggreenDK

いずれかのボタンの「ビュー」を変更するだけで、地平線に追加されている「タイル」を確認できます。また、カンポスを飛行機の正面に変更すると、それらが飛行機の後方で削除されるのを確認できます。
BerggreenDK 2010

2

スクロールは、必ずしもすべてをメモリにロードすることを意味するわけではありません。これに対処する通常の方法は、コンテンツをタイルに分割して、必要に応じてメモリにロードすることです。アップルのhttp://developer.apple.com/library/ios/#samplecode/ScrollViewSuite/Introduction/Intro.htmlに大きな画像を表示する例があります。

ただし、ゲームは他のことをする傾向があります。以前の手法を使用することが可能であっても、ディスクからのデータのロードは遅く、ユーザーのゲーム体験を妨害する可能性があります。このため、スクロールする領域は通常、後で再利用できるように細かく分割されており、全世界が実際にメモリに収まりきらないほど大きいと感じています。

Tiled Map Editorなどのマップエディターを使用してタイルの詳細を学び、ネットを検索して、タイルの使用方法/ゲームへの統合方法に関するチュートリアルを探すことができます。Diabloのようなゲームは、論理的に大きなタイルに分割され、一緒に接着されたタイルマップを使用して、さまざまなゲームごとに巨大な疑似ランダムマップを作成することが知られています。


0

2Dゲームのスクロールを実装するもう1つの方法は、投影マトリックスを操作して、画面/カメラがゲームの世界のどこにあるかを反映させることです。

私が行ったのは、位置と表示可能領域の幅/高さを持つ2Dカメラクラスを実装することでした。次に、ゲームワールドを描画する前に、オルソ投影行列を設定しました。

例えば

float left = camera->X - (camera->Width / 2.0f);
float bottom = camera->Y - (camera->Height / 2.0f);
float right = left + camera->Width;
float top = bottom + camera->Height;

glMatrixMode(GL_PROJECTION);
glLoadIdentity();

glOrthof(left, right, bottom, top, -50.0f, 1.0f);

これがお役に立てば幸いです。ああ、あとでUI要素を描画したい場合は、投影行列を別のものにリセットします。

もちろん、これはすべて、openGLでゲームを作成する場合にのみ当てはまります。


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