当前位置: 首页 > 知识库问答 >
问题:

Java-向游戏中添加控件的最佳方式

钦良弼
2023-03-14

我在用Java做一个2D游戏,我用KeyListener和一些布尔值来检测按键。但问题是,如果我按住一个键,玩家就不会移动半秒钟,然后开始移动。有人知道怎么修吗?

public void键按下(...){PlayerX+=3;}如有任何答复,不胜感激,谢谢。

共有1个答案

章誉
2023-03-14

在java中有多种处理游戏控件的方法,但我更喜欢的方法是包含一个名为…让我们说“key.class”

在key.class中我们可以拥有:

public class Key{
   // Creating the keys as simply variables
   public static Key up = new Key();
   public static Key down = new Key();
   public static Key left = new Key();
   public static Key special = new Key();

   /* toggles the keys current state*/
   public void toggle(){
       isDown =  !isDown;
   }

   public boolean isDown;
}

现在我们有了一个类,如果按下某些键,我们就可以访问它,但首先我们需要确保keys.isdown函数将正确切换。我们在实现KeyListener的类中这样做。

package game;
// Importing the needed packages
import java.awt.event.FocusEvent;
import java.awt.event.FocusListener;
import java.awt.event.KeyEvent;
import java.awt.event.KeyListener;
import java.awt.event.MouseEvent;
import java.awt.event.MouseListener;
import java.awt.event.MouseMotionListener;
import java.util.HashMap;

public class Controller implements KeyListener{
//Assigning the variable keys to actual letters
public Controller(Main main){
    bind(KeyEvent.VK_W, Key.up);
    bind(KeyEvent.VK_A, Key.left);
    bind(KeyEvent.VK_S, Key.down);
    bind(KeyEvent.VK_D, Key.right);
    bind(KeyEvent.VK_SPACE, Key.special);
    mainClass = main;
}

@Override
public void keyPressed(KeyEvent e) {
    other[e.getExtendedKeyCode()] = true;
    keyBindings.get(e.getKeyCode()).isDown = true;
}

@Override
public void keyReleased(KeyEvent e) {
    other[e.getExtendedKeyCode()] = false;
    keyBindings.get(e.getKeyCode()).isDown = false;
}

public boolean isKeyBinded(int extendedKey){
    return keyBindings.containsKey(extendedKey);
}

@Override
public void keyTyped(KeyEvent e) {
}


public void bind(Integer keyCode, Key key){
    keyBindings.put(keyCode, key);
}

public void releaseAll(){
    for(Key key : keyBindings.values()){
        key.isDown = false;
    }
}

public HashMap<Integer, Key> keyBindings = new HashMap<Integer, Key>();
public static boolean other[] = new boolean[256];

}

现在,这个类将为我们处理所有的键绑定,并且假设您的Canvas addKeyListener或您的游戏在其上运行的任何东西将起作用,并相应地更改键。up/down/left/right/special。

现在,最后一步是实现所有这些,以移动我们的角色有效和容易。

if(Key.up.isDown) y+=3;
if(Key.right.isDown) PlayerX += 3;
 类似资料:
  • 问题内容: 我到处环顾了很多,还没有找到将现有IntelliJ项目转换为Gradle的最佳解决方案。我在团队环境中工作,我们目前共享.ipr文件,因为我们要跟踪一些构建配置。最终,我们将摆脱那些偏爱Gradle的人,但是在Gradle转换完成之前,我不能搞砸太多。 同样,我们的Java源文件位于src目录的根目录中,而不是标准的src / main / java。 有什么方法可以将Gradle添加

  • 此外,我们的Java源文件位于src目录的根目录中,而不是标准的src/main/Java。 有没有一种方法,我可以添加Gradle到我的项目,不会让我删除和重新创建我的IntelliJ项目,也不会把其他人搞砸,当他们做一个Git拉动?

  • --小注意,我试图上传我的游戏图像来说明我的问题,但我还没有必要的声誉这样做。我对此表示赞同。 如何手动设置swing组件的最终大小和 如何使用布局管理器手动设置out组件的坐标

  • Spark Dataframes有一个方法每次添加一个新列。若要添加多列,需要一个的链。这是做这件事的最佳实践吗? 第二部分,在和的链中使用有哪些权衡? 我在某个地方读到过,在Spark DFs中使用可用的方法总是比推出自己的实现要好。如果我的论点错了,请让我知道。谢谢!欢迎所有的想法。

  • 本文向大家介绍Java控制台实现猜拳游戏小游戏,包括了Java控制台实现猜拳游戏小游戏的使用技巧和注意事项,需要的朋友参考一下 本文实例为大家分享了Java猜拳游戏的具体代码,供大家参考,具体内容如下 先来看一下效果图:  首先我们创建一个Person类,这个类有name和score两个属性,有play这个方法,源代码如下: 接下来是主程序入口: 源代码下载:Java猜拳游戏 以上就是本文的全部内

  • 问题内容: 我正在创建一个基本的2D游戏(以及游戏引擎),目前正在开发数据的文件格式。当然,要运行此游戏,我将需要缓存。我发现将游戏的所有数据都放在一个文件中是非常不专业的(只要文件采用某种缓存格式,就不一定要保存在单个文件中)。 所以这就是为什么我来这里问。我当时想做一个zip文件,但我觉得那根本不是最好的方法。我也在考虑做另一个二进制写程序,该写程序将具有标题(文件的类型,“位置”)和每个文件