2016-06-10 3 views
0

В настоящее время я работаю над java-бомбардировщиком, игра отлично работает, но у меня есть одновременное изменение модификации, которое повторяется повторно. В моей игре у меня есть два игрока, и каждый из них имеет свой собственный поток, который запускается (thread.run()) с постоянной частотой 60 кадров в секунду с использованием таймера. Я попробовал перекрасить пробег после того, как запутался поток, а также в конце каждого метода запуска игрока., связанный с многопользовательской нитью и перекраской

Метод 1:

public void loop(){ 
if(!gameover){ 
    player1_thread.run(); //run player 1 thread 
    player2_thread.run(); //run player 2 thread 
    gui.repaint() //repaint panel 
} 

Способ 2:

public class Player extends Character{ //Character implements Runnable 
... 
@Override 
public void run(){ 
play(); 
... 
game.render(); 
} 

Оба этих метода бросает одновременное изменение как и ожидалось, так как я могу избежать ошибки другого, то просто делает:

player1.run(); //call the run method of each player class 
player2.run(); 

, который дает игроку 1 преимущество.

EDIT:

Метод 4:

import java.util.Timer 

public class Player extends Character { //Character implements Runnable 
    private Timer gameTimer 

@Ovveride 
public void run(){ 
    gameTimer.scheduleAtFixedRate(new TimerTask(){ 

     @Override 
     public void run() { 
      play(); 
      ... 
      game.render(); 
     } 


    }, 0, 1000/60); 
} 

public class Game extends AbstractGame { 


    private void init(){ 
     ... 
     Thread player1_Thread = new Thread(player1); 
     Thread player2_Thread = new Thread(player2); 
     gui = new GameGraphics(this); //subclass of JPanel 
     player1_thread.start(); 
     player2_thread.start(); 
    } 

/* this method is called at a constant 60fps(like the player timer) in the main game timer in my abstract game class */ 
    public void gameLoop(){ 
     if(!gameover){ 
      render(); 
     ... 
     } 
    } 

Это также бросает исключение

+0

Это не то, как вы делаете резьбу в целом. Обычно вы создаете Thread и вызываете его метод 'start()'. –

+0

Это сетевая многопользовательская игра или просто локальная? – Michael

+0

@Michael это простая локальная игра –

ответ

0

Wrong: Вызов (запуск) будет выполнять инструкции, используя основной поток.

Исправить: вызвать player1.start(), чтобы начать новый поток, так что run() {...} выполняется во вновь запущенном потоке.

0

Если Player является подклассом Thread, вы можете начать его с .start(), но не начинайте нить в цикле. Вам нужно только запустить поток, после чего он будет работать до тех пор, пока метод выполнения в этом классе не будет завершен, скорее всего, вы хотите написать метод выполнения с циклом, чтобы он продолжал работать до момента, когда вы его остановите. Если вы хотите запустить игру только одним потоком, вы можете реализовать Runnable и сделать то, что делаете прямо сейчас, вызывая run() в цикле. Тогда будет только один основной поток.

Просто вызов run на объект потока, вы не начинаете поток, он просто вызывает метод run в этих объектных.

Я думаю, что лучше всего сделать, просто один поток, обновляющий краску данными из модели. Измените данные в этой модели из потоков игроков.

+0

обновленный основной пост, playerThread - это имя переменной для Thread, которое берет игрока в конструкторе (см. Post для более подробной информации) –

+0

Я бы удалил функцию рендеринга в классе игрока. Просто дайте 60fps gameloop обновить краску. – STersteeg