6

私は答えを探していましたが、答えが見つからないようです(これは、Androidゲームをプログラミングするためのかなり型破りなアプローチなので、少なくとも予想されます)。

私はAndroidでGBAスタイルのRPGゲームを作成しようとしています(懐かしさのために)。OpenGLは、ゲームループで十分にカスタマイズできなかったため、私には十分ではありませんでした(このゲームの使用方法を非常に効率的にしたいので、描画する必要があるものがある場合にのみ描画を呼び出したいと思います)バッテリー。これは、ゲームというよりもポーリングアプリのように動作させることを意味します)。描画を行う必要があるときに呼び出される独自のスレッドを使用してカスタムサーフェスビューを作成しました(SDKのサンプルLunarLander androidゲームをモデルにしています)。

つまり、ゲーム自体を固定サイズ(208x160)にしてから、画面のサイズにスケールアップしたいのです。私が抱えている問題は、XMLの拡張SurfaceViewの通常のパラメーター内からそうすることがとにかくないように思われることです。現在の状態のゲームを以下に示します。画面の高さまで伸ばして幅の比率を維持しながら、表示可能なゲームに追加しないようにしています(画面サイズに関係なく固定したままにします)。

https://i.stack.imgur.com/EWIdE.png(実際の画像をインラインで投稿するつもりでした。スパム防止は私を噛む可能性があります>。<)

現在、SurfaceViewのキャンバスを取得して直接描画し、ハードコードされたピクセルサイズ(208px、160px)としてサイズを指定しています。

これは、キャンバスを取得して描画する際のスレッドの現在の外観です。ゲームが実質的に占めるサイズを変更せずにキャンバスに描画するためのより良い方法は何でしょうか?

@Override
    public void run()
    {
        Canvas c = null;
        try
        {
            c = surfaceHolder.lockCanvas(null);
            synchronized (surfaceHolder)
            {
                draw(c);
            }
        }
        catch (Exception e)
        {
            e.printStackTrace();
        }
        finally
        {
            if (c != null)
                surfaceHolder.unlockCanvasAndPost(c);
        }
    }

drawメソッドは次のとおりです(StringBuilderはエンジン内の私自身のコード化オブジェクトです):

public void draw(Canvas canvas)
{       
    canvas.drawColor(Color.GRAY);
    StringBuilder stringBuilder = new StringBuilder(canvas, Color.BLACK, letters);
    stringBuilder.drawString("Oh, hello there!");
    stringBuilder.setLocation(10, 20);
    stringBuilder.drawString("Why am I so small?");
}

何か案は?

4

2 に答える 2

5

draw関数の名前が代わりに変更されたと仮定しますdrawBase。これがあなたのやり方です:

public void draw(Canvas canvas)
{
    final float scaleFactor = Math.min( getWidth() / 208.f, getHeight() / 160.f );
    final float finalWidth = 208.f * scaleFactor;
    final float finalHeight = 160.f * scaleFactor;
    final float leftPadding = ( getWidth() - finalWidth ) / 2;
    final float topPadding =  ( getHeight() - finalHeight ) / 2;

    final int savedState = canvas.save();
    try {
        canvas.clipRect(leftPadding, topPadding, leftPadding + finalWidth, topPadding + finalHeight);

        canvas.translate(leftPadding, topPadding);
        canvas.scale(scaleFactor, scaleFactor);

        drawBase(canvas);
    } finally {
        canvas.restoreToCount(savedState);
    }
}
于 2012-05-22T18:45:50.903 に答える