2013-07-30 32 views
3

所以,我試圖在LWJGL中製作遊戲,它似乎對我來說工作得很好。雖然,我遇到了一些將我的實體移動到屏幕上的問題。我想以相同的速度從一個點到另一個點。另外,我正在根據實體正在移動的方向來動畫我的精靈。Java遊戲 - 處理線性移動

但是!我有一些問題:

1#它會閃爍,因爲該運動被定義爲一個修飾符:delta(以使得由FPS定義的平滑運動)。事實上,它從來沒有真正達到它的目的(因爲它重新計算並且從未達到該位置)。我該如何解決這個問題?

2#當兩個玩家加入同一臺服務器時,我在最快的計算機上的角色運行得更快。我認爲這是因爲FPS,如何解決?

private String name; 
private float positionx,positiony; // Current 
private int targetx,targety; // Target 
private int dx, dy; // Direction 
private int pointx, pointy; // Direction 
private float speed; 
private Sprite sprite; 

public Entity(String name, int positionx, int positiony, Sprite sprite){ 
    this.name = name; 
    this.speed = 0.1f; 
    this.positionx = 720; 
    this.positiony = 450; 
    this.targetx = 1000; // fix this 
    this.targety = 10; // this for testing. 
    this.sprite = sprite; 
    this.dx = 0; 
    this.dy = 0; 
} 
//double distance = Math.sqrt((vx * vx) + (vy * vy)); 
public void move(long delta){ 
    if(positionx < targetx){ 
     dx = 1; 
     pointx = 1; 
    }else if(positionx > targetx){ 
     dx = -1; 
     pointx = -1; 
    }else{ 
     dx = 0; 
    } 

    if(positiony < targety){ 
     dy = 1; 
     pointy = 1; 
    }else if(positiony > targety){ 
     dy = -1; 
     pointy = -1; 
    }else{ 
     dy = 0; 
    } 


    //Set animations: 
    if(positionx==targetx && positiony==targety){ 
     if(pointx<0){ 
      sprite.setAnimation(5, 2, 100); // Standing left 
     }else if(pointx>0){ 
      sprite.setAnimation(6, 2, 100); // Standing right 
     }else if(pointy<0){ 
      sprite.setAnimation(7, 2, 100); // Standing up 
     }else if(pointy>0){ 
      sprite.setAnimation(4, 2, 100); // Standing down 
     } 
    }else{ 
     if(pointx<0){ 
      sprite.setAnimation(1, 2, 100); // Walking left 
     }else if(pointx>0){ 
      sprite.setAnimation(2, 2, 100); // Walking right 
     }else if(pointy<0){ 
      sprite.setAnimation(3, 2, 100); // Walking up 
     }else if(pointy>0){ 
      sprite.setAnimation(0, 2, 100); // Walking down 
     } 
    } 
    //movement here. 
    positionx += dx*delta*speed; 
    positiony += dy*delta*speed; 

    System.out.println(dx*delta*speed); 

    sprite.setPosition((int)positionx, (int)positiony); 
} 

回答

2

1#它閃爍因爲運動被定義的改性劑:增量(以使由FPS定義平滑運動)。事實上,它從來沒有真正達到它的目的(因爲它重新計算並且從未達到該位置)。我該如何解決這個問題?

如果您存儲它移動的點A和點B,您可以設置一個時間間隔。每個時間間隔都會設定一段距離,如果在一次迭代中物體太遠,您可以爲B點設置座標。這可以通過計時器輕鬆完成。這樣,在一段時間之後,它會在你指定的位置。

2#當兩個玩家加入同一個服務器時,我在最快的計算機上的角色運行得更快。我認爲這是因爲FPS,如何解決?

如果您使用計時器,與問題#1相同的答案。每個玩家將以相同的速度移動(因爲每個玩家的經過時間相同)。

底線:
fps是可變的,而經過的時間對每個人都是一樣的。

+0

對不起,我不是說FPS。 Delta是最後一幀的渲染時間,我用作修改器。渲染最後一幀的時間越長,增量越大,因此移動的時間越長。這不會像定時器一樣好嗎?否則,我不能準確地看到如何使用定時器,而不會使其閃爍更多(每幀1000/60 = 16毫秒,並且如果定時器每隔50毫秒移動一次,它將閃爍)。 我執行:

 \t \t if(Math.abs(positionx-targetx)<=2){ \t \t \t positionx=targetx; \t \t } \t \t if(Math.abs(positiony-targety)<=2){ \t \t \t positiony=targety; \t \t } 
Deenis

+0

..哪個解決了閃爍,但現在能解決我的網絡問題? – Deenis

+0

如果你有一箇中央服務器,讓服務器處理移動並讓玩家發送他們當前的方向。如果一個計時器用於移動,具有更快cpu的玩家不應該能夠移動得更快,這僅僅是因爲所有玩家在移動之間具有相同的計時器間隔。 – bas