2017-01-26 22 views
0

私はminecraftクローンをプログラムしようとしています。 現状では私はちょっとした世界があり、私も周りを歩くことができますが、今私はティックの方法で立ち往生しています。 whileループのmainメソッドでこのtickメソッドを呼び出しています。tick()メソッドを呼び出す方法

mainメソッド内のループ中:

boolean closeRequested = false; 
while(!closeRequested){ 

    mc.tick(); 

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

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

ティック法:

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 
    } 

プレーヤーティック法:

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

}

私は次のようにこのメソッドを呼び出しますこれはプレーヤーのmovソニックのようなものでも、それがプレーヤーの動きの速さに依存します。

私はこのコードの一部をミニクラフトアルファ版から入手しましたが、tick()メソッドが呼び出されたポイントを見つけることができませんでした。

私はプレーヤーを一定の速度で動かしたいと思っています。

私はtimepassed、fps、またはティック(タイマーもオリジナルのミニクラフトコードからのものです)のようないくつかの変数を得ることができるタイマーを持っています。

+4

これは、一時停止することなく実行しています。したがって、 'tick '呼び出しはCPU/OSが許可するのと同じくらい速く行われます。編集:あなたは任意の方法でスレッドの休止/休止をしていない場合は、コードを追加する必要はありません;) – AxelH

+0

また、あなたのコードを構成することについては、 'はあなたの' main'メソッドの中にあります。 – CraigR8806

答えて

1

はあなたのコードにこれを追加します。

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 
} 

睡眠なしで()ループはあなたの問題を引き起こし、早くそれができるように実行されます。シンプルな方法でsleep()はループを再びカウントアップする前にそれをしばらく休ませます。

+1

もう一つのこと:あなたがゲームを構築することに熱心であれば、ハードコードされた50msの睡眠は本当に悪いスタイルです!何らかのゲームループを実装する必要があります。間違いなくhttp://www.java-gaming.org/index.php?topic=24220.0をチェックしてください。ゲーム開発の時間とフレーム管理のコンセプトを学び始めるでしょう! –

関連する問題