Непостоянная скорость игры и скорость падения метеора после перезапускаJAVA

Программисты JAVA общаются здесь
Ответить Пред. темаСлед. тема
Anonymous
 Непостоянная скорость игры и скорость падения метеора после перезапуска

Сообщение Anonymous »

После перезапуска игры с помощью кнопки я обнаружил нестабильную скорость игры и скорость падения метеорита по сравнению с первоначальным запуском игры. Поначалу игра проходит гладко с быстрым падением метеорита и движением истребителя. Однако при перезапуске игры метеоры падают медленнее, а скорость истребителя снижается. Я подозреваю, что это несоответствие может быть связано с тем, как я обрабатываю игровой цикл или использование потоков. Буду очень признателен за любую помощь в решении этой проблемы!
Я собираюсь показать Game.java, где реализованы функции игрового цикла и сброса.
package main;

import entity.FighterJet;
import entity.Meteor;

import javax.swing.*;
import java.awt.Dimension;
import java.awt.Color;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;
import java.util.Random;

public class Game extends JPanel implements Runnable {
final int windowWidth = 600;
final int windowHeight = 600;
int FPS = 60;
KeyHandler handler = new KeyHandler();
Thread gameLoopThread;
FighterJet fighterJet;
List meteors;
Random random;
boolean gameOver = false;
Menu menu;
JFrame gameWindow;

public Game(Menu menu, JFrame gameWindow) {
this.menu = menu;
this.gameWindow = gameWindow;
setPreferredSize(new Dimension(windowWidth, windowHeight));
setBackground(Color.black);
setDoubleBuffered(true);
addKeyListener(handler);

fighterJet = new FighterJet(300, 500, 8);
meteors = new ArrayList();
random = new Random();
}

public void startGameLoopThread() {
if (gameLoopThread != null && gameLoopThread.isAlive()) {
gameLoopThread.interrupt(); // Interrupt the previous game loop thread
}
gameLoopThread = new Thread(this);
gameLoopThread.start();
}

@Override
public void run() {
double drawInterval = (double) 1000000000 / FPS;
double delta = 0;
long lastTime = System.nanoTime();
long currentTime;

while (gameLoopThread != null) {
currentTime = System.nanoTime();
delta += (currentTime - lastTime) / drawInterval;
lastTime = currentTime;

if (delta >= 1) {
update();
repaint();
checkCollisions();
delta--;
}

if (gameOver) {
displayGameOver();
break; // Exit the loop when game is over
}
}
}

public void update() {
updateJet();
generateMeteors();
updateMeteors();
}

private void updateJet() {
if (handler.move_left && !handler.move_right) {
fighterJet.update(true, false); // Move left
fighterJet.updateImage(1);
} else if (handler.move_right && !handler.move_left) {
fighterJet.update(false, true); // Move right
fighterJet.updateImage(2);
} else {
fighterJet.update(false, false); // No movement
fighterJet.updateImage(0);
}
}

private void generateMeteors() {
int meteorSpawnChance = 6;
int maxNumMeteors = 8;
if (meteors.size() < maxNumMeteors && random.nextInt(100) < meteorSpawnChance) {
int randomX = random.nextInt(windowWidth);
int speed = random.nextInt(3) + 4; // Random speed between 4 and 6
meteors.add(new Meteor(randomX, 0, speed));
}
}

private void updateMeteors() {
List meteorsToRemove = new ArrayList();
for (Meteor meteor : new ArrayList(meteors)) {
meteor.update();
if (meteor.getY() > windowHeight) {
meteorsToRemove.add(meteor);
}
}
meteors.removeAll(meteorsToRemove);
}

public void paintComponent(Graphics g) {
super.paintComponent(g);

Graphics2D g2 = (Graphics2D) g;

fighterJet.draw(g2);

// Create a copy of the meteors list to iterate over
List meteorsCopy = new ArrayList(meteors);
for (Meteor meteor : meteorsCopy) {
g2.drawImage(meteor.getCurrentImage(), meteor.getX(), meteor.getY(), 20, 50, null);
}
g2.dispose();

if (gameOver) {
displayGameOver();
}
}

public void checkCollisions() {
for (Meteor meteor : meteors) {
if (fighterJet.getBounds().intersects(meteor.getBounds())) {
gameOver = true;
break;
}
}
}

public void displayGameOver() {
if (gameOver) {
gameLoopThread.interrupt();
GameOver gameOverScreen = new GameOver(gameWindow, menu,this);
gameWindow.getContentPane().removeAll();
gameWindow.add(gameOverScreen);
gameWindow.pack();
}
}

public void resetGame() {
gameOver = false;
meteors.clear();
generateMeteors(); // Generate new meteors after clearing
handler.resetFighterJetMovement();
fighterJet = new FighterJet(300, 500, 8);
addKeyListener(handler);
requestFocusInWindow();
startGameLoopThread(); // Start the game loop again
}
}


Подробнее здесь: https://stackoverflow.com/questions/782 ... restarting
Реклама
Ответить Пред. темаСлед. тема

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

  • Похожие темы
    Ответы
    Просмотры
    Последнее сообщение
  • Маленький черный квадрат в центре экрана после каждого перезапуска игры в понг с черепаховой графикой.
    Anonymous » » в форуме Python
    0 Ответы
    14 Просмотры
    Последнее сообщение Anonymous
  • Tic-Tac-Toe Project: кнопка перезапуска не сбросить состояние игры [закрыто]
    Anonymous » » в форуме Javascript
    0 Ответы
    4 Просмотры
    Последнее сообщение Anonymous
  • Уменьшите максимальную скорость обучения после каждого перезапуска.
    Anonymous » » в форуме Python
    0 Ответы
    11 Просмотры
    Последнее сообщение Anonymous
  • Уменьшите максимальную скорость обучения после каждого перезапуска.
    Anonymous » » в форуме Python
    0 Ответы
    18 Просмотры
    Последнее сообщение Anonymous
  • API, чтобы изменить «скорость курсора» в динамически Win10 без перезапуска
    Anonymous » » в форуме C++
    0 Ответы
    3 Просмотры
    Последнее сообщение Anonymous

Вернуться в «JAVA»