0

我一直在开发一个没有位图或任何东西的游戏,我使用矩形作为对象,并根据它们的目的改变它们的颜色,比如玩家的红色矩形和墙壁的灰色矩形。我的问题是用位图/图像替换矩形的正确方法是什么?

我知道加载位图你可以这样做:

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

我应该加载所有位图并将它们传递给他们的类,还是应该在他们的类中加载位图而不是传递它?以及我将如何做到这一点,因为我无法使用 BitmapFactory,因为我无法访问 getResources()!或者我应该从我的资产文件夹中加载我的位图/图像,我知道我不会有相同的“工具”,你可以说会弄乱位图。

主要活动

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 回答