2017-01-26 20 views
0

Ich versuche einen Minecraft Klon zu programmieren. Im aktuellen Zustand habe ich eine kleine Welt und ich kann auch herumlaufen, aber jetzt bin ich mit der Tick-Methode fest. Ich rufe diese Tick-Methode in der Hauptmethode in der while-Schleife auf.So rufen Sie die tick() Methode auf

Während in der Methode main loop:

boolean closeRequested = false; 
while(!closeRequested){ 

    mc.tick(); 

    if(Keyboard.isKeyDown(Keyboard.KEY_ESCAPE)){ 
     closeRequested = true; 
    } 

    if(Display.isCloseRequested()){ 
     closeRequested = true; 
    } 

Tick Methode:

public void tick() 
    { 
    while (Keyboard.next()) { 
     if (Keyboard.getEventKeyState()) 
     { 
     if (Keyboard.getEventKey() == 28) { 
      Minecraft.level.save(); 
     } 
     if (Keyboard.getEventKey() == 2) { 
      this.paintTexture = 1; 
     } 
     if (Keyboard.getEventKey() == 3) { 
      this.paintTexture = 3; 
     } 
     if (Keyboard.getEventKey() == 4) { 
      this.paintTexture = 4; 
     } 
     if (Keyboard.getEventKey() == 5) { 
      this.paintTexture = 5; 
     } 
     if (Keyboard.getEventKey() == 7) { 
      this.paintTexture = 6; 
     } 
     } 
    } 
    Minecraft.level.tick(); 
    Minecraft.particleEngine.tick(); 
    Minecraft.player.tick(); //This is the movement 
    } 

Spieler Tick Methode:

public void tick() 
{ 
this.xo = this.x; 
this.yo = this.y; 
this.zo = this.z; 
float xa = 0.0F; 
float ya = 0.0F; 
if (Keyboard.isKeyDown(19)) { 
    resetPos(); 
} 
if ((Keyboard.isKeyDown(200)) || (Keyboard.isKeyDown(17))) { 
    ya -= 1.0F; 
} 
if ((Keyboard.isKeyDown(208)) || (Keyboard.isKeyDown(31))) { 
    ya += 1.0F; 
} 
if ((Keyboard.isKeyDown(203)) || (Keyboard.isKeyDown(30))) { 
    xa -= 1.0F; 
} 
if ((Keyboard.isKeyDown(205)) || (Keyboard.isKeyDown(32))) { 
    xa += 1.0F; 
} 
if ((Keyboard.isKeyDown(57)) || (Keyboard.isKeyDown(219))) { 
    if (this.onGround) { 
    this.yd = 0.5F; 
    } 
} 
moveRelative(xa, ya, this.onGround ? 0.1F : 0.02F); 

this.yd = ((float)(this.yd - 0.08D)); 
move(this.xd, this.yd, this.zd); 
this.xd *= 0.91F; 
this.yd *= 0.98F; 
this.zd *= 0.91F; 
if (this.onGround) 
{ 
    this.xd *= 0.7F; 
    this.zd *= 0.7F; 
} 

}

Als ich diese Methode aufrufen, wie das der Spieler mov Es ist wie Sonic und auch abhängig von den fps, wie schnell der Spieler bewegt.

Ich habe etwas von diesem Code von einer Minecraft-Alpha-Version, aber ich konnte nicht den Punkt finden, wo die tick()-Methode aufgerufen wird.

Ich möchte den Spieler in einer konstanten Geschwindigkeit bewegen.

Ich habe auch einen Timer, wo ich einige Variablen wie timepasse, fps oder auch die Ticks bekommen kann (der Timer ist auch aus dem ursprünglichen Minecraft-Code).

+4

Nun, Sie laufen das ohne Pause. So werden die 'Tick'-Aufrufe so schnell ausgeführt, wie es die CPU/OS erlaubt. BEARBEITEN: Wenn Sie in irgendeiner Methode keinen Schlaf/Pause des Threads machen, müssen Sie keinen Code mehr hinzufügen;) – AxelH

+0

Außerdem sollten Sie wirklich darüber nachdenken, Ihren Code etwas besser zu strukturieren, wenn Sie 'while-loop 'ist nur in Ihrer' Hauptmethode '. – CraigR8806

Antwort

1

Fügen Sie diese auf Ihren Code:

while(!closeRequested){ 
    mc.tick(); 
    //do stuff here that runs every 20 times in a second 
    Thread.sleep(50); //Sleep for 50 milliseconds, which is default minecraft gametick 
} 

Ohne den sleep() wird die Schleife so schnell wie möglich ausgeführt werden, wodurch das Problem von Ihnen. Auf einfache Weise wird sleep() es für einen Moment ruhen lassen, bevor die Schleife erneut gezählt wird.

+1

Noch eine Sache: Wenn Sie daran interessiert sind, ein Spiel zu bauen, ist ein hart codierter 50-ms-Schlaf wirklich ein schlechter Stil! Sie müssten eine Art Game-Loop implementieren. Schaut euch auf jeden Fall http://www.java-gaming.org/index.php?topic=24220.0 an, um mit den Konzepten des Zeit- und Rahmenmanagements in der Spieleentwicklung anzufangen! –

Verwandte Themen