【问题标题】:Can I use a loop in order to go horizontally and vertically at the same time?我可以使用循环同时水平和垂直移动吗?
【发布时间】:2014-05-14 23:18:14
【问题描述】:

我正在制作这个简单的游戏(只是为了好玩),当我说简单时,我真的希望它简单。现在到目前为止,我有一个可以移动到任何我想移动的正方形。我正在使用 KeyListeners(工作得很好,我不想在当前项目中使用 KeyBindings),我想知道我是否可以只使用循环以使其同时水平和垂直运行。 在这段代码中,你可以看到我 attempt 放入循环,它在 while 下给了我一个错误:

令牌的语法错误,而

我有两个问题 1. 循环能完成我想要的吗? 如果没有,你有什么建议? 2.如果是,我的while循环有什么问题?

谢谢

我的代码:

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 javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.Timer;

public class MyGame extends JPanel implements ActionListener, KeyListener {
    Timer t = new Timer(5, this);
    int x = 0, y = 0, velx =0, vely =0, loop = 0;

    public MyGame() {
        t.start();
        addKeyListener(this);
        setFocusable(true);
        setFocusTraversalKeysEnabled(false);
    }

    public void paintComponent(Graphics g) {
        super.paintComponent(g);
        g.setColor(Color.RED);
        g.fillRect(x,y,50,30);
    }

    public void actionPerformed(ActionEvent e) {
        if(x < 0)
        {
            velx=0;
            x = 0;  
        }

        if(x > 530)
        {
            velx=0;
            x = 530;    
        }

        if(y < 0)
        {
            vely=0;
            y = 0;  
        }

        if(y > 330)
        {
            vely=0;
            y = 330;    
        }

        x += velx;
        y += vely;
        repaint();
    }
    while (loop = 0) {
    public void keyPressed(KeyEvent e) {
        int code = e.getKeyCode();

        if (code == KeyEvent.VK_DOWN){
            vely = 1;
            velx = 0;
        }
        if (code == KeyEvent.VK_UP){
            vely = -1;
            velx = 0;
        }
        if (code == KeyEvent.VK_LEFT){
            vely = 0;
            velx = -1;
        }
        if (code == KeyEvent.VK_RIGHT){
            vely = 0;
            velx = 1;
        }
    }
    public void keyTyped(KeyEvent e) {}
    public void keyReleased(KeyEvent e) {
        velx=0;
        vely=0;
    }}


    public static void main (String arge[]){

        JFrame f = new JFrame();
        MyGame s = new MyGame();
        f.add(s);
        f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        f.setSize(600,400);
        f.setVisible(true);

    }
}

【问题讨论】:

  • loop = 0。仔细看看。

标签: java loops keyboard focus paint


【解决方案1】:

首先,您不能在方法之外声明循环。 要解决您的问题,您应该删除循环并更改您的 vely/velx 分配。 要同时注册多个键,您应该只将一个变量设置为 1 或 -1,而保留另一个变量。

if (code == KeyEvent.VK_DOWN){
   vely = 1;
}

现在,由于您要注册多个键,您还必须在 keyreleased 方法中区分它们,您现在应该将适当的速度设置为 0,并让另一个保持原样。

【讨论】:

  • 等等什么?我不明白它是如何工作的,但它确实有效。这太奇怪了。谢谢
  • keypressed 每次按下一个键时都会被调用。删除 velx=0 将确保您不会覆盖另一个键的操作(只要它不更改相同的全局变量)。
  • 哦,哇,我从来不知道。我一直认为 x 和 y 都需要在那里,即使他们什么也没做。
【解决方案2】:

只需删除未在方法或构造函数中声明的while (loop = 0) {


我已经在完全相同的上下文中发布了完整的代码,以同时水平和垂直。

请看下面的帖子

【讨论】:

  • 谢谢,但是crisson 已经教会了我一个非常简单的出路。如果可以的话,我会投票给你的答案,但我不能。感谢您的帮助。
猜你喜欢
  • 1970-01-01
  • 2021-04-11
  • 2014-08-12
  • 1970-01-01
  • 1970-01-01
  • 2017-12-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多