У меня проблема с моей игрой, и я не могу найти проблему, мой FPS падает от 300 до 1, каждую секунду, как 5 до 10 FPS ниже, пока она не будет воспроизведена. Сначала он вызывает ошибку при запуске wave.myFirstGame.Handler.removeObject (Handler.java:31), но сбой. но когда я удаляю код, который дает мне эту ошибку, игра работает, но FPS падает и все еще не воспроизводится.Java-игра, FPS падает с 300 до 1
import java.awt.Color;
import java.awt.Graphics;
import java.awt.Rectangle;
public class BasicEnemy extends GameObject {
private Handler handler;
public BasicEnemy(int x, int y, ID id, Handler handler) {
super(x, y, id);
this.handler = handler;
velX = 5;
velY = 5;
}
public Rectangle getBounds() { //for collision
return new Rectangle(x, y, 16, 16);
}
public void tick() {
x += velX;
y += velY;
if (y <= 0 || y >= Game.HEIGHT - 32)
velY *= -1; // limits of the screen for the enemy
if (x <= 0 || x >= Game.WIDTH - 16)
velX *= -1;
handler.addObject(new Trail(x, y,ID.Trail, Color.red, 16, 16, 0.02f, handler));
}
public void render(Graphics g) {
g.setColor(Color.red);
g.fillRect(x, y, 16, 16);
}
это класс Handler, где я получаю сообщение об ошибке, в последней строке пакет wave.myFirstGame;
import java.awt.Graphics;
import java.util.LinkedList;
public class Handler {
LinkedList<GameObject> object = new LinkedList<GameObject>();
public void tick() {
for (int i = 0; i < object.size(); i++) {
GameObject tempObject = object.get(i);
tempObject.tick();
}
}
public void render(Graphics g) {
for (int i = 0; i < object.size(); i++) {
GameObject tempObject = object.get(i);
tempObject.render(g);
}
}
public void addObject(GameObject object) {
this.object.add(object);
}
public void removeObject(GameObject object) {
this.removeObject(object); //this is the error and the game craches after 1 sec, if i remove it, it works but FPS drops
}
}
и вот Трейл и проблемы начались, когда я это сделал.
import java.awt.AlphaComposite;
import java.awt.Color;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.Rectangle;
public class Trail extends GameObject {
private float alpha = 1;
private float life;
private Handler handler;
private Color color;
private int width, height;
//life value between 0.001 - 0.1
public Trail(int x, int y, ID id , Color color, int width, int height, float life, Handler handler) { // constructor
super(x, y, id);
this.handler = handler;
this.color = color;
this.width = width;
this.height = height;
this.life = life;
}
public void tick() {
if(alpha > life){
alpha -= (life - 0.001f);
}
else handler.removeObject(this);
}
public void render(Graphics g) {
Graphics2D g2d = (Graphics2D) g;
g2d.setComposite(makeTransparent(alpha));
g.setColor(color);
g.fillRect(x, y, width, height);
g2d.setComposite(makeTransparent(1)); // we wanna sandwitch our alpha and 1
}
private AlphaComposite makeTransparent(float alpha){
int type = AlphaComposite.SRC_OVER;
return(AlphaComposite.getInstance(type, alpha));
}
public Rectangle getBounds() {
return null;
}
}
Это много кода я знаю, но я не могу найти проблему, поэтому если у вас есть какие-либо предложения или идеи, было бы здорово услышать их. Спасибо!
Это какой-то произвольный код, который не имеет ничего общего ни с чем связанным с fps. Где ваш код что-то делает? Где ваш '' главный''? Сколько объектов в вашем списке? – f1sh
Сторона примечания: вы можете узнать о написании «разумного» Java-кода. Например, вы можете переписать тело вашего метода тика на 'for (GameObject game: object) {game.tick(); } '. Нет необходимости в счетчике и временном объекте. И: ** улучшить ** ваше именование. Используйте имена, которые говорят, что это за вещь.Вы знаете, как вызов вашего 'List' gameObjects вместо «object». Можете ли вы определить разницу, которая могла бы сделать ?! И вы знаете: факт, что вы используете ** то же ** имя «объект» повсюду, это ** крайне ** плохая практика. –
GhostCat
** Наконец: нет необходимости использовать жирный шрифт по всему вашему вопросу. Мы можем читать без вашей смелой поддержки. ** – GhostCat