Змейка на Java проблема с timer
Пишу змейку.
Проблема в том, что сама змейка из 3х блоков не начинает движение.
timer delay стоит 250 и по прошествии 250мс программа просто заканчивается.
Задумано так, что при запуске она просто поползёт вправо и далее можно будет ею управлять, но до этого не доходит.
import javax.swing.*;
import java.awt.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.KeyAdapter;
import java.awt.event.KeyEvent;
import java.util.Random;
public class SneakyField extends JPanel implements ActionListener {
private final int Size = 320;
private final int dotSize = 16;
private final int allDots = 400;
private Image dot;
private Image apple;
private int appleX;
private int appleY;
private int[] x = new int[allDots];
private int[] y = new int[allDots];
private int dots;
private Timer timer;
private boolean left = false;
private boolean right = true;
private boolean up = false;
private boolean down = false;
private boolean inGame = true;
public SneakyField() {
setBackground(Color.BLACK);
loadImages();
initGame();
addKeyListener(new FieldKeyListener());
setFocusable(true);
}
public void initGame() {
dots = 3;
for (int i = 0; i < dots; i++) {
x[i] = 48 - i * dotSize;
y[i] = 48;
}
timer = new Timer(250, this);
timer.start();
createApple();
}
public void createApple() {
appleX = new Random().nextInt(20) * dotSize;
appleY = new Random().nextInt(20) * dotSize;
}
public void loadImages() {
ImageIcon iia = new ImageIcon("src/dot.png");
dot = iia.getImage();
ImageIcon iia2 = new ImageIcon("src/apple.png");
apple = iia2.getImage();
}
@Override
protected void paintComponent(Graphics g) {
super.paintComponent(g);
if (inGame) {
g.drawImage(apple, appleX, appleY, this);
for (int i = 0; i < dots; i++) {
g.drawImage(dot, x[i], y[i], this);
}
}
else {
String str = "Game Over";
//Font f = new Font("Arial",14,Font.BOLD);
g.setColor(Color.WHITE);
//g.setFont(f);
g.drawString(str, 125, Size/2);
}
}
public void move() {
for (int i = dots; i > 0; i--) {
x[i] = x[i - 1];
y[i] = y[i - 1];
}
if (left) {
x[0] -= dotSize;
}
if (right) {
x[0] += dotSize;
}
if (up) {
y[0] -= dotSize;
}
if (down) {
y[0] += dotSize;
}
}
public void checkApple() {
if (x[0] == appleX && y[0] == appleY) {
{
dots++;
if (dots % 5 == 0) {
timer.setDelay(timer.getDelay() - 50);
}
createApple();
}
}
}
public void checkCollisions() {
for (int i = dots; i > 0; i--) {
if (i > 4 && x[0] == x[i] && y[0] == y[i]) {
inGame = false;
}
}
if (x[0] > Size) {
inGame = false;
}
if (x[0] > 0) {
inGame = false;
}
if (y[0] > Size) {
inGame = false;
}
if (x[0] > 0) {
inGame = false;
}
}
@Override
public void actionPerformed(ActionEvent e) {
if (inGame) {
move();
checkApple();
checkCollisions();
}
repaint();
}
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;
left = false;
right = false;
}
if (key == KeyEvent.VK_DOWN && !up) {
down = true;
left = false;
right = false;
}
}
}
}
Ответы (1 шт):
Автор решения: Legend Developer
→ Ссылка
Возможно проблема с управлением. Попробуй создать, и подключить класс game.java, пиши в нём это, и предыдущий код в первом файле:
private class MyKey implements KeyListener
{
@Override
public void keyPressed(KeyEvent e) {
int key = e.getKeyCode();// определяем код нажатой клавиши
if (key == KeyEvent.VK_LEFT)myGame.new_napr = 0;
if (key == KeyEvent.VK_RIGHT)myGame.new_napr = 1;
if (key == KeyEvent.VK_UP)myGame.new_napr = 2;
if (key == KeyEvent.VK_DOWN)myGame.new_napr = 3;
}
@Override
public void keyReleased(KeyEvent arg0) {
// TODO Auto-generated method stub
}
@Override
public void keyTyped(KeyEvent arg0) {
// TODO Auto-generated method stub
}
}
Код второго файла:
if (napr == 0) // влево
{
if(gX-1>=0)
gX--;
else
gX = 29;
}
if (napr == 2) {
if(gY-1>=0)
gY--;
else
gY = 29;
}
else
if (napr == 1)
{
if(gX+1<=29)
gX++;
else
gX = 0;
}
else
if (napr == 3)
{
if(gY+1<=29)
gY++;
else
gY = 0;
}