我应该如何在高级Java游戏中输入按键/鼠标?


9

我是一个自学成才的程序员,所以我不知道正确的做事方法。我制作了一些简单的游戏,例如小行星和蛇,但是在这些游戏中,您可以轻松修改keyevent函数中的变量。这是我在简单的Asteroids游戏中的操作方法:

/*
* key listener events
*/
public void keyReleased(KeyEvent k){
    int keyCode = k.getKeyCode();

    switch(keyCode){

        case KeyEvent.VK_LEFT:
            turnLeft = false;
            break;

        case KeyEvent.VK_RIGHT:
            turnRight = false;
            break;

        case KeyEvent.VK_UP:
            accel = false;
            break;

        case KeyEvent.VK_1:
            cls = true;
            break;
        case KeyEvent.VK_ENTER:
            break;
        case KeyEvent.VK_SPACE:
            fire = false;
    }
}
public void keyTyped(KeyEvent K){}
public void keyPressed(KeyEvent k){
    int keyCode = k.getKeyCode();

    switch(keyCode){

        case KeyEvent.VK_LEFT:
            turnLeft = true;
            break;

        case KeyEvent.VK_RIGHT:
            turnRight = true;
            break;

        case KeyEvent.VK_UP:
            accel = true;
            break;

        case KeyEvent.VK_1:
            cls = false;
            break;
        case KeyEvent.VK_ENTER:
            clearAllBullets();
            break;
        case KeyEvent.VK_SPACE:
            fire = true;
    }
}

如果要制作更高级的游戏(带有主菜单,选项,主游戏等),应该如何进行按键/鼠标输入?

另外,如果我要参加单人游戏,是否应该将所有游戏代码都放在一个类中?有没有一种方法可以将单个播放器代码放入一个单独的类中,并且按键输入仍会以某种方式修改变量等?


+1您的答案使我从bearcdp的答案中学到了新东西。感谢您的询问!=)
Will Marcouiller 2011年

Answers:


3

我不是专家,不过我建议同时将控件和业务/游戏/菜单(命名)逻辑分开。

我已经回答了一个类似的问题,关于在具有类设计的游戏中为Snake提供指导。Java是一种面向对象的语言,我想您能够编写足够的类和东西。然后,当您编写了对象类后,如果是这样,则您的对象需要对某些键和鼠标单击做出反应,我将使用一个Controller类,该类知道当前在屏幕上显示的内容,然后告诉该对象它应该做什么根据所按下的键或所单击的区域来执行操作。

这是指向我告诉您的问题的链接,我回答了有关将控件与对象逻辑分离的问题。它还包括一个说明我的想法的代码示例。

使用类在XNA中移动我的Sprite

不幸的是,OP尚未接受任何答案,因此我们不确定它是否解决了他的担忧。此外,我一直在设计这种方式,到目前为止为止没有发现任何麻烦。

现在我知道了,它被标记为XNA。这个构想或设计比使用的技术更高的体系结构级别,因此该设计可以简单地适应Java语法。总体思路保持不变。=)

我希望这会有所帮助!只要有空,我将很乐意为您提供进一步的帮助!=)


5

威尔的答案向您展示了最灵活,最直接的方法,如果您需要直接输入轮询,我建议您这样做。

但是,如果您需要一种简便的方法来检查按钮的不同组合,同时又避免了大量的切换和if语句,则可以使用位标志枚举。

我不知道您对位向量的了解,所以这里有一个概述:基本上,您有一个枚举类,表示所有可能的键。每个枚举应具有一个与整数位相对应的值。(即:0x0001、0x0002、0x0004、0x0008、0x0010、0x0011、0x0012、0x0014等)。(使用Java进行链接)。

现在,由于您可以传递多达32个(如果使用long则为64个)键的信息,因此您可以具有一个散列表,该散列表将位向量(int或long)与属于某种KeyComboCallback接口的对象相关联,该接口只包含一个单个方法调用Do(),当按下相关的键组合时会调用它。

现在,当您实例化/初始化播放器对象或菜单对象时,您可以调用某种输入管理器,并将所需的所有键组合位向量传递给它,并将它们与匿名内部类相关联。

// ... in your init code for Player

InputManager.map(
    KeyMap.A.val() | KeyMap.B.val() | KeyMap.C.val(), 
    new KeyComboCallback(KeyMap keys) {
        public void Do() {
           this.DoCrazyAwesomeComboAttack();
        }
    });

// ...  continue init

在C ++和C#中,这确实非常快捷,方便,但是Java枚举是特殊的,因此您可能会发现创建KeyCombination类或存储所有这些信息而不用担心枚举的东西会更方便。但是想法还是一样。我在XNA游戏中使用此工具,我非常喜欢该工具。您也可以使用它来分隔输入区域,这对于分别比较键盘或游戏手柄的不同部分很有用(对于一个键盘上的两个演奏者可能很有用)。


我喜欢您的帖子,尤其是“ this.DoCrazyAwesomeComboAttack();” XD。您的路径似乎是处理复杂内容的更好方法,因此我将坚持使用较简单的内容。感谢您的帮助!
史蒂文·罗杰斯

+1非常有趣的答案!我从这个答案中学到了东西,当我有更多时间花在业余爱好游戏开发上时,请多加注意。并且感谢您告诉我我的答案很好,尽管它是针对更简单的内容的,我不会争论,因为我是GD的初学者。=)谢谢!
Will Marcouiller 2011年
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.