我正在做一个简单的游戏,我有一个我称之为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);
}
答案 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
,但是有更好的替代方法,比如原子旗。只有当你想在游戏循环运行时添加/删除精灵时才需要这些。 。如果在开始游戏循环之前设置所有精灵,这不是问题。