Я хотел бы сделать игру в тетрис на Java.
Я использую таймер свинга, чтобы бросать плитки.Но проблема в том, что когда я пытаюсь перемещать свои плитки влево и вправо, скорость движения ограничивается значением задержки таймера.Плитки сбрасываются каждую секунду, поэтому я могу менять их положение только тогда, когда таймер сбрасывается и перерисовывается.Как я могу выполнить независимое второе действие или любой другой метод, который может помочь мне в этом случае, любая помощь очень ценится.
package gui;
import java.awt.Color;
import java.awt.Graphics;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.KeyEvent;
import java.awt.event.KeyListener;
import java.util.Random;
import javax.swing.ImageIcon;
import javax.swing.JPanel;
import javax.swing.Timer;
enum Shapes {
// T, S1, S2, K,L1, L2,
//above members will be left commented until other tiles are prepared
I;
public static Shapes getRandomShapes() {
Random random = new Random();
return values()[random.nextInt(values().length)];
}
}
public class Engine extends JPanel implements KeyListener, ActionListener {
private static final long serialVersionUID = 1L;
private int[] xPos = new int[800];
private int[] yPos = new int[800];
int moves = 0;
Timer timer;
int delay;
Engine() {
addKeyListener(this);
setFocusable(true);
setFocusTraversalKeysEnabled(false);
delay = 1000;
timer = new Timer(delay, this);
timer.start();
}
private boolean left;
private boolean right;
private void fall() {
yPos[0] += 30;
yPos[1] += 30;
yPos[2] += 30;
yPos[3] += 30;
}
public void paintComponent(Graphics g) {
super.paintComponent(g);
g.setColor(Color.WHITE);
g.drawRect(5, 5, 482, 842);
g.setColor(Color.BLACK);
g.fillRect(7, 7, 478, 838);
if (Shapes.getRandomShapes() == Shapes.I) {
if (moves == 0) {
xPos[0] = 60;
xPos[1] = 90;
xPos[2] = 120;
xPos[3] = 150;
yPos[0] = 6;
yPos[1] = 6;
yPos[2] = 6;
yPos[3] = 6;
moves++;
}
for (int x = 0; x < 4; x++) {
ImageIcon Iimage = new ImageIcon(Engine.class.getClassLoader().getResource("images/I.png"));
Iimage.paintIcon(this, g, xPos[x], yPos[x]);
}
}
g.dispose();
}
@Override
public void actionPerformed(ActionEvent e) {
// TODO Auto-generated method stub
timer.start();
fall();
if (left) {
xPos[0] -= 30;
xPos[1] -= 30;
xPos[2] -= 30;
xPos[3] -= 30;
left = false;
}
if (right) {
xPos[0] += 30;
xPos[1] += 30;
xPos[2] += 30;
xPos[3] += 30;
right = false;
}
repaint();
}
@Override
public void keyPressed(KeyEvent e) {
// TODO Auto-generated method stub
if (e.getKeyCode() == KeyEvent.VK_RIGHT) {
right = true;
}
if (e.getKeyCode() == KeyEvent.VK_LEFT) {
left = true;
}
}
}