如何将canvas引用传递给类

时间:2013-04-26 05:55:11

标签: java android

我正在做一个简单的游戏,我有一个我称之为GameLoop的类,在run()方法中,代码将画布的引用传递给绘制圆的方法。这段代码只是一些测试代码。

我的问题是如果我想用圆圈创建几个精灵对象(类)并在游戏开始时将它们放入列表中,我如何传递画布的引用?我以前做过这个,但后来我在每个sprite对象中使用了bitmap并且只传递了图像的引用,但是在这种情况下我不知道怎么做,因为canvas在run()方法中,而且我想要在开头的一个方法中创建我的精灵对象,比如initializeGameObjects()。我希望我的问题不清楚!?提供一些帮助!谢谢!

// Game loop ---------------------------------------
@Override
public void run() {
    // TODO Auto-generated method stub

    while (gameRunning) {
        if (!surfaceHolder.getSurface().isValid())
            continue;

    canvas = surfaceHolder.lockCanvas();

    // Call method to draw objects on screen
    drawObjects(canvas);

    surfaceHolder.unlockCanvasAndPost(canvas);
    }
}
// End game loop ---------------------------------------

// Method that draw everything on canvas
private void drawObjects(Canvas canvas) {

    // Test
    paint = new Paint();
    paint.setAntiAlias(true);
    paint.setColor(Color.WHITE);

    // Clear screen with black color
    canvas.drawRGB(0, 0, 0);

    // Draw a circle
    canvas.drawCircle(100, 100, 100, paint);    
}

2 个答案:

答案 0 :(得分:1)

我会实现Runnable并构造一个Thread。这样,您可以使用“setup”方法,最终调用“start”方法。 “start”方法将在启动线程之前绘制到画布。

对于这种东西来说,这实际上是更好的做法。你可能想在开始一个线程之前初始化东西。

public class Game implements Runnable {
    private Thread thisThread = new Thread(this);
    private boolean gameRunning = false;

    public void startGame() {
       gameRunning = true;
       //Draw to canvas
       thisThread.start();
    }

    @Override
    public void run() {
        while(gameRunning) {
        //Draw other objects
        }
    }
}

答案 1 :(得分:1)

定义界面:

public interface Renderable{
    public void renderToCanvas(Canvas c);
} 

定义Renderables的列表:

private List<Renderable> sprites = new ArrayList<Renderable>();

创建添加/删除精灵的方法,确保它们已同步:

public synchronized void addSprite(Renderable r){
  sprites.add(r);
}

public synchronized void removeSprite(Renderable r){
  sprites.remove(r);
}

这是绘图方法,也是同步的,所以你最终不会同时绘制和修改精灵列表。这可以通过其他线程在循环中调用,也可以是视图的onDraw()方法:

public synchronized void draw(Canvas c){
  // lock canvas if needed

  // common drawing code

  for(Renderable r :sprites){
    r.renderToCanvas(c);
  }

  // release canvas if locked
}

现在,你可以自由定义任何类型的精灵,圆形,方形等等,

public class Circle implements Renderable{
  private Paint mPaint;
  private float mRadius;

  public Circle(Paint p, float r){
    mPaint = p;
    mRadius = r;
  }

  @Override
  public void renderToCanvas(Canvas c){
    c.drawCircle(100, 100, mRadius, mPaint);
  }
}

并将其添加到精灵列表:

addSprite(new Circle(new Paint(),20f));

注意:为了简单起见,我使用了synchronized,但是有更好的替代方法,比如原子旗。只有当你想在游戏循环运行时添加/删除精灵时才需要这些。 。如果在开始游戏循环之前设置所有精灵,这不是问题。