适用于Android的Java中的多个移动精灵

时间:2013-04-10 13:53:58

标签: java android eclipse

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

这是游戏中线程的run方法。它调用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个音柱按钮,就像节奏游戏一样。我想要做的是创造一个“坏蛋”,它将出现在顶部并向下移动。其中一些代码是从其他程序中修补的,有些代码是我自己的。

@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);
}

1 个答案:

答案 0 :(得分:2)

没有必要更新badFretSprites。

此外,您应该将绘图和更新逻辑分开,游戏循环应该如下所示

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


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

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

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