Частицы не рендеринг

Я вставляю систему частиц, но когда я запускаю программу, когда я порождаю некоторые частицы, они не отображаются. Я посмотрел на ArrayList, и его значение всегда будет равно 0, даже если я добавлю к нему частицу. Вот код для основного класса:

package Main;

import java.awt.Color;
import java.awt.Graphics;
import java.awt.event.KeyEvent;
import java.awt.event.KeyListener;
import java.awt.event.MouseEvent;
import java.awt.event.MouseListener;
import java.util.ArrayList;

import javax.swing.JFrame;
import javax.swing.JPanel;

import me.mango.rendering.Particle;

//do double buffering

public class Game extends JPanel {

    private static final long serialVersionUID = 1L;

    public static final int height = 400;
    public static final int width = height * 16 / 9;

    JPanel p;
    Game game;
    Graphics g;

    JFrame frame;
    KeyListener kl;
    MouseListener ml;

    public boolean running = true;

    private ArrayList<Particle> particles = new ArrayList<Particle>(500);

    public Game(){
        kl = new KeyListener(){

            public void keyPressed(KeyEvent e) {

            }

            public void keyReleased(KeyEvent e) {

            }

            public void keyTyped(KeyEvent e) {

            }
        };

        ml = new MouseListener(){

            public void mousePressed(MouseEvent e) {
                addParticle(true);addParticle(false);addParticle(true);
                addParticle(false);addParticle(true);addParticle(false);
            }

            public void mouseReleased(MouseEvent e) {

            }
            public void mouseClicked(MouseEvent e) {

            }

            public void mouseEntered(MouseEvent e) {

            }

            public void mouseExited(MouseEvent e) {

            }
        };
    }

    public void addParticle(boolean b){
        int dx,dy;
        int x = 100;
        int y = 100;
        if(b){
            dx = (int) (Math.random()*5);
            dy = (int) (Math.random()*5);
        }else{
            dx = (int) (Math.random()*-5);
            dy = (int) (Math.random()*-5);
        }
        int size = (int) (Math.random()*12);
        int life = (int) Math.random()*(120)+380;
        particles.add(new Particle(x,y,dx,dy,size,life,Color.blue));
    }

    public void update(double delta){
        for(int i = 0; i<= particles.size() - 1;i++){
            if(particles.get(i).update()) particles.remove(i);
        }
        System.out.println(particles.size());
    }

    @Override
    public void paint(Graphics g){
        g.clearRect(0, 0, getWidth(), getHeight());

        //render here
        renderParticles(g);

        g.dispose();
    }

    public void renderParticles(Graphics g){
        for(int i =0;i <= particles.size() - 1;i++){
            particles.get(i).render(g);
            System.out.println("spawned");
        }
    }

    public void run(){

        //initialize time loop variables
        long lastLoopTime = System.nanoTime();
        final int TARGET_FPS = 60;
        final long OPTIMAL_TIME = 1000000000 / TARGET_FPS;
        double lastFpsTime = 0;

        //Main game loop
        while(running)
        {
            //Calculate since last update
            long now = System.nanoTime();
            long updateLength = now - lastLoopTime;
            lastLoopTime = now;
            double delta = updateLength / ((double)OPTIMAL_TIME);

            //update frame counter
            lastFpsTime += updateLength;

            //update FPS counter
            if(lastFpsTime >= 1000000000)
            {
                lastFpsTime = 0;
            }

            //game updates
            game.update(delta);

            //graphics (gameState)
            game.repaint();

            try{
                Thread.sleep((Math.abs(lastLoopTime - System.nanoTime() + OPTIMAL_TIME)/1000000));
            }catch(Exception e){
                System.out.println("Error in sleep");
            }
        }
    }

    public void start(){
        frame = new JFrame("Game");

        game = new Game();

        frame.add(game);
        frame.pack();

        frame.setSize(width, height);
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        frame.setLocationRelativeTo(null);

        frame.addKeyListener(kl);
        frame.addMouseListener(ml);

        frame.setVisible(true);

        run();
    }

    public static void main(String[] args){
        new Game().start();
    }
}

и для класса частиц:

package me.mango.rendering;

import java.awt.Color;
import java.awt.Graphics;

public class Particle {

    private int x;
    private int y;
    private int dx;
    private int dy;
    private int size;
    private int life;
    private Color color;

    public Particle(int x, int y, int dx, int dy, int size, int life, Color c){
        this.x = x;
        this.y = y;
        this.dx = dx;
        this.dy = dy;
        this.size = size;
        this.life = life;
        this.color = c;
    }

    public boolean update(){
        x += dx;
        y += dy;
        life--;
        if(life <= 0){
            return true;
        }
        return false;
    }

    public void render(Graphics g){
        g.setColor(color);
        g.fillRect(x-(size/2), y-(size/2), size, size);

        g.dispose();
    }

}

Спасибо!

1 ответ

В классе Game у вас есть игра под названием game: это совсем не хороший дизайн. Видимо, вы не понимаете смысл создания объекта.

В main() вы создали объектную игру: этого должно быть достаточно. Та вещь, которой вы должны манипулировать.

Поэтому вызов game.something() внутри игры класса - это свертка. Избавиться от этого.

game = new Game();

Game game;

Эти вещи должны идти.

И любая ссылка на game.someMethod()

должен быть заменен только someMethod(), если вы находитесь внутри Game.

Кроме того, у вас есть такие вещи, как run(), start() и т. Д. Как вы думаете, вы создаете несколько потоков? просто используя эти имена для ваших методов?

Нет.

Другие вопросы по тегам