snake/src/main/dev/lh/ui/GameWindow.java

97 lines
2.2 KiB
Java

package dev.lh.ui;
import java.awt.Color;
import java.awt.Dimension;
import java.awt.Graphics;
import java.awt.Rectangle;
import java.awt.Toolkit;
import java.awt.event.KeyAdapter;
import java.awt.event.KeyEvent;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.Timer;
import dev.lh.FoodFactory;
import dev.lh.Snake;
import dev.lh.Snake.Direction;
public class GameWindow extends JFrame {
private static final long serialVersionUID = 1L;
private Snake s = new Snake(7);
private FoodFactory foodFactory = FoodFactory.getInstance();
public GameWindow(String title) {
super(title);
newFood();
Dimension size = Toolkit.getDefaultToolkit().getScreenSize();
setBounds(new Rectangle(size));
setLocationRelativeTo(null);
setMinimumSize(size);
setPreferredSize(size);
setMaximumSize(size);
setExtendedState(JFrame.MAXIMIZED_BOTH);
setResizable(false);
setDefaultCloseOperation(EXIT_ON_CLOSE);
add(new JPanel() {
private static final long serialVersionUID = 1L;
@Override
protected void paintComponent(Graphics g) {
super.paintComponent(g);
g.setColor(Color.black);
g.fillRect(0, 0, super.getWidth(), super.getHeight());
s.render(g);
foodFactory.paintFood(g);
}
});
addKeyListener(new KeyAdapter() {
@Override
public void keyPressed(KeyEvent e) {
super.keyPressed(e);
switch (e.getKeyCode()) {
case KeyEvent.VK_W:
case KeyEvent.VK_UP:
s.setRichtung(Direction.Up);
break;
case KeyEvent.VK_A:
case KeyEvent.VK_LEFT:
s.setRichtung(Direction.Left);
break;
case KeyEvent.VK_S:
case KeyEvent.VK_DOWN:
s.setRichtung(Direction.Down);
break;
case KeyEvent.VK_D:
case KeyEvent.VK_RIGHT:
s.setRichtung(Direction.Right);
break;
}// switch
}// keypressed
});// keylistener
Timer timer = new Timer(50, (evt) -> {
s.tick();
if(System.currentTimeMillis()>=foodFactory.getTimeOfNextFood()) newFood();
repaint();
});
timer.start();
setVisible(true);
}
public void newFood() {
foodFactory.generateFood();
foodFactory.generateFoodLocation(super.getWidth(), super.getHeight());
}
public void close() {
dispose();
}
}