栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 面试经验 > 面试问答

如何消除keyPress的延迟?

面试问答 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

如何消除keyPress的延迟?

您问题的基本答案是,延迟不能是特定于操作系统的。

更长的答案是,您应该忽略各个事件本身,并通过使用适当的标志监视状态变化(在按下和释放之间)。

这意味着,当按下某个键时,您将设置一些标志,程序可以使用该标志来更改程序的状态,并在释放标志时将其重置。

这使事件与状态更改脱离关联,并为您提供了更大的灵活性,因为您的程序不在乎是什么原因导致状态更改,而只是在乎状态已更改并且应该对此做出反应。

这将需要您承担某种“循环”,其职责是监视此更改并做出相应的反应。在游戏中,这通常称为“游戏循环”,但也可以称为“主循环”。

正是这种“循环”责任来更新程序的状态并对其进行绘制。

下面是一个非常简单的示例,该示例使用键绑定API和

javax.swing.Timer
演示了基本概念

import com.sun.glass.events.KeyEvent;import java.awt.BorderLayout;import java.awt.Color;import java.awt.Dimension;import java.awt.EventQueue;import java.awt.Graphics;import java.awt.Graphics2D;import java.awt.Rectangle;import java.awt.event.ActionEvent;import java.awt.event.ActionListener;import javax.swing.AbstractAction;import javax.swing.ActionMap;import javax.swing.InputMap;import javax.swing.Jframe;import javax.swing.JPanel;import javax.swing.KeyStroke;import javax.swing.Timer;import javax.swing.UIManager;import javax.swing.UnsupportedLookAndFeelException;public class MoveMe {    public static void main(String[] args) {        new MoveMe();    }    public MoveMe() {        EventQueue.invokeLater(new Runnable() { @Override public void run() {     try {         UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName());     } catch (ClassNotFoundException | InstantiationException | IllegalAccessException | UnsupportedLookAndFeelException ex) {     }     Jframe frame = new Jframe("Testing");     frame.setDefaultCloseOperation(Jframe.EXIT_ON_CLOSE);     frame.setLayout(new BorderLayout());     frame.add(new TestPane());     frame.pack();     frame.setLocationRelativeTo(null);     frame.setVisible(true); }        });    }    public class MovementState {        public int xDirection;        public int yDirection;    }    public class TestPane extends JPanel {        private MovementState movementState;        private Rectangle box;        public TestPane() { movementState = new MovementState(); InputMap im = getInputMap(WHEN_IN_FOCUSED_WINDOW); ActionMap am = getActionMap(); im.put(KeyStroke.getKeyStroke(KeyEvent.VK_DOWN, 0, false), "down-pressed"); im.put(KeyStroke.getKeyStroke(KeyEvent.VK_DOWN, 0, true), "down-released"); im.put(KeyStroke.getKeyStroke(KeyEvent.VK_UP, 0, false), "up-pressed"); im.put(KeyStroke.getKeyStroke(KeyEvent.VK_UP, 0, true), "up-released"); im.put(KeyStroke.getKeyStroke(KeyEvent.VK_LEFT, 0, false), "left-pressed"); im.put(KeyStroke.getKeyStroke(KeyEvent.VK_LEFT, 0, true), "left-released"); im.put(KeyStroke.getKeyStroke(KeyEvent.VK_RIGHT, 0, false), "right-pressed"); im.put(KeyStroke.getKeyStroke(KeyEvent.VK_RIGHT, 0, true), "right-released"); am.put("down-pressed", new YDirectionAction(movementState, 2)); am.put("down-released", new YDirectionAction(movementState, 0)); am.put("up-pressed", new YDirectionAction(movementState, -2)); am.put("up-released", new YDirectionAction(movementState, 0)); am.put("left-pressed", new XDirectionAction(movementState, -2)); am.put("left-released", new XDirectionAction(movementState, 0)); am.put("right-pressed", new XDirectionAction(movementState, 2)); am.put("right-released", new XDirectionAction(movementState, 0)); box = new Rectangle(90, 90, 20, 20); Timer timer = new Timer(40, new ActionListener() {     @Override     public void actionPerformed(ActionEvent e) {         box.x += movementState.xDirection;         box.y += movementState.yDirection;         if (box.x < 0) {  box.x = 0;         } else if (box.x + box.width > getWidth()) {  box.x = getWidth() - box.width;         }         if (box.y < 0) {  box.y = 0;         } else if (box.y + box.height > getHeight()) {  box.y = getHeight() - box.height;         }         repaint();     } }); timer.start();        }        @Override        public Dimension getPreferredSize() { return new Dimension(200, 200);        }        @Override        protected void paintComponent(Graphics g) { super.paintComponent(g); Graphics2D g2d = (Graphics2D) g.create(); g2d.setColor(Color.RED); g2d.fill(box); g2d.dispose();        }    }    public abstract class AbstractDirectionAction extends AbstractAction {        private final MovementState movementState;        private final int value;        public AbstractDirectionAction(MovementState movementState, int value) { this.movementState = movementState; this.value = value;        }        public MovementState getMovementState() { return movementState;        }        public int getValue() { return value;        }    }    public class YDirectionAction extends AbstractDirectionAction {        public YDirectionAction(MovementState movementState, int value) { super(movementState, value);        }        @Override        public void actionPerformed(ActionEvent e) { getMovementState().yDirection = getValue();        }    }    public class XDirectionAction extends AbstractDirectionAction {        public XDirectionAction(MovementState movementState, int value) { super(movementState, value);        }        @Override        public void actionPerformed(ActionEvent e) { getMovementState().xDirection = getValue();        }    }}


转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/453085.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号