2015-11-04 3 views
0

У меня есть массив препятствий (Array из Vector2 объектов), которые перемещаются с правой стороны экрана влево так в каждом вызове render() функции я уменьшаю их рентгеновскую позицию по 400*deltaTime значения, а затем Я рисую их, используя SpriteBatch. Проблема в том, что они иногда перемещаются по левому краю на некоторые препятствия, поэтому кажется, что он движется вправо на какое-то время или останавливается, и я не знаю, почему. Таким образом, они двигаются влево, а некоторые препятствия останавливаются на некоторое время, после чего они снова двигаются правильно, а затем еще какое-то препятствие на некоторое время отстает, и это продолжается. В то же время на экране есть приблизительно 4 препятствия, и я перерабатываю препятствия, которые больше не видны. Может кто-нибудь объяснить мне, почему это происходит? Я заметил эту «ошибку» в примере libGDX Thrust Copter (который вы можете найти в книге LibGDX Game Development Essentials - Я тоже написал тему для этой проблемы: LibGDX example game Thrust Copter lags). Спасибо за любой ответ! :)LibGDX игра тормозит при рендеринге

public class TapToJumpGame extends ApplicationAdapter { 
    SpriteBatch batch; 
    Texture obstacle; 
    OrthographicCamera camera; 
    Array<Vector2> obstacles; 
    Array<Vector2> usedObstacles; 
    double obsTime; 
    Vector2 lastObstacle; 

    @Override 
    public void create() { 
     batch = new SpriteBatch(); 
     usedObstacles = new Array<Vector2>(); 
     obstacle = new Texture("obstacle.png"); 
     camera = new OrthographicCamera(); 
     camera.setToOrtho(false, 800, 480); 
     resetGame(); 
    } 

    private void addObstacle() 
    { 
     if(lastObstacle != null) if((810 - (lastObstacle.x + obstacle.getWidth())) < 200) return; 
     Vector2 obs; 
     if(usedObstacles.size > 0) obs = usedObstacles.pop(); 
     else obs = new Vector2(); 
     obs.set(810, 10); 
     obstacles.add(obs); 
     lastObstacle = obs; 
    } 

    @Override 
    public void render() { 
     Gdx.gl.glClearColor(1, 1, 1, 1); 
     Gdx.gl.glClear(GL20.GL_COLOR_BUFFER_BIT); 
     updateScene(); 
     drawScene(); 
    } 

    private void resetGame() { 
     obstacles = new Array<Vector2>(); 
     obsTime = 1; 
     lastObstacle = null; 
    } 

    private void drawScene() { 
     camera.update(); 
     batch.setProjectionMatrix(camera.combined); 
     batch.begin(); 
     for(Vector2 obs:obstacles) 
     { 
      batch.draw(obstacle, obs.x, obs.y); 
     } 
     batch.end(); 
    } 

    private void updateScene() { 

     float deltaTime = Gdx.graphics.getDeltaTime(); 

     obsTime -= deltaTime; 
     if(obsTime < 0) 
     { 
      obsTime = MathUtils.random()*1+.5; 
      addObstacle(); 
     } 

     for(Vector2 obs:obstacles) 
     { 
      obs.x -= 400*deltaTime; 
      if(obs.x + obstacle.getWidth() < -10) { 
       usedObstacles.add(obs); 
       obstacles.removeValue(obs, true); 
      } 
     } 
    } 
} 
+0

Вы можете поместить соответствующий код? Это поможет определить проблему – vdlmrc

+0

Я ее отредактировал, поэтому добавил код. :) – Tinko

ответ

1

Похоже, что когда-либо возникающие пятна появляются при удалении объекта из массива, который в настоящее время выполняется итерацией.

магазин, что вы хотите удалить то и удалить его после итерации, как это:

for (int i = 0; i < obstacles.size; i++) { 
     Vector2 obs = obstacles.get(i); 
     obs.x -= 400 * deltaTime; 
     if (obs.x + obstacle.getWidth() < 250) { 
      usedObstacles.add(obs); 
      obstaclesToRemove.add(obs); 
     } 
     } 

     for (int i = 0; i < obstaclesToRemove.size; i++) { 
     obstacles.removeValue(obstaclesToRemove.get(i), true); 

     } 
     obstaclesToRemove.clear(); 
+0

Большое вам спасибо! :) Проблема заключалась в том, что я удалял объекты из массива, который в настоящее время повторяется, как вы сказали. Ты действительно помог мне! – Tinko

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