我用Java Robot编写了一个用于控制赛车游戏的机器人.除了键"向下"(向上,向左,向右键工作得非常好)之外,机器人适用于极品飞车地下.但是我的机器人无法控制极品飞车最需要的速度.
机器人工作正常,但游戏不接受模拟的关键事件.我做了一些搜索,发现游戏是基于DirectX的.在DirectX中,键盘/鼠标事件是特殊的.似乎游戏直接"询问"键盘,而不是通过Windows.我在CS中尝试我的程序,发现它运行得很好.
我使用Eclipse和Java 1.6在Windows 7中编程.所以我想问为什么不需要速度最想要接受模拟的关键事件以及如何解决这个程序?谢谢.
我使用 Java Robot 编写了一个用于控制赛车游戏的机器人。
您会生成哪些关键事件?
对于Java Robot模拟的“VK_Up、VK_Down、Vk_Left、VK_Right”等按键事件,“极品飞车:最高通缉”被忽略。但是,对于“AZ”键,游戏接受了!
也许您在应该使用 keyPressed 和 keyReleased 时尝试生成 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 );
}
}
Run Code Online (Sandbox Code Playgroud)
我今天早上刚注册的账号,只有11个信誉。不足以支持投票
即使有 11 分,如果答案回答了您的问题,您也应该能够“接受”。