Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/379.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
游戏“;“最需要速度”;can';Java类机器人控制的t_Java - Fatal编程技术网

游戏“;“最需要速度”;can';Java类机器人控制的t

游戏“;“最需要速度”;can';Java类机器人控制的t,java,Java,我用Java机器人编写了一个控制赛车游戏的机器人。除了“向下”键(向上、向左、向右键工作得很好)外,机器人在需要地下速度时工作得很好。然而,我的机器人无法控制最需要的速度 机器人运行良好,但游戏不接受模拟关键事件。我做了一些搜索,发现这个游戏是基于DirectX的。在DirectX中,键盘/鼠标事件是特殊的。游戏似乎是直接“询问”键盘,而不是通过Windows。我在CS中尝试了我的程序,发现它运行得很好 我使用Eclipse和Java1.6在Windows7中编程。所以我想问为什么不需要速度最想

我用Java机器人编写了一个控制赛车游戏的机器人。除了“向下”键(向上、向左、向右键工作得很好)外,机器人在需要地下速度时工作得很好。然而,我的机器人无法控制最需要的速度

机器人运行良好,但游戏不接受模拟关键事件。我做了一些搜索,发现这个游戏是基于DirectX的。在DirectX中,键盘/鼠标事件是特殊的。游戏似乎是直接“询问”键盘,而不是通过Windows。我在CS中尝试了我的程序,发现它运行得很好


我使用Eclipse和Java1.6在Windows7中编程。所以我想问为什么不需要速度最想要的接受模拟关键事件,以及如何解决这个程序?谢谢。

据我所知,DirectX不依赖Windows生成的事件来接收键盘输入。因此,发射模拟事件对您不起作用。我认为你不能做你想做的事

我写了一个机器人来控制比赛 游戏使用Java机器人

要生成哪些关键事件

用于Java Robot的模拟关键事件 像“VK_Up”, VK_向下,VK_向左,VK_向右”,需要 “速度头号通缉犯”被忽略。但是 对于“A-Z”键,游戏接受

当您应该使用keyPressed和KeyRelease时,您可能正在尝试生成keyTyped事件

下面是一个使用右/左/上下键的简单示例。尝试输入(1、2、3),然后返回到开头并输入(0)。然后按播放按钮

import java.awt.*;
import java.awt.event.*;
import java.util.ArrayList;
import java.util.List;
import javax.swing.*;

public class RobotPlayback extends JFrame implements KeyListener, ActionListener
{
    JTextField textField1;
    JTextField textField2;
    List playback = new ArrayList();

    public RobotPlayback()
    {
        textField1 = new JTextField(30);
        textField1.addKeyListener( this );
        getContentPane().add(textField1, BorderLayout.NORTH);
//
        JButton button = new JButton("Playback");
        button.addActionListener( this );
        button.setFocusable(false);
        getContentPane().add(button);
//
        textField2 = new JTextField(30);
        getContentPane().add(textField2, BorderLayout.SOUTH);
    }

    public void keyPressed(KeyEvent e)
    {
        playback.add(e);
    }

    public void keyReleased(KeyEvent e)
    {
        playback.add(e);
    }

    public void keyTyped(KeyEvent e) {}

    public void actionPerformed(ActionEvent e)
    {
        Thread playback = new Thread()
        {
            public void run()
            {
                 playback();
            }
        };
        playback.start();
    }

    private void playback()
    {
        textField2.requestFocus();

        try
        {
            Robot robot = new Robot();
            robot.setAutoDelay( 200 );

            for (int i = 0; i < playback.size();i++)
            {
                KeyEvent event = (KeyEvent)playback.get(i);

                if (event.getID() == KeyEvent.KEY_PRESSED)
                    robot.keyPress( event.getKeyCode() );
                else
                    robot.keyRelease( event.getKeyCode() );
            }
        }
        catch(Exception exc)
        {
            System.out.println(exc);
        }

        setVisible(true);
        playback = new ArrayList();
        textField1.requestFocus();
    }

    public static void main(String[] args)
        throws Exception
    {
        JFrame frame = new RobotPlayback();
        frame.setDefaultCloseOperation( JFrame.EXIT_ON_CLOSE );
        frame.pack();
        frame.setLocationRelativeTo( null );
        frame.setVisible( true );
     }
}
import java.awt.*;
导入java.awt.event.*;
导入java.util.ArrayList;
导入java.util.List;
导入javax.swing.*;
公共类RobotPlayback扩展了JFrame实现了KeyListener、ActionListener
{
JTextField textField1;
JTextField textfield 2;
列表播放=新建ArrayList();
公共机器人播放()
{
textField1=新的JTextField(30);
textField1.addKeyListener(这个);
getContentPane().add(textField1,BorderLayout.NORTH);
//
JButton按钮=新JButton(“回放”);
addActionListener(这个);
按钮。设置可聚焦(假);
getContentPane().add(按钮);
//
textField2=新的JTextField(30);
getContentPane().add(textField2,BorderLayout.SOUTH);
}
按下公共无效键(按键事件e)
{
回放。添加(e);
}
公共无效密钥已释放(密钥事件e)
{
回放。添加(e);
}
public void keyTyped(KeyEvent e){}
已执行的公共无效操作(操作事件e)
{
线程播放=新线程()
{
公开募捐
{
播放();
}
};
playback.start();
}
私有void回放()
{
textField2.requestFocus();
尝试
{
机器人=新机器人();
机器人。设置自动延迟(200);
对于(int i=0;i
我刚刚在这家银行登记了账户 早上好,只有11个名声。不 足够投票了


即使得了11分,如果答案回答了你的问题,你也应该能够“接受”它。

Java机器人在使用箭头键时有一个bug。它将按下数字键盘箭头。目前,无法按非数字键盘箭头


参考:

虽然这是一个老问题,但我会发布我的答案,以防以后它能帮助别人

我最近也遇到了同样的问题。我根据一些外部输入,依次调用keyPress和keyprelease以获得左键、右键、上键和下键。我尝试了很多游戏,但是机器人按键在其中任何一个游戏中都不起作用。当我在文本文件中使用光标尝试相同的代码时,光标正确移动

问题是,游戏通常需要连续按键,因此按键+按键释放组合不会产生任何效果。因此,我修复了这个问题,每次按箭头键时,我都会按相反的方向调用keyRelease

例如,如果需要按左箭头键,我会调用

keyerelease(KeyEvent.VK_RIGHT)
按键(KeyEVent.VK_左)

这会一直按住左键,直到最终需要按下右箭头键。通过跟踪最后一次按键等方式,有更多的最佳方法来实现这一点,但这种方法似乎工作得很好。

我知道这是一篇非常古老的帖子,但我的答案可能对正在寻找答案的人有所帮助

回答:-

这是因为有些游戏使用DirectInputAPI来读取键盘扫描代码,而不是虚拟键代码。由于java.awt.Robot通过虚拟键代码而不是扫描代码执行击键,因此使用java.awt.Robot模拟的键盘事件可能不会对游戏产生影响。您必须使用JNI/JNA从java应用程序进行Windows本机调用

代码在这里可用


不我怎么能在游戏中作弊呢?我一直在调试我的程序直到最后一分钟。大惊喜发现!Java机器人的模拟密钥e
Keyboard keyboard = new Keyboard();
keyboard.winKeyPress(ScanCode.DIK_UP);
//Thread.sleep(1000);
keyboard.winKeyRelease(ScanCode.DIK_UP);