В настоящее время я работаю над 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();
...
}
}
Это также бросает исключение
Это не то, как вы делаете резьбу в целом. Обычно вы создаете Thread и вызываете его метод 'start()'. –
Это сетевая многопользовательская игра или просто локальная? – Michael
@Michael это простая локальная игра –