Java 使圆圈随机显示&;使用摆动计时器改变颜色

Java 使圆圈随机显示&;使用摆动计时器改变颜色,java,eclipse,windows,swing,timer,Java,Eclipse,Windows,Swing,Timer,所以我在做一个游戏,你们跳到岩石上,你们不能跳到被水覆盖的岩石上。我被困在岩石(圆圈)在水中随机消失并随机出现的地方,在它们消失前大约1.5秒,让它改变颜色。我认为最好使用javax.swing.Timer 你能帮我做到吗 以下是我目前的代码: 主要类别: import java.awt.Canvas; import java.awt.Color; import java.awt.Graphics; import java.awt.Menu; import java.awt.Window; im

所以我在做一个游戏,你们跳到岩石上,你们不能跳到被水覆盖的岩石上。我被困在岩石(圆圈)在水中随机消失并随机出现的地方,在它们消失前大约1.5秒,让它改变颜色。我认为最好使用
javax.swing.Timer

你能帮我做到吗

以下是我目前的代码:
主要类别:

import java.awt.Canvas;
import java.awt.Color;
import java.awt.Graphics;
import java.awt.Menu;
import java.awt.Window;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
 import java.awt.image.BufferStrategy;
import java.util.Random;

import javax.swing.Timer;

public class Game extends Canvas implements Runnable{

private static final long serialVersionUID = -7800496711589684767L;

public static final int WIDTH = 640, HEIGHT = WIDTH / 12 * 9;

private Thread thread;
private boolean running = false;
private Random r;

private Handler handler;
//private HUD hud;
private Menu menu;

public enum STATE {
    Menu,
    Help,
    Game
};

public STATE gameState = STATE.Menu;

public Game() {
    handler = new Handler();
    menu = new Menu(this, handler);
    this.addKeyListener(new KeyInput(handler));
    this.addMouseListener(menu);
    new Window(WIDTH, HEIGHT, "My game", this);

    //hud = new HUD();
    r = new Random();

    //if(gameState == STATE.Game) {
    if(gameState == STATE.Game) {   //handler.addObject(new Player(100, 200, ID.Player));

    }

    //handler.addObject(new Player(100, 200, ID.Player));
    //handler.addObject(new BasicEnemy(100, 200, ID.BasicEnemy));   

}

public synchronized void start() {
    thread = new Thread(this);
    thread.start();
    running = true;
}

public synchronized void stop() {
    try {
        thread.join();
        running = false;
    }catch(Exception ex) { ex.printStackTrace(); }
}

public void run()
{
    this.requestFocus();
    long lastTime = System.nanoTime();
    double amountOfTicks = 60.0;
    double ns = 1000000000 / amountOfTicks;
    double delta = 0;
    long timer = System.currentTimeMillis();
    int frames = 0;
    while(running)
    {
                long now = System.nanoTime();
                delta += (now - lastTime) / ns;
                lastTime = now;
                while(delta >=1)
                        {
                            tick();
                            delta--;
                        }
                        if(running)
                            render();
                        frames++;

                        if(System.currentTimeMillis() - timer > 1000)
                        {
                            timer += 1000;
                            //System.out.println("FPS: "+ frames);
                            frames = 0;
                        }
    }
            stop();
 }  

private void tick() {
    handler.tick();
    //hud.tick();
    if(gameState == STATE.Game) {
        Random r = new Random();
        long now = System.currentTimeMillis();
        int b = 0;
        //System.out.println(now);
        long extraSeconds = 500;

    }else if(gameState == STATE.Menu) {
        menu.tick();
    }
}

private void render() {
    BufferStrategy bs = this.getBufferStrategy();
    if(bs == null) {
        this.createBufferStrategy(3);
        return;
    }

    Graphics g = bs.getDrawGraphics();
    long now = System.currentTimeMillis();

    g.setColor(new Color(87, 124, 212));
    g.fillRect(0, 0, WIDTH, HEIGHT);
    if(gameState == STATE.Game) {
        g.setColor(new Color(209, 155, 29));
        for(int i = 0; i < 5; i++) {
            g.fillOval(80 + (100 * i), 325, 70, 20);
        }
        if(gameState == STATE.Game) {


    }else if(gameState == STATE.Menu || gameState == STATE.Help){
        menu.render(g);
    }

    handler.render(g);

    if(gameState == STATE.Game) {
    }
    //hud.render(g);

    g.dispose();
    bs.show();
}

public static int clamp(int var, int min, int max) {
    if(var >= max)
        return var = max;
    else if(var <= max)
        return var = min;
    else 
        return var;
}

public static void main(String[] args) {
    new Game();
}
}
处理程序类:

package com.pitcher654.main;

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.object.remove(object);
}

}
键输入类:

package com.pitcher654.main;

import java.awt.event.KeyAdapter;
import java.awt.event.KeyEvent;

public class KeyInput extends KeyAdapter{

private Handler handler;

public KeyInput(Handler handler) {
    this.handler = handler;
}

public void keyPressed(KeyEvent e) {
    int key = e.getKeyCode();

    for(int i = 0; i < handler.object.size(); i++) {
        GameObject tempObject = handler.object.get(i);
        if(tempObject.getID() == ID.Player) {
            //kez events for Player 1
            //GameObject object = new GameObject(0, 0, ID.Misc);
            //System.out.println(tempObject.getID());               
            if(GameObject.x != 500) {
                if(key == KeyEvent.VK_RIGHT) {
                    Player.currentStone++;
                    tempObject.setX(tempObject.getX() + 100);
                }
            }
            if(GameObject.x != 100){
                if(key == KeyEvent.VK_LEFT) {
                    Player.currentStone--;
                    tempObject.setX(tempObject.getX() - 100);
                }
            }
        }
    }
    if(key == KeyEvent.VK_ESCAPE) System.exit(1);
}

public void keyReleased(KeyEvent e) {
    int key = e.getKeyCode();
}

}
和窗口类:

package com.pitcher654.main;

import java.awt.Canvas;
import java.awt.Color;
import java.awt.Dimension;
import java.awt.Graphics;
import java.awt.image.BufferedImage;
import java.io.IOException;
import java.net.URL;

import javax.imageio.ImageIO;
import javax.swing.JFrame;
import javax.swing.JPanel;

public class Window extends Canvas{

private static final long serialVersionUID = 9086330915853125521L;

BufferedImage image = null;
URL url = null;

public Window(int width, int height, String title, Game game) {
    JFrame frame = new JFrame(title);
    try {

        image = ImageIO.read(new URL("https://static.wixstatic.com/media/95c249_b887de2536aa48cb962e2336919d2693.png/v1/fill/w_600,h_480,al_c,usm_0.66_1.00_0.01/95c249_b887de2536aa48cb962e2336919d2693.png"));
    } catch (IOException e) {
        e.printStackTrace();
    }

    frame.setPreferredSize(new Dimension(width, height));
    frame.setMaximumSize(new Dimension(width, height));
    frame.setMinimumSize(new Dimension(width, height));

    frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    frame.setResizable(false);
    frame.setLocationRelativeTo(null);
    frame.add(game);
    frame.setIconImage(image);
    //DrawingPanel panel = new DrawingPanel();
    //frame.getContentPane().add(panel);
    frame.setVisible(true);
    frame.requestFocus();
    game.start();
}

public class DrawingPanel extends JPanel {

    private static final long serialVersionUID = -7662876024842980779L;

    public void paintComponent(Graphics g) {
        g.setColor(new Color(209, 155, 29));
        g.fillOval(100, 100, 100, 100);
    }
}
}

根据您的代码,Swing
计时器不是您想要的。你已经有了一个“game/main”循环,它应该在每个循环中更新游戏的当前状态并渲染它,你只需要设计一种方法来创建一个具有给定寿命的“rock”,每次渲染时,它都需要检查它的寿命是否接近结束,并在它死亡时将其移除

岩石实际上只是游戏中的另一个实体,可以进行更新和渲染

导入java.awt.Canvas;
导入java.awt.Color;
导入java.awt.Component;
导入java.awt.Dimension;
导入java.awt.EventQueue;
导入java.awt.Graphics2D;
导入java.awt.event.ComponentAdapter;
导入java.awt.image.BufferStrategy;
导入java.util.ArrayList;
导入java.util.Collections;
导入java.util.List;
导入java.util.Random;
导入javax.swing.JFrame;
导入javax.swing.SwingUtilities;
导入javax.swing.UIManager;
导入javax.swing.UnsupportedLookAndFeelException;
公共级摇滚乐{
公共静态void main(字符串[]args){
新RockyRoad();
}
公共RockyRoad(){
invokeLater(新的Runnable(){
@凌驾
公开募捐{
试一试{
UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName());
}catch(ClassNotFoundException |实例化Exception | IllegalacessException |不支持ookandfeelException ex){
例如printStackTrace();
}
JFrame=新JFrame(“测试”);
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.add(新游戏());
frame.pack();
frame.setLocationRelativeTo(空);
frame.setVisible(true);
}
});
}
公共静态类游戏扩展画布实现可运行{
私有静态最终长serialVersionUID=-7800496711589684767L;
公共静态最终整数宽度=640,高度=宽度/12*9;
私有线程;
私有布尔运行=false;
私有随机rnd;
私有列表实体=新的ArrayList(25);
公共枚举状态{
菜单,
救命啊,,
游戏
};
公共状态gameState=STATE.Game;
公共游戏(){
rnd=新随机数();
SwingUtilities.invokeLater(新的Runnable(){
@凌驾
公开募捐{
start();
}
});
}
@凌驾
公共维度getPreferredSize(){
返回新尺寸(宽度、高度);
}
公共同步的void start(){
线程=新线程(此);
thread.start();
运行=真;
}
公共同步无效停止(){
试一试{
thread.join();
运行=错误;
}捕获(例外情况除外){
例如printStackTrace();
}
}
公开募捐{
this.requestFocus();
long lastTime=System.nanoTime();
双amountOfTicks=60.0;
双ns=1000000000/个;
双增量=0;
长定时器=System.currentTimeMillis();
int帧=0;
(跑步时){
long now=System.nanoTime();
增量+=(现在-上次)/ns;
上次=现在;
而(增量>=1){
勾选();
三角洲--;
}
如果(正在运行){
更新();
render();
}
frames++;
if(System.currentTimeMillis()-计时器>1000){
定时器+=1000;
//系统输出打印项次(“FPS:+帧);
帧=0;
}
}
停止();
}
私人空白勾号(){
//打勾();
}
受保护的无效更新(){
if(gameState==STATE.Game){
if(rnd.nextBoolean()){
System.out.println(“新…”);
intx=rnd.nextInt(getWidth()-Rock.SIZE);
int y=rnd.nextInt(getHeight()-Rock.SIZE);
int寿命=4000+rnd.nextInt(6000);
添加(新岩石(寿命,x,y));
}
List toRemove=newarraylist(entities.size());
列表控件=集合。不可修改列表(实体);
for(实体:实体){
if(entity.update(control,this)=EntityAction.REMOVE){
System.out.println(“死…”);
删除。添加(实体);
}
}
实体。删除所有(删除);
}
}
私有void render(){
BufferStrategy bs=this.getBufferStrategy();
如果(bs==null){
这一战略(3);
返回;
}
Graphics2D g=(Graphics2D)bs.getDrawGraphics();
long now=System.currentTimeMillis();
g、 setColor(新颜色(87124212));
g、 fillRect(0,0,宽度,高度);
package com.pitcher654.main;

import java.awt.event.KeyAdapter;
import java.awt.event.KeyEvent;

public class KeyInput extends KeyAdapter{

private Handler handler;

public KeyInput(Handler handler) {
    this.handler = handler;
}

public void keyPressed(KeyEvent e) {
    int key = e.getKeyCode();

    for(int i = 0; i < handler.object.size(); i++) {
        GameObject tempObject = handler.object.get(i);
        if(tempObject.getID() == ID.Player) {
            //kez events for Player 1
            //GameObject object = new GameObject(0, 0, ID.Misc);
            //System.out.println(tempObject.getID());               
            if(GameObject.x != 500) {
                if(key == KeyEvent.VK_RIGHT) {
                    Player.currentStone++;
                    tempObject.setX(tempObject.getX() + 100);
                }
            }
            if(GameObject.x != 100){
                if(key == KeyEvent.VK_LEFT) {
                    Player.currentStone--;
                    tempObject.setX(tempObject.getX() - 100);
                }
            }
        }
    }
    if(key == KeyEvent.VK_ESCAPE) System.exit(1);
}

public void keyReleased(KeyEvent e) {
    int key = e.getKeyCode();
}

}
package com.pitcher654.main;

import java.awt.Color;
import java.awt.Font;
import java.awt.Graphics;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;

import com.pitcher654.main.Game.STATE;

public class Menu extends MouseAdapter{

private Game game;
private Handler handler;
private GameObject Player;

public Menu(Game game, Handler handler) {
    this.game = game;
    this.handler = handler;
}

public void mouseClicked(MouseEvent e) {
    int mx = e.getX();
    int my = e.getY();

    if(game.gameState == STATE.Menu) {
        //play 1 button
        if(mouseOver(mx, my, (Game.WIDTH - 250) / 2, 150, 250, 64)) {
            game.gameState = STATE.Game;
            handler.addObject(new Player(100, 200, ID.Player));
            //handler.addObject(new BasicEnemy(0, 0, ID.BasicEnemy));
        }
        //Instructions button
        if(mouseOver(mx, my, (Game.WIDTH - 250) / 2, 250, 250, 64)) {
            game.gameState = STATE.Help;
        }
        //Quit button
        if(mouseOver(mx, my, (Game.WIDTH - 250) / 2, 350, 250, 64)) {
            System.exit(1);
        }
    }
    //Bacl to menu in game button
    if(game.gameState == STATE.Help) {
        if(mouseOver(mx, my, 23, 395, 100, 32)) {
            game.gameState = STATE.Menu;
            //handler.object.remove(Player);

        }
    }
}

public void mouseReleased(MouseEvent e) {

}

private boolean mouseOver(int mx, int my, int x, int y, int width, int height) {
    if(mx > x && mx < x + width) {
        if(my > y && my < y + height) {
            return true;
        }else return false;
    }else return false;
}

public void tick() {

}

public void render(Graphics g) {
    if(game.gameState == STATE.Menu) {
        Font fnt = new Font("Trebuchet MS", 30, 15);

        g.setColor(new Color(87, 124, 212));
        g.fillRect(0, 0, game.WIDTH, game.HEIGHT);
        g.setColor(Color.white);
        g.setFont(new Font("Papyrus", 1, 50));
        g.drawString("Price iz davnine", (Game.WIDTH - 250) / 2 - 50, 70);
        g.drawRect((Game.WIDTH - 250) / 2, 150, 250, 64);
        g.drawRect((Game.WIDTH - 250) / 2, 250, 250, 64);
        g.drawRect((Game.WIDTH - 250) / 2, 350, 250, 64);
        g.setFont(new Font("Trebuchet MS", 5000, 20));
        g.drawString("Play", (Game.WIDTH - 250) / 2 + 110, 190);
        g.setFont(fnt);
        g.drawString("How to Play", (Game.WIDTH - 250) / 2 + 85, 290);
        g.drawString("Quit", (Game.WIDTH - 250) / 2 + 105, 390);
    }else if(game.gameState == STATE.Help) {
        g.setColor(Color.white);
        g.setFont(new Font("Papyrus", 1, 50));
        g.drawString("How to play", (Game.WIDTH - 250) / 2 - 50, 70);
        g.setFont(new Font("Trebuchetr MS", 30, 10));
        g.drawRect(23, 395, 100, 32);
        g.setColor(Color.black);
        g.drawString("Back to Menu", 33, 415);
    }

}

}
package com.pitcher654.main;

import java.awt.Color;
import java.awt.Graphics;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.util.Random;

import javax.swing.Timer;

import com.pitcher654.main.Game.STATE;

public class Player extends GameObject {

    Random r = new Random();
    public static int currentStone = 1;

public Player(int x, int y, ID id) {
    super(x, y, id);
    //velX = r.nextInt(5) + 1;
    //velY = r.nextInt(5);
}

public void tick() {
    x += velX;
    y += velY;
    //System.out.println(x);
    //if(x == 500) x = 500;
}

public void render(Graphics g) {
    if(id == ID.Player) g.setColor(Color.white);
    g.fillRect(x, y, 32, 32);
    g.drawLine(x + 15, y, x + 15, y + 100);
    g.drawLine(x + 15, y + 100, x, y + 135);
    g.drawLine(x + 15, y + 100, x + 33, y + 135);
    g.drawLine(x + 15, y + 70, x - 35, y + 30);
    g.drawLine(x + 15, y + 70, x + 65, y + 30);
    /*if(game.gameState == STATE.Menu) {
        g.setColor(new Color(87, 124, 212));
        g.fillRect(0, 0, Game.WIDTH, Game.HEIGHT);
    }*/
}


}
package com.pitcher654.main;

import java.awt.Canvas;
import java.awt.Color;
import java.awt.Dimension;
import java.awt.Graphics;
import java.awt.image.BufferedImage;
import java.io.IOException;
import java.net.URL;

import javax.imageio.ImageIO;
import javax.swing.JFrame;
import javax.swing.JPanel;

public class Window extends Canvas{

private static final long serialVersionUID = 9086330915853125521L;

BufferedImage image = null;
URL url = null;

public Window(int width, int height, String title, Game game) {
    JFrame frame = new JFrame(title);
    try {

        image = ImageIO.read(new URL("https://static.wixstatic.com/media/95c249_b887de2536aa48cb962e2336919d2693.png/v1/fill/w_600,h_480,al_c,usm_0.66_1.00_0.01/95c249_b887de2536aa48cb962e2336919d2693.png"));
    } catch (IOException e) {
        e.printStackTrace();
    }

    frame.setPreferredSize(new Dimension(width, height));
    frame.setMaximumSize(new Dimension(width, height));
    frame.setMinimumSize(new Dimension(width, height));

    frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    frame.setResizable(false);
    frame.setLocationRelativeTo(null);
    frame.add(game);
    frame.setIconImage(image);
    //DrawingPanel panel = new DrawingPanel();
    //frame.getContentPane().add(panel);
    frame.setVisible(true);
    frame.requestFocus();
    game.start();
}

public class DrawingPanel extends JPanel {

    private static final long serialVersionUID = -7662876024842980779L;

    public void paintComponent(Graphics g) {
        g.setColor(new Color(209, 155, 29));
        g.fillOval(100, 100, 100, 100);
    }
}
}
import java.awt.Canvas;
import java.awt.Color;
import java.awt.Component;
import java.awt.Dimension;
import java.awt.EventQueue;
import java.awt.Graphics2D;
import java.awt.event.ComponentAdapter;
import java.awt.image.BufferStrategy;
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
import java.util.Random;
import javax.swing.JFrame;
import javax.swing.SwingUtilities;
import javax.swing.UIManager;
import javax.swing.UnsupportedLookAndFeelException;

public class RockyRoad {

    public static void main(String[] args) {
        new RockyRoad();
    }

    public RockyRoad() {
        EventQueue.invokeLater(new Runnable() {
            @Override
            public void run() {
                try {
                    UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName());
                } catch (ClassNotFoundException | InstantiationException | IllegalAccessException | UnsupportedLookAndFeelException ex) {
                    ex.printStackTrace();
                }

                JFrame frame = new JFrame("Testing");
                frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
                frame.add(new Game());
                frame.pack();
                frame.setLocationRelativeTo(null);
                frame.setVisible(true);
            }
        });
    }

    public static class Game extends Canvas implements Runnable {

        private static final long serialVersionUID = -7800496711589684767L;

        public static final int WIDTH = 640, HEIGHT = WIDTH / 12 * 9;

        private Thread thread;
        private boolean running = false;
        private Random rnd;

        private List<Entity> entities = new ArrayList<>(25);

        public enum STATE {
            Menu,
            Help,
            Game
        };

        public STATE gameState = STATE.Game;

        public Game() {
            rnd = new Random();
            SwingUtilities.invokeLater(new Runnable() {
                @Override
                public void run() {
                    start();
                }
            });
        }

        @Override
        public Dimension getPreferredSize() {
            return new Dimension(WIDTH, HEIGHT);
        }

        public synchronized void start() {
            thread = new Thread(this);
            thread.start();
            running = true;
        }

        public synchronized void stop() {
            try {
                thread.join();
                running = false;
            } catch (Exception ex) {
                ex.printStackTrace();
            }
        }

        public void run() {
            this.requestFocus();
            long lastTime = System.nanoTime();
            double amountOfTicks = 60.0;
            double ns = 1000000000 / amountOfTicks;
            double delta = 0;
            long timer = System.currentTimeMillis();
            int frames = 0;
            while (running) {
                long now = System.nanoTime();
                delta += (now - lastTime) / ns;
                lastTime = now;
                while (delta >= 1) {
                    tick();
                    delta--;
                }
                if (running) {
                    update();
                    render();
                }
                frames++;

                if (System.currentTimeMillis() - timer > 1000) {
                    timer += 1000;
                    //System.out.println("FPS: "+ frames);
                    frames = 0;
                }
            }
            stop();
        }

        private void tick() {
            //hud.tick();
        }

        protected void update() {
            if (gameState == STATE.Game) {
                if (rnd.nextBoolean()) {
                    System.out.println("New...");
                    int x = rnd.nextInt(getWidth() - Rock.SIZE);
                    int y = rnd.nextInt(getHeight() - Rock.SIZE);
                    int lifeSpan = 4000 + rnd.nextInt(6000);
                    entities.add(new Rock(lifeSpan, x, y));
                }
                List<Entity> toRemove = new ArrayList<>(entities.size());
                List<Entity> control = Collections.unmodifiableList(entities);
                for (Entity entity : entities) {
                    if (entity.update(control, this) == EntityAction.REMOVE) {
                        System.out.println("Die...");
                        toRemove.add(entity);
                    }
                }
                entities.removeAll(toRemove);
            }
        }

        private void render() {
            BufferStrategy bs = this.getBufferStrategy();
            if (bs == null) {
                this.createBufferStrategy(3);
                return;
            }

            Graphics2D g = (Graphics2D) bs.getDrawGraphics();
            long now = System.currentTimeMillis();

            g.setColor(new Color(87, 124, 212));
            g.fillRect(0, 0, WIDTH, HEIGHT);
            if (gameState == STATE.Game) {
                g.setColor(new Color(209, 155, 29));
                if (gameState == STATE.Game) {
                    for (Entity entity : entities) {
                        entity.render(g, this);
                    }
                }

                g.dispose();
                bs.show();
            }
        }

        public static int clamp(int var, int min, int max) {
            if (var >= max) {
                return var = max;
            } else if (var <= max) {
                return var = min;
            } else {
                return var;
            }
        }
    }

    public interface Renderable {

        public void render(Graphics2D g2d, Component parent);
    }

    public enum EntityAction {
        NONE,
        REMOVE;
    }

    public interface Entity extends Renderable {

        // In theory, you'd pass the game model which would determine
        // all the information the entity really needed 
        public EntityAction update(List<Entity> entities, Component parent);
    }

    public static class Rock implements Renderable, Entity {

        protected static final int SIZE = 20;

        private int lifeSpan;
        private long birthTime;

        private int x, y;

        public Rock(int lifeSpan, int x, int y) {
            if (lifeSpan <= 1500) {
                throw new IllegalArgumentException("Life span for a rock can not be less then or equal to 1.5 seconds");
            }
            this.lifeSpan = lifeSpan;
            birthTime = System.currentTimeMillis();
            this.x = x;
            this.y = y;
        }

        @Override
        public void render(Graphics2D g2d, Component parent) {
            long age = System.currentTimeMillis() - birthTime;
            if (age < lifeSpan) {
                if (age < lifeSpan - 1500) {
                    g2d.setColor(Color.BLUE);
                } else {
                    g2d.setColor(Color.RED);
                }
                g2d.fillOval(x, y, SIZE, SIZE);
            }
        }

        @Override
        public EntityAction update(List<Entity> entities, Component parent) {
            EntityAction action = EntityAction.NONE;
            long age = System.currentTimeMillis() - birthTime;
            System.out.println("Age = " + age + "; lifeSpan = " + lifeSpan);
            if (age >= lifeSpan) {
                action = EntityAction.REMOVE;
            }
            return action;
        }

    }

}