1

私は現在、トップダウンの視点で単純なシューティングゲームを書こうとしています。SurfaceView と Canvas を使用して画面にグラフィックを描画していますが、「カメラ」をスクロール可能にする方法がわかりません。プレイヤー キャラクターは常に画面の中央にあり、カメラ (本質的には SurfaceView のキャンバス) は常に彼を追いかけているはずです (たとえば、Alien Swarm のように)。しかし、それを定期的に行う方法がわかりません。私が現在行っている方法は、プレイヤーの入力に従ってゲーム世界の他のすべてのオブジェクトを移動し、それらの座標がたまたま画面上にある場合はそれらを描画することです。プレイヤーは常に同じ座標に留まります。SurfaceView 自体を実際に移動 (スクロール) する方法はありますか? Scroll ウィジェットとメソッド SurfaceView を見ました。scrollBy(int x, int y) ですが、これらのいずれかを実装しようとすると強制的に閉じます。どんな助けでも大歓迎です、事前に感謝します!

PS ただのメモ - このプロジェクトでオープン GL を使用することに興味はありません。

4

2 に答える 2

2

キリルがコメントで指摘したように、上記の答えは正しくありません。シンプルなスクロール カメラを実現するには、次のことが必要です。

  1. キャンバスをプレイヤー位置の逆座標に変換します
  2. 背景を描く
  3. (0,0) に戻す
  4. 選手を描く

だから、それをコードに入れるには

//Translate to -playerX, -playerY and draw the background
canvas.translate(-playerX, -playerY);
background.draw();

//Translate back to 0,0 and draw the player
canvas.translate(playerX, playerY);
player.draw();

このようにして、プレーヤーは常に画面上の同じ位置にとどまり、背景がその背後で移動するのがわかります。

注意すべきことの 1 つは、canvas.translate(x,y) がキャンバスを座標 (x,y) に変換しないことです。指定した距離だけ移動します。これは、最初は混乱する可能性があります。

例 :

  1. あなたは (0,0) にいます
  2. canvas.translate(2,3) を呼び出します
  3. canvas.translate(-1,-1) を呼び出します
  4. あなたは今 (1, 2) にいます
于 2012-11-02T15:41:22.577 に答える
1

Translation を使用して、描画した後に画面のコンテンツをスライドできます。文字を真ん中に残す場合は、次のようなコードを記述します。

draw_the_screen();
canvas.translate(x,y);
draw_the_avatar();

翻訳すると、それまでのすべてが翻訳されます。アバターを描画すると、移動 (スライド) が既に行われており、描画した場所 (つまり、画面の中央) に配置されます。

お役に立てれば。

于 2010-09-25T02:42:12.447 に答える