1

私は主に Android アプリのプログラミングのインとアウトを学ぶための経験として使用している Android 用の 2-D ゲームを開発中です。現在、私のメイン アクティビティは、SurfaceView を拡張し、SurfaceHolder.Callback を実装するカスタム クラスをインスタンス化します。このビューは、ほとんどのロジックとすべてのグラフィックス処理を処理するスレッドをインスタンス化します (これには、キャンバスのインスタンス化と描画が含まれます)。

まあ、私は初心者なので、キャンバスを画面よりもはるかに大きくし、ユーザーがスクロールしてキャンバスのすべての部分を見ることができるように設計し始めたときは考えていませんでした...しかし、残念ながら、それは私がしたことです起こる必要があります。

これを行う簡単な方法があれば、私に知らせてください。

私の最善の推測は、キャンバスの実際の作成を ScrollView を拡張する別のクラスに入れ、何らかの方法ですべての Draw() をスレッドからそのキャンバスに呼び出すことです。これは可能ですか?私のクリックイベントは、実際にはメインアクティビティからキャプチャされます(参考までに)。

4

4 に答える 4

4

最良のオプションは、カメラを使用してキャンバスを移動することです。次のようにします。

// Creates a new camera object
Camera mCam = new Camera();
float startX;
float startY;

@Override
public void onTouch(MotionEvent event)
{
    if(event.getAction() == MotionEvent.ACTION_DOWN)
    {
        startX = event.getX();
        startY = event.getY();
    }
    else if(event.getAction() == MotionEvent.ACTION_MOVE)
    {
        float x = event.getX();
        float y = event.getY();

        // Lets you translate the camera by the difference
        mCam.translate(x -startX, startY - y, 0.f);
        startX = event.getX();
        startY = event.getY();
    }
}

@Override
public void onDraw(Canvas canvas)
{
    // Draw here the objects you want static in the background
    canvas.drawBitmap(mBackground, 0, 0, null);

    canvas.save();
    mCam.applyToCanvas();

    // Draw here the objects you want to move
    canvas.drawBitmap(mBall, 0, 0, null);

    canvas.restore();

    // Draw here the objects you want static on the forebround
    canvas.drawBitmap(mScore, 0, 0, null);
}

mBall を 0,0 で描画していますが、カメラの移動により、指定した量だけ移動することに注意してください。これが役立つことを願っています。楽しむ :)

于 2011-06-18T08:19:07.157 に答える
1

私はその問題について眠り、(自分でそう言わなければ)素晴らしい、比較的シンプルでエレガントな解決策を思いついた。自分のホーンを鳴らして申し訳ありませんが、私はこれを思い付くことができたことに文字通り恍惚としていました。

誰かがこの方法を使用することを考えているなら、これを良い選択にしたいくつかの条件があります。まず、すべてのオブジェクトは、setBounds(int、int、int、int)メソッドを使用して事前定義された場所を持つ描画可能オブジェクトであり、すべてのオブジェクトは、キャンバス上に描画する場所の独自の座標も格納し、すべてのオブジェクトはハッシュマップで呼び出されます。存在するすべてのオブジェクトを呼び出して処理します。

今、歌舞伎が何を言っているのか、巨大な帆布を描くのがいかに無駄なのか、そしてidがクリックイベントの問題にどのように遭遇するのかを考えていました。それが私がこれを思いついたときです。

画面の端の近くで画面タッチイベントが発生すると、カスタムメソッドScroll()が呼び出され、すべてのオブジェクトをループして、ユーザーがスクロールしようとしている方向に応じて、オブジェクトの場所の保存された座標を調整します。オブジェクトの位置をインクリメントした後、(並列に)xおよびyオフセットの変数のペアをインクリメントします。次に、このオフセットがタッチイベントの座標に考慮されるため、画面がスクロールされた位置に関係なく、タッチによってオブジェクトを選択できます。

次に、パフォーマンスのために、単純なifステートメントを使用して、オブジェクトの座標が画面の範囲内にある場合にのみ描画が呼び出されるようにします。

申し訳ありませんが、私は本当に驚き、これに感銘を受けました、ハハ。私は実際には約1か月しかコーディングしておらず、ほぼ完全に機能する2D戦略ゲームを持っています!

ダミーのためのJavaは報われました、笑。

于 2011-06-18T19:47:02.480 に答える
0

それは私が今まで自分で使った戦略ではありませんが、あなたはあなたのアプローチを試してみることができます。とにかく、そのアプローチでいくつかの問題が発生するのではないかと思います。ゲームですでにタッチを入力に使用している場合は、競合が発生します。また、パフォーマンスがまったく問題になる場合(特にアニメーションがある場合)、このアプローチを採用することは望ましくありません。

スレッド化を扱う場合は、おそらくパフォーマンスが重要になります。描画は高価であり、巨大なキャンバスを作成する場合は、すべてをレンダリングする必要があり、コストがかかります。画面に表示されているものだけを描画する必要があります(多かれ少なかれ)。申し訳ありませんが、おそらく「大規模なオーバーホール」が必要になります...

とはいえ、スクロールを扱うのはそれほど悪くはありません。あなたはおそらくあなたが描いているすべてのものの座標を持っています。あなたがする必要があるのはあなたの「現在の座標」を追跡しそしてあなたの現在のxとyによってあなたの図面xとyを翻訳することです。パフォーマンスに関することを扱うと、できることはたくさんありますが、それは少し話題から外れ始めています。詳細を知りたい場合は、これらのビデオをご覧ください。

http://www.youtube.com/watch?v=U4Bk5rmIpic

http://www.youtube.com/watch?v=7-62tRHLcHk

于 2011-06-18T04:01:49.710 に答える
0

横スクロール ゲームの簡単な方法は、世界をタイルに分割することです。各タイルには指定された量の領域があります。

于 2011-06-18T19:54:33.617 に答える