0

私はビットマップなどのないゲームに取り組んでいます。オブジェクトとして長方形を使用し、プレーヤー用の赤い長方形や壁用の灰色の長方形など、目的に応じて色を変更しています。私の質問は、長方形をビットマップ/画像に置き換える正しい方法は何ですか?

私はあなたがこれをすることができるビットマップをロードすることを知っています:

Bitmap randomBitmap = BitmapFactory.decodeResource(getResources(),
com.example.android4gametest.R.drawable.ic_launcher);

すべてのビットマップをロードしてクラスに渡す必要がありますか、それともビットマップを渡す代わりにクラス内にロードする必要がありますか?getResources()にアクセスできないため、BitmapFactoryを使用できないため、どうすればよいでしょうか。または、ビットマップを混乱させるために言うことができるのと同じ「ツール」がないことがわかっているアセットフォルダからビットマップ/画像をロードする必要があります。

主な活動

public class MainActivity extends Activity {
Game theGame;
@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);

    requestWindowFeature(Window.FEATURE_NO_TITLE);
    getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN,
    WindowManager.LayoutParams.FLAG_FULLSCREEN);

    setContentView(new Game(this));
}
}

ゲームパネルのパブリッククラスGameはSurfaceViewを拡張し、SurfaceHolder.Callbackを実装します{

GameThread _thread;

public Game(Context context) {
    super(context);

    getHolder().addCallback(this);

    setFocusable(true);

    _thread = new GameThread(getHolder(), this);


}

public void surfaceChanged(SurfaceHolder holder, int format, int width,
        int height) {
    // TODO Auto-generated method stub

}

public void surfaceCreated(SurfaceHolder holder) {
    _thread.setRunning(true);
    _thread.start();

}

public void surfaceDestroyed(SurfaceHolder holder) {
    // TODO Auto-generated method stub

}

@Override
protected void onDraw(Canvas canvas) {
    Log.d("OnDraw", "it is Drawing");
    canvas.drawColor(Color.BLUE);
}

public void update() {
    // TODO Auto-generated method stub  
}
}

GameLoopここには何もありません

    public class GameThread extends Thread{
/*FPS Code*/
private final static int MAX_FPS = 30;
private static final int FRAME_PERIOD = 1000/MAX_FPS;




protected SurfaceHolder holder;
protected Game game;
private boolean isRunning = false;

public GameThread(SurfaceHolder _holder, Game _game) {
    this.holder = _holder;
    this.game = _game;
}



/**
 * Returns True if the game is still running and False if the game is over
 * @return
 */
public boolean isRunning() {
    return isRunning;
}
/**
 * Set to true for the game loop to start 
 * @param isRunning
 */
public void setRunning(boolean isRunning) {
    this.isRunning = isRunning;
}


@Override
public void run() {
    Canvas c;
    Log.d("Pallyways", "Starting game Loop");

    long beingTime;
    long timeDiff;
    int sleepTime;
    int framesSkipped;

    sleepTime = 0;

    while(isRunning){
        c = null;
        try{

            c = holder.lockCanvas();
            synchronized(holder){
                beingTime = System.currentTimeMillis();
                framesSkipped = 0;
                game.update();//Update
                game.onDraw(c);//Redraw

                timeDiff = System.currentTimeMillis() - beingTime ;
                sleepTime = (int) (FRAME_PERIOD - timeDiff);

                if(sleepTime>0){
                    try{
                        Thread.sleep(sleepTime);} 
                    catch (InterruptedException e) {
                        e.printStackTrace();}
                    finally{}
                }

                while(sleepTime<0 && framesSkipped < 5){
                    game.update();

                    sleepTime+= FRAME_PERIOD;
                    framesSkipped++;
                }

            }
        }finally{if(c!=null){
            holder.unlockCanvasAndPost(c);
        }
        }
    }
}

}

ヒーロークラスまだ始めていませんが、別のパッケージにあるクラスにビットマップをロードする方法を知りたいです

package com.example.android4gametest.Actors;

import android.graphics.Bitmap;
import android.graphics.BitmapFactory;

import com.example.android4gametest.R;

public class Hero {
//getContext() gives me an error and that is because it does not have a reference

private Bitmap hero = BitmapFactory.decodeResource(getContext().getResources(),
R.drawable.ic_launcher);
public Hero(){

}}
4

4 に答える 4

1

Bitmapゲームオブジェクトのコンストラクターにをロードしないでください。それらのいずれかがBitmaps複数のオブジェクト(つまり、敵のクラス)によって使用される場合、それらをオブジェクトのコンストラクターにロードするとBitmap、メモリ内に複数のコピーが作成されます。これはにつながる可能性がありOutOfMemoryExceptionます。Bitmap代わりに、コンストラクターの外部(ゲームスレッドまたはゲームパネル)をロードしてから、Bitmapオブジェクトをコンストラクターまたはセッターに渡し、プライベートBitmapsをそのように設定します。限られた数のBitmapsメモリを保持するだけで済みます。

また、ロード中にプログレスバーまたはスピナーを表示するロード「画面」を検討することもできますBitmaps

于 2012-10-23T01:47:02.050 に答える
1

ビットマップのサイズ/数によっては、Game クラスのコンストラクターにロードしても問題ない場合があります。ただし、一度にメモリにロードするビットマップが多すぎる/大きすぎる場合は、最初の描画呼び出しが行われたときに OOM エラーが発生したり、遅延が発生したりする可能性があることに注意してください。ビットマップが不要になったときに、ビットマップを効率的にヌル化し、リサイクルしていることを確認する必要があります。私の最初のゲームでこの問題に苦労しました

于 2012-10-22T23:30:47.693 に答える
0

しない!動的オブジェクトを使用してください..つまり、ゲームで動的オブジェクトをまったく作成しないでください。これらはGCをトリガーし、必要なときにいつでも実行中にすべてをスタッターにします。自分ですべてを制御し、静的/最終的な「オブジェクト」と配列を障害物と敵に使用する必要があります。オブジェクトは起動時にヒープに読み込まれます。つまり、アプリがシャットダウンされるまでオブジェクトが読み込まれます。したがって、これらの静的オブジェクトに含まれるものと含まれないもののバランスを見つける必要がありますが、それが見つかった場合は簡単です。

ビットマップはこれらの静的で非動的なオブジェクトの外にロードする必要があり、オブジェクトは計算のみを行う必要があります。

c = holder.lockCanvas(); の間に不要な計算、ループ、または Thread.sleep を使用しないでください。および holder.unlockCanvasAndPost(c); コードで行っているように。これにより、最終的にゲームがちらつく可能性があります。

よろしく、私

于 2013-02-05T09:41:05.720 に答える
0

ロードする場所は重要ではありません。あなたの主な問題はリソースへのアクセスだと思います。ビューでは、次を呼び出すことができます。

getContext().getResources()

編集:

そのため、Hero のコンストラクターのメソッド シグネチャに Context をパラメーターとして追加します。

public Hero(Context context){
  private Bitmap hero = BitmapFactory.decodeResource(context.getResources(), R.drawable.ic_launcher);
}
于 2012-10-22T23:01:46.020 に答える