我对java很新。我需要在java游戏上制作两个图像的动画。它意味着是一个太空飞船游戏,允许两个用户使用键盘控制对象。我已经部分实现了这个,但是我无法理解如何允许两个键盘控件,而且通过键盘输入移动的一个对象也会闪烁很多。
public class MainFrame extends JFrame implements KeyListener {
MainPanel mPanel;
MainPanel secondss;
MainPanel thirdss;
int speed = 5;
//ss facing north
int direction = 0;
MainFrame() {
setTitle("spaceship Game");
mPanel = new MainPanel("C:/img");
secondss = new MainPanel("C:/img");
setSize(1024, 768);
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
add(mPanel); // add MainPanel JPanel to JFrame
setVisible(true); // show class
add(secondSs);
add(thirdSs);
seconds.currentSs.setX(400);
secondSS.currentSs.setY(100);
}
public void actionPerformed( ActionEvent e )
{
if( e.getSource() == mPanel)
{
}
}
@Override
public void keyPressed(KeyEvent e) {
if (e.getKeyCode() == e.VK_LEFT) {
int x = mPanel.currentSs.getX() - speed;
mPanel.currentSs.setX(x);
}
if (e.getKeyCode() == e.VK_RIGHT) {
int x = mPanel.currentSs.getX() + speed;
mPanel.currentSs.setX(x);
}
if (e.getKeyCode() == e.VK_DOWN) {
int y = mPanel.currentSs.getY() + speed;
mPanel.currentSs.setY(y);
}
if (e.getKeyCode() == e.VK_UP) {
int y = mPanel.currentSs.getY() - speed;
mPanel.currentSs.setY(y);
}
//change image direction
mPanel.frame = direction;
}
public static void main(String[] args) {
MainFrame mainFrame = new MainFrame();
mainFrame.addKeyListener(mainFrame);
}
如果有人可以提供帮助或者如果没有指出我正确的方向,我将不胜感激。
答案 0 :(得分:4)
JFrame不能专注于KeyEvents,默认情况下永远不会对KeyEvents做出反应
调用setVisible(真);将所有JComponents添加到JFrame后,应该是最后一行代码行,
为什么有公共无效actionPerformed(ActionEvent e),必须生成expetion形式compilier
将JFrame创建为局部变量
将JPanel放入JFrame
覆盖JPanel的getPreferredSize,针对JFrame的setSize的instesad
然后调用pack()和setVisble(true)
将图像放入Java包
将图片放入JLabel
将NullLayout设置为JPanel(否则动画不可能)
将KeyBindings添加到JPanel,覆盖所需/必需的KeyEvents
答案 1 :(得分:3)
它意味着是一个太空飞船游戏,允许两个用户使用键盘控制对象
不要使用KeyListener。 Swing旨在与Key Bindings一起使用。
有关更多信息和示例,请参阅Motion Using the Keyboard。
KeyboardAnimation
示例演示了两个用户如何控制单个图像。
答案 2 :(得分:0)
嗯,你应该在这里改变很多:
setDoubleBuffered(true)
)paintImmediately(...)
在船舶移动时绘制船舶图像来强制执行更严格的绘画答案 3 :(得分:0)
根据我对这个问题的理解,玩家需要使用不同的键组与游戏进行交互,具体取决于你是玩家1还是玩家2.如果是这种情况,请实现KeyListener并覆盖以下方法,就像以下代码确实:
@Override
public void keyPressed(KeyEvent e) {
if (e.getKeyCode() == KeyEvent.VK_W)
playerOne_up = true;
if (e.getKeyCode() == KeyEvent.VK_S)
playerOne_down = true;
if (e.getKeyCode() == KeyEvent.VK_UP)
playerTwo_up = true;
if (e.getKeyCode() == KeyEvent.VK_DOWN)
playerTwo_down = true;
}
@Override
public void keyReleased(KeyEvent e) {
if (e.getKeyCode() == KeyEvent.VK_W)
playerOne_up = false;
if (e.getKeyCode() == KeyEvent.VK_S)
playerOne_down = false;
if (e.getKeyCode() == KeyEvent.VK_UP)
playerTwo_up = false;
if (e.getKeyCode() == KeyEvent.VK_DOWN)
playerTwo_down = false;
if (e.getKeyCode() == KeyEvent.VK_ENTER) {
if (!isStarted()) {
doInitializations();
setStarted(true);
}
}
if (e.getKeyCode() == KeyEvent.VK_ESCAPE) {
if (isStarted()) {
setStarted(false);
} else {
frame.dispose();
}
}
}
但是,在我的例子中,只允许上下移动(乒乓游戏)。玩家一使用W代表向上,S代表向下,而玩家二使用向上箭头键和向下箭头键。 booleans playerOne_up,playerOne_down等是其他方法的开关,用于查看对象是否需要在哪个方向上移动。