J'ai écrit un bot pour contrôler le jeu de course en utilisant Java Robot. Le bot fonctionne bien pour besoin de vitesse sous-sol em> sauf pour la clé "Down" (haut, gauche, les touches de droite très bien). Cependant, mon bot ne peut pas contrôler besoin de vitesse la plus recherchée em>. p>
Le bot fonctionne bien, mais le jeu n'accepte pas les événements clés simulés. J'ai fait des recherches et j'ai trouvé que le jeu est basé sur DirectX. Dans DirectX, les événements clavier / souris sont spéciaux. Il semble que le jeu "demande" le clavier directement, pas via Windows. Et j'essaie mon programme en CS et j'ai trouvé que ça fonctionne assez bien. P>
Je programme dans Windows 7, en utilisant Eclipse et Java 1.6. Donc, je veux demander pourquoi ne pas besoin de vitesse la plus recherchée em> accepter les événements clés simulés et comment résoudre ce programme? Merci. P>
5 Réponses :
Autant que je sache, DirectX ne s'appuie pas sur les événements générés par Windows pour recevoir une entrée du clavier. Ainsi, le tir simulé des événements ne fonctionnera pas pour vous. Je ne pense pas que vous puissiez faire ce que vous voulez. P>
NON! Comment suis-je censé tricher à mes jeux?
Je débrouge mon programme jusqu'à la dernière minute. Grande surprise trouvée! Pour les événements clés simulés de Java Robot tels que "vk_up, vk_down, vk_left, vk_right", le "besoin de vitesse la plus recherché" ignoré. Mais, pour les clés "A-Z", le jeu accepté! Maintenant, mon programme fonctionne assez bien car je réinitialise les clés de la vitesse. Peut-être pour les touches fléchées, il quitte des méthodes de poignée différentes.
Merci de toute façon votre réponse.
Je veux faire ça. Mais j'ai enregistré le compte juste dans ce matin et 11 réputations seulement. Pas assez pour la perversité. Alors je merci d'utiliser un commentaire
J'ai écrit un bot pour contrôler la course Jeu en utilisant Java Robot. P>
Quels keyevents à vous générez? P>
pour les événements clés simulés de Java Robot comme "vk_up, Vk_down, vk_left, vk_right ", le" besoin pour la vitesse la plus recherchée "ignorée. Mais, Pour les clés "A-Z", le jeu accepté! P> BlockQuote>
Peut-être essayez-vous de générer des événements keytyped lorsque vous devriez utiliser KeyReleed et KeyReleasedEmmené? P>
Voici un exemple simple qui fonctionne avec les touches de droite / gauche / haut. Essayez d'entrer (1, 2, 3) puis de la backacace au début et entrez (0). Appuyez ensuite sur le bouton de lecture. P>
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 ); } }
J'ai écrit un programme de test pour accepter les événements clés du bot. Les résultats montrent que les touches clavier, KeyReleed et Keytyped sont toutes déclenchées. Je ne comprends pas ton point. Et merci de votre conseil. Je me souviens que. ^ _ ^
Mon point était que vous avez dit que la clé A-Z a travaillé. Eh bien, ces traits clés généreront un événement keyped car ils sont des caractères affichables. D'autre part, les touches fléchées ne génèrent pas de caractères affichoires, donc même si l'événement clé est généré, il contiendra une valeur non définie pour le caractère saisi de clé. Cela provoque peut-être un problème dans votre code. Si vous remarquez que mon robot suit uniquement les événements KeyReled et KeyReleed, de sorte que cela ne vous inquiétez pas pour les événements keyped. Je ne sais pas si cela fait une différence ou non, mais peut-être que vous pouvez ignorer les événements keyped.
Le robot Java a un bogue en ce qui concerne les touches fléchées. Il appuiera sur les flèches numériques numériques. Actuellement, il n'est pas possible d'appuyer sur les flèches non numpos. P>
ref: http://bugs.sun.com/bugdatabase/view_bug. faire? bug_id = 4838497 p>
Bien que ce soit une vieille question, je posterai ma réponse au cas où elle aide quelqu'un plus tard. p>
J'ai récemment fait face au même problème. J'appelle KeyPress et Keyrelease juste après l'autre pour chacune des touches gauche, droite, haut et bas, sur la base d'une entrée externe. J'ai essayé un tas de jeux, mais les presses de la clé robot ne travaillaient dans aucune d'entre elles. Lorsque j'ai essayé le même code avec le curseur dans un fichier texte, le curseur s'est déplacé correctement. P>
Le problème était que les jeux nécessitent généralement des presses à clé continues. La combinaison KeyPress + KeyRelease n'a donc pas entraîné d'effet. Donc, j'ai corrigé le problème en appelant KeyRelease dans la direction opposée pour chaque touche de flèche. P>
Par exemple, si la touche flèche gauche devait être enfoncée, j'appelle p>
KeyRelease (keevent.vk_right); code>
KeyPress (keevent.vk_left); code> p> blockQuote>Ceci maintient la touche gauche enfoncée jusqu'à ce que la touche fléchée droite soit enfoncée à être enfoncée. Il existe des moyens plus optimaux de le faire en suivant la dernière touche appuyez sur la dernière touche, etc., mais cette méthode semble fonctionner très bien. P>
Je sais que c'est un article très ancien, mais ma réponse pourrait être utile pour quelqu'un qui cherche la réponse em> C'est parce que certains jeux utilisent code est disponible ici https://github.com/umer0586/winkeyboad p>