Java змейка. Как ускорять змейку в зависимости от съеденного
Делаю свою первую игру, пока максимально простая, но всё же.
Пытаюсь привязать к счёту (кол-во съеденых домиков) и каждые 10 домиков чуть увеличивать скорость змейки, но либо скорость не меняется, либо змея за доли секунды улетает за поле. Мой код ниже, как можно увеличить скорость змейки в зависимости от кол-ва съеденного?
public class GameField extends JPanel implements ActionListener{
private final int SIZE = 496;
private final int DOT_SIZE = 16;
private final int ALL_DOTS = 961;
private Image body;
private Image home;
private Image headr;
private Image headl;
private Image headu;
private Image headd;
private int homeX;
private int homeY;
private int dots;
private final int[] x = new int[ALL_DOTS];
private final int[] y = new int[ALL_DOTS];
private Timer timer;
private boolean left = false;
private boolean right = true;
private boolean up = false;
private boolean down = false;
private boolean inGame = true;
private boolean esc = false;
private int score = 0;
public GameField() {
setBackground(Color.white);
loadImages();
initGame();
addKeyListener(new FieldKeyListener());
setFocusable(true);
}
public void initGame() {
dots = 3;
for (int i = 0; i < dots; i++) {
x[i] = 48 - i * DOT_SIZE;
y[i] = 48;
}
int delay = 250;
timer = new Timer(delay, this);
timer.start();
createHome();
}
private void createHome() {
homeX = new Random().nextInt(32)*DOT_SIZE;
homeY = new Random().nextInt(32)*DOT_SIZE;
}
public void loadImages() {
ImageIcon iia = new ImageIcon("C:\\Users\\Lebed\\Desktop\\Snake_V2.0\\images\\SnakeHome.jpg");
home = iia.getImage();
ImageIcon iid = new ImageIcon("C:\\Users\\Lebed\\Desktop\\Snake_V2.0\\images\\SnakeBody.jpg");
body = iid.getImage();
ImageIcon iihr = new ImageIcon("C:\\Users\\Lebed\\Desktop\\Snake_V2.0\\images\\GOLOVAR.png");
headr = iihr.getImage();
ImageIcon iihl = new ImageIcon("C:\\Users\\Lebed\\Desktop\\Snake_V2.0\\images\\GOLOVAL.png");
headl = iihl.getImage();
ImageIcon iihu = new ImageIcon("C:\\Users\\Lebed\\Desktop\\Snake_V2.0\\images\\GOLOVAU.png");
headu = iihu.getImage();
ImageIcon iihd = new ImageIcon("C:\\Users\\Lebed\\Desktop\\Snake_V2.0\\images\\GOLOVAD.png");
headd = iihd.getImage();
}
@Override
public void paintComponent(Graphics g) {
super.paintComponent(g);
doDrawing(g);
}
private void doDrawing(Graphics g) {
if(inGame) {
g.fillRect(0, 0, 512, 512);
}
if (inGame) {
String str = "Счёт: " + score;
Font f = new Font("ITALIC", Font.BOLD, 15);
g.setColor(Color.BLACK);
g.setFont(f);
g.drawString(str, 8, 528);
}
if(inGame) {
g.drawImage(home,homeX,homeY,this);
for (int i = 0; i < dots; i++) {
if (x[i] == homeX && y[i] == homeY && i == 0) {
score += 1; //считает скорость
}
if (i == 0 && right) {
g.drawImage(headr, x[i], y[i], this);
} else {
if (i == 0 && left) {
g.drawImage(headl, x[i], y[i], this);
} else {
if (i == 0 && up) {
g.drawImage(headu, x[i], y[i], this);
} else {
if (i == 0 && down) {
g.drawImage(headd, x[i], y[i], this);
} else {
g.drawImage(body, x[i], y[i], this);
}
}
}
}
}
} else {
g.fillRect(0, 0, 512, 512);
String str = "Game over!!!"; //press F1 for new game
Font f = new Font("ITALIC", Font.BOLD, 40);
g.setColor(Color.WHITE);
g.setFont(f);
g.drawString(str, 120, SIZE/2);
String str2 = "press F1 for new game";
Font f2 = new Font("ITALIC", Font.BOLD, 20);
g.setColor(Color.GREEN);
g.setFont(f2);
g.drawString(str2, 135, 300);
}
if(esc) {
String str = "PAUSE";
Font f = new Font("ITALIC", Font.BOLD, 40);
g.setColor(Color.WHITE);
g.setFont(f);
g.drawString(str, 170, SIZE/2);
timer.stop();
}
}
public void move() {
for (int i = dots; i > 0; i--) {
x[i] = x[i-1];
y[i] = y[i-1];
}
if(left) {
x[0] -= DOT_SIZE;
}
if(right) {
x[0] += DOT_SIZE;
} if(up) {
y[0] -= DOT_SIZE;
} if(down) {
y[0] += DOT_SIZE;
}
}
public void checkHome(){
if(x[0] == homeX && y[0] == homeY) {
dots++;
createHome();
}
}
public void checkCollisions(){
for (int i = dots; i > 0 ; i--) {
if (i > 4 && x[0] == x[i] && y[0] == y[i]) {
inGame = false;
break;
}
}
if(x[0] > SIZE) {
inGame = false;
}
if(x[0] < 0) {
inGame = false;
}
if(y[0] > SIZE) {
inGame = false;
}
if(y[0] < 0) {
inGame = false;
}
}
@Override
public void actionPerformed(ActionEvent e) {
if(inGame) {
checkHome();
checkCollisions();
move();
}
repaint();
}
public void closeRunningWindow(KeyEvent e) {
JComponent comp = (JComponent) e.getSource();
Window win = SwingUtilities.getWindowAncestor(comp);
win.dispose();
}
public void startAgain() {
EventQueue.invokeLater(() -> {
MainWindow mw = new MainWindow();
});
}
class FieldKeyListener extends KeyAdapter {
@Override
public void keyPressed( KeyEvent e ) {
super.keyPressed(e);
int key = e.getKeyCode();
if (key == KeyEvent.VK_LEFT && ! right) {
left = true;
up = false;
down = false;
}
if (key == KeyEvent.VK_RIGHT && ! left) {
right = true;
up = false;
down = false;
}
if (key == KeyEvent.VK_UP && ! down) {
up = true;
right = false;
left = false;
}
if (key == KeyEvent.VK_DOWN && ! up) {
down = true;
right = false;
left = false;
}
if ((!esc) && (key == KeyEvent.VK_ESCAPE)) {
esc = true;
} else {
if(esc && key == KeyEvent.VK_ESCAPE) {
timer.restart();
esc = false;
}
}
if (key == KeyEvent.VK_F1) {
closeRunningWindow(e);
startAgain();
}
}
}