回答:
まあ、彼らは確かにUIScrollViewのようなものを使用していません。カメラを静止した世界の上に移動するか、静止したカメラの下で世界を移動します。私のGLは少し錆びていますが、すべての描画の前に新しい変換マトリックスをプッシュするだけでしょう。
実際のドラッグ部分については、自分で実装することもできます。これはおそらく、「ドラッグ」または「クリック」であるかどうかを確認するために、特定の時間内に一定量のカーソル/指の動きのデルタがあったかどうかを確認するためのものです。または、ユーザーがUI要素などをクリックしない限り、常にドラッグすることもできます。それは、システムをどのように機能させるかという設計に本当に依存します。
スクローラーは、スクロールする方向から新しいタイル/オブジェクトを押し出す「仮想ビューポート」という非常にシンプルなものです。
これを確認する簡単な例は、単純な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
それは長い説明でした。ここで私のポイントを理解していますか、それともさらに説明が必要ですか?
スクロールは、必ずしもすべてをメモリにロードすることを意味するわけではありません。これに対処する通常の方法は、コンテンツをタイルに分割して、必要に応じてメモリにロードすることです。アップルのhttp://developer.apple.com/library/ios/#samplecode/ScrollViewSuite/Introduction/Intro.htmlに大きな画像を表示する例があります。
ただし、ゲームは他のことをする傾向があります。以前の手法を使用することが可能であっても、ディスクからのデータのロードは遅く、ユーザーのゲーム体験を妨害する可能性があります。このため、スクロールする領域は通常、後で再利用できるように細かく分割されており、全世界が実際にメモリに収まりきらないほど大きいと感じています。
Tiled Map Editorなどのマップエディターを使用してタイルの詳細を学び、ネットを検索して、タイルの使用方法/ゲームへの統合方法に関するチュートリアルを探すことができます。Diabloのようなゲームは、論理的に大きなタイルに分割され、一緒に接着されたタイルマップを使用して、さまざまなゲームごとに巨大な疑似ランダムマップを作成することが知られています。
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でゲームを作成する場合にのみ当てはまります。
このチュートリアルを参照してください:-http: //www.raywenderlich.com/2343/how-to-drag-and-drop-sprites-with-cocos2d
このチュートリアルには、ビューをスクロールする方法とuipanrecogniserを使用する方法が含まれています。
これは役立ちます。