2015-05-25 6 views
0

Я пытаюсь воссоздать Space Invaders в LibGDX, чтобы получить доступ к разработке игр, но когда я пытаюсь установить каждого врага (теперь это всего лишь квадраты), чтобы двигаться последовательно, метод update() заставляет их изменять способ их публикации слишком быстро. Есть ли способ замедлить этот рендеринг на весь проект или любой другой правильный способ его решения? Я также пытался обрабатывать движение в классе Timer и scheulde, но это вызвало перегрузку памяти, и потоки не запускались в одно и то же время для каждого объекта.LibGDX - Как замедлить метод update()?

package regularmikey.objects; 

    import java.util.Timer; 
    import java.util.TimerTask; 

    import com.badlogic.gdx.graphics.glutils.ShapeRenderer; 
    import com.badlogic.gdx.graphics.glutils.ShapeRenderer.ShapeType; 

    public class Aliens { 

public float x; 
public float y; 
public float fx; 
public float fy; 
public int step_count = 0; 

public Aliens(float x, float y) { 
    this.fx = this.x = x; 
    this.fy = this.y = y; 


}; 


public void update(float dt){ 

    if(step_count == 10) { 
     step_count = 0; 
     y = y - 1; 
     x = fx; 

    } 
    x = x + 3; 
    step_count++; 
}; 

PlayState класс

package regularmikey.gamestates; 

import java.util.ArrayList; 

import com.badlogic.gdx.graphics.glutils.ShapeRenderer; 

import regularmikey.managers.GameStateManager; 
import regularmikey.objects.Aliens; 
import regularmikey.objects.Bullet; 
import regularmikey.objects.Player; 

public class PlayState extends GameState { 

private Player player; 
private ArrayList<Bullet> bullets; 
private ArrayList<Aliens> aliens; 
private ShapeRenderer sr; 

public PlayState(GameStateManager gsm) { 

    super(gsm); 

} 

@Override 
public void init() { 
    sr = new ShapeRenderer(); 
    bullets = new ArrayList<Bullet>(); 
    aliens = new ArrayList<Aliens>(); 
    player = new Player(bullets); 
    spawnAliens(); 




} 

@Override 
public void update(float dt) { 
    player.update(dt); 

    for(int i = 0; i < aliens.size(); i++) { 
     aliens.get(i).update(dt); 
    } 



} 

public void spawnAliens() { 
    aliens.clear(); 



    float i, j; 



    for(j = 100; j <= 510; j = j + 45) { 
     for(i = 250; i <= 445; i = i + 45) { 

      aliens.add(new Aliens(j, i)); 
     } 

    } 




} 

@Override 
public void draw() { 
    player.draw(sr); 



    for(int i = 0; i < aliens.size(); i++) { 
     aliens.get(i).draw(sr); 

    } 



} 

@Override 
public void handleinput() { 
    // TODO Auto-generated method stub 

} 

@Override 
public void dispose() { 
    // TODO Auto-generated method stub 

} 
} 


public void draw(ShapeRenderer sr) { 
    sr.setColor(1, 1, 1, 1); 
    sr.begin(ShapeType.Line); 
    sr.rect(x, y, 30, 30); 
    sr.end(); 


}; 


} 

ответ

3

Ключевым моментом здесь является dt переменная, которая передается вместе с update() методом, который является коротким для Delta Time.

Delta time является часто используемым фактором в разработке игр, который представляет время, прошедшее с момента последнего кадра.

Я не могу точно понять, как вы делаете ваши инопланетяне передвигаться, но обычным способом, чтобы сделать объекты в вашей игре двигаться плавно (независимо от частоты кадров):

void update(float deltaTime){ 
    this.position = currentPosition + (this.movementSpeed × deltaTime); 
} 

Это Безразлично не учитывайте направление, в котором движется сущность, среди прочих. Но это не относится к этому примеру.

Таким образом, в вашем случае, вы могли бы так что-то вроде этого:

package regularmikey.objects; 

    import java.util.Timer; 
    import java.util.TimerTask; 

    import com.badlogic.gdx.graphics.glutils.ShapeRenderer; 
    import com.badlogic.gdx.graphics.glutils.ShapeRenderer.ShapeType; 

    public class Aliens { 

public float x; 
public float y; 
public float fx; 
public float fy; 
public int step_count = 0; 

private float moveTimer; 
private float moveTreshold; 

public Aliens(float x, float y) { 
    this.fx = this.x = x; 
    this.fy = this.y = y; 

    moveTimer = 0; // This will act as a stopwatch 
    moveTreshold = 3000; // Alien will move once it passes this treshold 
}; 


public void update(float dt){ 
    // check whether we passed the treshold for moving or not 
    if(moveTimer += dt; > moveTreshold){ 
     if(step_count == 10) { 
      step_count = 0; 
      y = y - 1; 
      x = fx; 

     } 
     x = x + 3; 
     step_count++; 

     moveTimer = 0; // reset the timer 
    } 
}; 
+0

Спасибо! Это то, что я хотел. –

Смежные вопросы