Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/310.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何为多个关键侦听器创建JavaFX场景?_Java_Javafx_Keylistener - Fatal编程技术网

如何为多个关键侦听器创建JavaFX场景?

如何为多个关键侦听器创建JavaFX场景?,java,javafx,keylistener,Java,Javafx,Keylistener,所以我尝试创建一个Tron多人游戏,它有点像蛇。 无论如何,多人应该能够使用一个键盘玩这个游戏,但不同的按键组合可以在屏幕上引导他们的角色。一个玩家当前使用WASD键,另一个玩家使用箭头键 我的问题是,我使用一个FXML用Javafx场景生成器创建了一个场景。只有在创建了游戏之后,我才注意到场景生成器显然只支持一个键侦听器,因此目前只有一个玩家可以控制他们的游戏人物。 有没有办法解决这个问题?请提供帮助,以便一名玩家可以使用WASD键,另一名玩家可以使用箭头键导航。 我的问题与现有的解决方案不同

所以我尝试创建一个Tron多人游戏,它有点像蛇。 无论如何,多人应该能够使用一个键盘玩这个游戏,但不同的按键组合可以在屏幕上引导他们的角色。一个玩家当前使用WASD键,另一个玩家使用箭头键

我的问题是,我使用一个FXML用Javafx场景生成器创建了一个场景。只有在创建了游戏之后,我才注意到场景生成器显然只支持一个键侦听器,因此目前只有一个玩家可以控制他们的游戏人物。 有没有办法解决这个问题?请提供帮助,以便一名玩家可以使用WASD键,另一名玩家可以使用箭头键导航。 我的问题与现有的解决方案不同,因为蛇需要属于不同的玩家。仅检查是否同时按下了一个或两个按键输入是不够的,但需要检查是否是正确的玩家按下了输入,即使当时其他玩家也按下了他们的输入。 希望这能稍微澄清一下混乱

关键侦听器

 import java.util.ArrayList;

import javafx.scene.Scene;

public class Human extends Player implements Runnable{


int keyboardControlsLayout;
Scene scene;

public Human(int stepSize, String colour, int playerNum, Scene scene, 
           int keyboardControlsLayout) {
    super(stepSize, colour, playerNum);
    // keyboardControlsLayout(0) = WASD
    // keyboardControlsLayout(1) = ARROWS
    this.keyboardControlsLayout = keyboardControlsLayout;
    this.scene = scene;

}

@Override
public void run() {
    // TODO Auto-generated method stub

    while(this.getSnake().getAlive()) {

        if (keyboardControlsLayout == 1) {
            // use WASD
            System.out.println("wasd");

            scene.setOnKeyPressed(event -> {
                switch (event.getCode()) {
                    case W:
                        snake.setDirection(0);
                        break;
                    case S:
                        snake.setDirection(1);
                        break;
                    case A:
                        snake.setDirection(3);
                        break;
                    case D:
                        snake.setDirection(2);
                        break;
                    default:
                        break;
                }
                //System.out.println(event.getCode().toString());
            });


        } else if (keyboardControlsLayout == 0) {
            System.out.println("arrows");
            // use arrow keys
            scene.setOnKeyPressed(event -> {
                switch (event.getCode()) {
                    case UP:
                        snake.setDirection(0);
                        break;
                    case DOWN:
                        snake.setDirection(1);
                        break;
                    case LEFT:
                        snake.setDirection(3);
                        break;
                    case RIGHT:
                        snake.setDirection(2);
                        break;
                    default:
                        break;
                }
            });
        }


    }

}
 }
我在其中创建场景:

public void newGame() {
    System.out.println("<----- NEW GAME ----->");
    game = new Game(10, scene, numHumans);
    displayController.setUpDisplay(game);

    timer = new Timeline((new KeyFrame(
            Duration.millis(80),
            event -> {
                try {
                    timerTick();
                } catch (Exception e) {
                    // TODO Auto-generated catch 
                                         block
                    e.printStackTrace();
                }
            })));
    timer.setCycleCount(Animation.INDEFINITE);

    start();
}

private void start() {
// starts game and logic
}


private void loadDisplayFXMLLoader() {
    FXMLLoader displayFXMLLoader = new 
    FXMLLoader(getClass().getResource("DisplayView.fxml"));

    try {
        scene = new Scene(displayFXMLLoader.load(), 500, 525);
    } catch (IOException e) {
        Main.outputError(e);
    }

    displayController = displayFXMLLoader.getController();

}

private void loadScene() {
    this.setScene(scene);
    this.show();

    //error Handling and closing



}
public void newGame(){
System.out.println(“”);
游戏=新游戏(10,场景,裸人);
displayController.setUpDisplay(游戏);
计时器=新时间轴((新关键帧(
持续时间。毫秒(80),
活动->{
试一试{
timerTick();
}捕获(例外e){
//TODO自动生成的捕获
块
e、 printStackTrace();
}
})));
timer.setCycleCount(Animation.unfinite);
start();
}
私有void start(){
//开始游戏和逻辑
}
私有void loadDisplayFXMLLoader(){
FXMLLoader显示FXMLLoader=新建
FXMLLoader(getClass().getResource(“DisplayView.fxml”);
试一试{
场景=新场景(displayFXMLLoader.load(),500525);
}捕获(IOE异常){
主输出器(e);
}
displayController=displayFXMLLoader.getController();
}
私有void loadScene(){
这是一个场景;
this.show();
//错误处理和关闭
}
任何帮助都将不胜感激


谢谢

我不熟悉FXML,但我自己也使用javafx,它工作得很好。我调整了一个旧程序,以满足您的需要,如果您想尝试和测试它

import java.awt.BorderLayout;
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 yeet {

    private static JFrame frame;
    private static JPanel panel;

    private static int x = 300;
    private static int y = 300;
    private static int x1 = 500;
    private static int y1 = 500;

    private static boolean running = true;
    private static boolean moving = false;
    private static boolean moving1 = false;
    private static boolean up;
    private static boolean down;
    private static boolean right;
    private static boolean left;
    private static boolean up1;
    private static boolean down1;
    private static boolean right1;
    private static boolean left1;

    private static Timer refresh;
    private static Timer speed;

    private static Graphics g;

    public static void main(String[] args) {

        UI();



        ActionListener al = new ActionListener() {

            @Override
            public void actionPerformed(ActionEvent arg0) {
                if(moving && up) y--;
                if (moving && down) y++;
                if (moving && right) x++;
                if (moving && left) x--;

                if (moving1 && up1) y1--;
                if (moving1 && down1) y1++;
                if (moving1 && right1) x1++;
                if (moving1 && left1) x1--;

                panel.repaint();

            }

        };

        ActionListener al1 = new ActionListener() {

            @Override
            public void actionPerformed(ActionEvent arg0) {
                guy(g);
                laser(g);

            }

        };

        refresh = new Timer(0, al1);
        refresh.start();
        speed = new Timer (4, al);
        speed.start();



        while (running) {
            guy(g);
            laser(g);

        }

    }

    public static void guy(Graphics g) {
        g = panel.getGraphics();
        g.setColor(Color.green);
        g.drawRect(x, y, 25, 25);
        g.fillRect(x, y, 25, 25);

    }

    public static void laser (Graphics g) {
        g = panel.getGraphics();
        g.setColor(Color.red);
        g.drawRect(x1, y1, 30, 30);
        g.fillRect(x1, y1, 30, 30);
    }

    public static void UI () {

        frame = new JFrame("Multiple movement test");
        panel = new JPanel();

        panel.setBackground(Color.black);
        panel.setLayout(null);

        frame.setSize(600,600);
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        frame.setLayout(new BorderLayout());
        frame.setVisible(true);
        frame.setResizable(false);
        frame.setLocationRelativeTo(null);
        frame.addKeyListener(new KeyListener() {

            @Override
            public void keyPressed(KeyEvent e) {
                if (e.getKeyCode() == KeyEvent.VK_UP) {
                    moving = true;
                    up = true;

                    down = false;
                    right = false;
                    left = false;

                    refresh.start();
                    speed.start();
                }

                if (e.getKeyCode() == KeyEvent.VK_DOWN) {
                    moving = true;
                    down = true;

                    up = false;
                    right = false;
                    left = false;

                    refresh.start();
                    speed.start();
                }

                if (e.getKeyCode() == KeyEvent.VK_LEFT) {
                    moving = true;
                    left = true;

                    up = false;
                    down = false;
                    right = false;

                    refresh.start();
                    speed.start();
                }

                if (e.getKeyCode() == KeyEvent.VK_RIGHT) {
                    moving = true;
                    right = true;

                    left = false;
                    up = false;
                    down = false;

                    refresh.start();
                    speed.start();
                }

                if (e.getKeyCode() == KeyEvent.VK_W) {
                    moving1 = true;
                    up1 = true;

                    down1 = false;
                    right1 = false;
                    left1 = false;

                    refresh.start();
                    speed.start();
                }

                if (e.getKeyCode() == KeyEvent.VK_A) {
                    moving1 = true;
                    left1 = true;

                    up1 = false;
                    down1 = false;
                    right1 = false;


                    refresh.start();
                    speed.start();
                }

                if (e.getKeyCode() == KeyEvent.VK_S) {
                    moving1 = true;
                    down1 = true;

                    up1 = false;
                    right1 = false;
                    left1 = false;

                    refresh.start();
                    speed.start();
                }

                if (e.getKeyCode() == KeyEvent.VK_D) {
                    moving1 = true;
                    right1 = true;

                    up1 = false;
                    down1 = false;
                    left1 = false;

                    refresh.start();
                    speed.start();
                }

            }

            @Override
            public void keyReleased(KeyEvent arg0) {
                // TODO Auto-generated method stub

            }

            @Override
            public void keyTyped(KeyEvent arg0) {
                // TODO Auto-generated method stub

            }

        });

        frame.add(panel);

    }
}   

希望这有帮助

我喜欢用我发现的想法。他使用
ArrayList
进行输入。我喜欢使用
Set
。按下映射按钮后,将其添加到输入中。发布时,将其从输入中删除。其可能重复的问题与您指出的问题类似。但不完全一样,因为我不希望同时按下多个键。但听众可能会对两个剧本做出反应,我会看一看。谢谢你,塞德里克!我没有在副本中使用@James_D answer,但考虑到他的历史,我敢打赌它是有效的。我在分享的链接上使用了第一个想法。很好,谢谢你,亚历克斯。我的问题是,我需要为这些键分配某种“所有权”,因此,snake1被WASD键移动,snake2被箭头键移动。我不知道如何将其应用到您所写的内容中,但我会仔细考虑。不,问题是关于外汇,而不是Swing/awt