2013-12-11 7 views
1

Я использую LibGDX для любого из вас, кого это может затронуть, однако я пытаюсь создать базовую игру с космическим шутером, в которой игрок летает вокруг с помощью WASD Keys и смотрит в сторону мыши позиция (я уже сделал это, yay; D) Во всяком случае, моя проблема в том, что я не могу понять, как визуализировать пулю.Обновление и рендеринг пули

Вот мой класс пуля

public class Bullet extends Entity 

{ частное Vector2 StartPosition, targetPosition, должность;

private float rotation; 

private Sprite sprite; 

private SpriteBatch batch; 

public Bullet(Texture texture, Vector2 startPosition, float rotation, Vector2 targetPosition) 
{ 
    this.startPosition = startPosition; 
    this.targetPosition = targetPosition; 
    this.position = startPosition; 
    this.rotation = rotation; 
    this.sprite = new Sprite(texture); 
    this.batch = new SpriteBatch(); 
} 

public void update() 
{ 

} 

}

я попытался реализовать Runnable и сделать это таким образом, однако вы не можете использовать несколько потоков, поскольку он не может найти экземпляр OpenGL или любой другой.

Цель состоит в том, чтобы сделать стрельбу из пули в направлении, в котором игрок сталкивается в то время. Итак, я бы создал новую пулю, как показано ниже:

new Bullet(new Texture("bullet.png"), new Vector2(getX(), getY()), getRotation(), new Vector2(mouseX(), mouseY()); 

Моя проблема еще раз - ее рендеринг. Я понятия не имею, что я здесь делаю.

ответ

0

OpenGL имеет некоторые ограничения на то, как он работает в многопоточных средах. Проверьте http://www.equalizergraphics.com/documentation/parallelOpenGLFAQ.html и выберите одно из предлагаемых решений.

Простым решением здесь было бы сделать все в одном потоке.

Где-то в вас коде должно быть что-то вроде

while (!shouldExit) { 
    Update window stuff. 
    Read the state of the inputs. 
    Update the state of the scene. { 
    for (bullet : bullets) { bullet.move() } 
    } 
    Render everything once. { 
    for (bullet : bullets) { bullet.draw() } 
    } 
} 
+0

Я попытался сделать это, создав цикл while (true) для обработки всей логики и чертежа для пули, это останется в одном потоке и позволит мне получить доступ к OpenGL, однако он мгновенно заморозил приложение. Я попытался добавить Thread.sleep() в цикле, но это ничего не делало, никаких идей? –

+0

Попробуйте повторить один раз над пулями, а затем верните управление остальной части приложения, чтобы он не замерзал. – Sorin

+0

Не совсем уверен, как это сделать. Мне нужно, чтобы пули постоянно обновлялись. Я собираюсь внедрять самонаводящиеся пули и т. Д., Поэтому мне придется постоянно выполнять логические проверки. Возможно, я не понимаю информацию, которую вы предоставляете мне, не могли бы вы показать это в psuedo? –

0

Вы должны поместить созданную пулю в переменную или список. Затем в вашем коде обновления вы получите его и вызовите обновление, а затем отрисуйте его с помощью спрайт-пакета. Многопоточность не должна использоваться в малой или средней игре. Постарайтесь думать одновременно, а не параллельно.

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