【发布时间】:2013-05-31 20:23:44
【问题描述】:
我决定使用 Swing 的绘画技术 paintComponent() 方法重新编写我的游戏(SO 上的某个人实际上告诉我使用这种方法)。我决定使用 JPanel 而不是 Canvas 作为游戏的基础。我之前编写的游戏使用 Canvas,但该游戏无法显示在我的 64 位桌面上,但可以显示在我的 32 位 labtop 上,这就是为什么必须重新编写这款游戏。
现在的问题是,虽然船的运动正常,但与我之前使用 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
}
}
【问题讨论】:
-
对我来说,这似乎很奇怪。您的 Ship 扩展了 JLabel,并且您在 JLabel 中渲染 Ship 的图像位置。 JLable 能够渲染自己的图像。但是,您实际上应该在位置 0x0 处渲染图像,并允许标签的容器决定实际渲染它的位置。
-
我可能应该扩展 JComponent。正确的?我认为在编程中你必须显式地调用方法。当你说 0x0 时,你的意思是 (0,0)?想法是将一些 JLabel 对象放置在 JFrame 之上并使用 keyListeners 控制它
-
0x0 应该是组件的左上角。组件大小应该是图片的大小
标签: java graphics paintcomponent paint