Я решил переписать свою игру с использованием метода рисования PaintComponent() Swing's (кто-то из SO на самом деле сказал мне использовать этот метод). Я решил использовать JPanel в качестве базы игры вместо Canvas. В моей предыдущей письменной игре используется Canvas, но игра не может появиться на моем 64-битном рабочем столе, но может появиться на моей 32-битной labatop, поэтому эту игру пришлось переписать.Медленное движение с использованием paintComponent method
Проблема сейчас, когда движение корабля работает, рисунок кажется ужасно медленным (если это не проблема с ноутбуком?) По сравнению с тем, что я делал до того, как использовалась техника рисования с двойной буферизацией AWT. Я провел целый день, но не мог понять, что может заставить корабль работать быстрее.
public class Ship extends JLabel implements KeyListener{
private Image image;
private boolean turnRight;
private int x;
private int y;
private int speed = 5;
private boolean turnLeft;
public Ship(int x, int y)
{
this.x = x;
this.y = y;
try {
image = ImageIO.read(new File("Ship/Ship.PNG"));
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
addKeyListener(this);
}
public Image getImage()
{
return image;
}
@Override
public void keyPressed(KeyEvent e) {
// TODO Auto-generated method stub
if(e.getKeyCode() == KeyEvent.VK_RIGHT)
{
x += speed;
setTurnRight(true);
setTurnLeft(false);
}
else if(e.getKeyCode() == KeyEvent.VK_LEFT)
{
x -= speed;
setTurnLeft(true);
setTurnRight(false);
}
// redraw yourself
repaint();
}
private void setTurnLeft(boolean turnLeft) {
// TODO Auto-generated method stub
this.turnLeft = turnLeft;
}
// swing custom painting
public void paintComponent(Graphics g)
{
if(x <= 0)
{
x = 0;
}
else if(x >= 610)
{
x = 610;
}
g.drawImage(getImage(), x, y, null);
}
public void setTurnRight(boolean turnRight)
{
this.turnRight = turnRight;
}
public boolean getTurnLeft()
{
return turnLeft;
}
public boolean getTurnRight()
{
return turnRight;
}
@Override
public void keyReleased(KeyEvent e) {
// TODO Auto-generated method stub
}
@Override
public void keyTyped(KeyEvent e) {
// TODO Auto-generated method stub
}
}
Для меня это кажется странным. Ваш корабль расширяет JLabel, и вы визуализируете положение изображения корабля в JLabel. JLable способен отображать свой собственный образ. Однако на самом деле вы должны визуализировать изображение в позиции 0x0 и разрешать контейнеру ярлыка определять, где его вообще можно визуализировать. – MadProgrammer
Я, вероятно, должен расширять JComponent. правильно? Я думал, что в программировании вы должны явно вызывать методы. Когда вы говорите 0x0, вы имеете в виду (0,0)?Идея состояла в том, чтобы объект JLabel размещался поверх JFrame и управлял им с помощью keyListeners – Nicholas
0x0 должен быть верхним/левым углом компонента. Размер компонентов должен быть размером изображения – MadProgrammer