我目前正在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);
}
答案 0 :(得分:2)
没有必要更新badFretSprites。
此外,您应该将绘图和更新逻辑分开,游戏循环应该如下所示
synchronized (getHolder()) {
update();
onDraw(c);
}
update(){
for every object
object.update()
}
onDraw(){
for every object
object.draw()
}
所以你应该只更新update方法中的位置,只绘制draw方法,一旦你的app变得更复杂,它就会更容易管理,添加和调试。