1

我目前正在 Eclipse 中使用 Java 为 android 制作游戏。我在屏幕上一次移动多个精灵时遇到问题。这是一些代码,向您展示我到目前为止所做的事情。

这是游戏中线程的运行方法。它调用 onDraw 方法在屏幕上绘制精灵。它们都在扩展 SurfaceView 并实现 Runnable 的类中。

public void run() {
        long ticksPS = 1000 / FPS;
                long startTime;
                long sleepTime;
        while (running) {
        Canvas c = null;
        startTime = System.currentTimeMillis();
        try {
        c = getHolder().lockCanvas();
        synchronized (getHolder()) {
        onDraw(c);

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

}
        sleepTime = ticksPS-(System.currentTimeMillis() - startTime); 
        try {
               if (sleepTime > 0)
                      Thread.sleep(sleepTime);
               else
                      Thread.sleep(10);
        } catch (Exception e) {}
}

}

这里说的是onDraw方法。左下角和右下角有 2 个品格按钮,就像在节奏游戏中一样。而我想要做的是创建一个“badfret”,它将出现在顶部并向下移动。其中一些代码是从其他程序修补在一起的,有些是我自己的。

@Override
protected void onDraw(Canvas canvas) {
    canvas.drawColor(Color.CYAN);
    badguy = true;

if(badguy == true){
    if(switch_sides = true){
        badfret1.move(canvas,30,40);
        badfret1.update(canvas);
    }
    if(switch_sides = false){
        badfret2.move(canvas,500,40);
        badfret2.update(canvas);
    }
}



    fret1.update(canvas);
    fret2.update(canvas);
}

这是我认为最适合该问题的 badfretSprite 类的代码。badfretSprite 类继承自我制作的更高级别的 Sprite 类。

Bitmap bmp;
int xSpeed = 0;
int ySpeed = 5;

public badfretSprite(GameView gv, int x1, int y1) {
    super(gv, x1, y1);
    this.bmp = gv.getFret();
}

public void move(Canvas canvas,int xpos,int ypos) {
    x = xpos;
    y = ypos;
    x+=xSpeed;
    y+=ySpeed;
    canvas.drawBitmap(bmp, x,y, null);
    }

所以目前只有一个精灵在顶部创建并且不移动,我设法让它移动但只有一个这样做了。

请询问您是否希望看到任何其他方法或代码片段。

public void update(Canvas canvas) {
    move(canvas,xSpeed,ySpeed);
}
4

1 回答 1

2

没有必要更新 badFretSprites。

你也应该真正分开你的绘图和更新逻辑,游戏循环应该是这样的

    synchronized (getHolder()) {
        update();
        onDraw(c);
    }


    update(){
        for every object
            object.update()
    }

    onDraw(){
        for every object
            object.draw()
    }

所以你应该只在 update 方法中更新位置,只在 draw 方法中绘制,一旦你的应用程序变得更复杂,它会更容易管理、添加和调试。

于 2013-04-10T14:27:04.257 回答