当前位置: 首页 > 面试题库 >

逐渐加速精灵

牛嘉谊
2023-03-14
问题内容

我试图在按下按钮时逐渐提高精灵速度,而不是仅移动恒定速度。同时设置最大速度限制。我希望你明白我的意思。

timer = new Timer(5, this);
timer.start();

public void paint(Graphics g) {
    super.paint(g);
    Graphics2D g2d = (Graphics2D)g;
    g2d.drawImage(image, x, y, this); //x,y = position
    Toolkit.getDefaultToolkit().sync();
    g.dispose();
}

private class TAdapter extends KeyAdapter { 
    public void keyPressed(KeyEvent e) {
        int key = e.getKeyCode();
        if (key == KeyEvent.VK_LEFT) {
            dx = -1;
        }
        if (key == KeyEvent.VK_RIGHT) {
            dx = 1;
        }
        if (key == KeyEvent.VK_UP) {
            dy = -1;
        }
        if (key == KeyEvent.VK_DOWN) {
            dy = 1;
        }
    }
}   
    public void actionPerformed(ActionEvent e) {
        x += dx;   
        y += dy;
        repaint();  
    }

问题答案:

您的示例代码有很多(最初)错误。

  1. 您正在覆盖该paint方法。建议您改写该paintComponent方法。如果您要覆盖paint顶级容器(如)的方法JFrame,则建议您不要这样做。相反,使用类似的东西JPanel作为自定义绘画的基础…
  2. 您正在处理Graphics过去的上下文。这是非常危险的,因为这样可以防止其他东西被涂上。该Graphics上下文是一个共享资源,一切都需要这个重绘周期中会使用相同的更新Graphics内容。
  3. 您正在使用KeyListenerKeyListener患有焦点问题。通过使用键绑定 API 可以很容易地对此进行补救。按键绑定还更加灵活,因为它们将物理按键与操作分开,使您可以轻松地将操作与不同的按键相关联和/或重用基础操作(如按钮)。

所以。你的问题。你得知道…

  • 目前的速度…
  • 最低允许速度…
  • 最高允许速度…

您还需要保持要更改的对象的当前位置。

这个例子实际上并没有移动“玩家”,而是移动了背景。背景位置由改变xDelta,即变化的速度…

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.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.KeyEvent;
import java.awt.image.BufferedImage;
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 TestSpeed {

    public static void main(String[] args) {
        new TestSpeed();
    }

    public TestSpeed() {
        EventQueue.invokeLater(new Runnable() {
            @Override
            public void run() {
                try {
                    UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName());
                } catch (ClassNotFoundException | InstantiationException | IllegalAccessException | UnsupportedLookAndFeelException ex) {
                }

                JFrame frame = new JFrame("Test");
                frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
                frame.setLayout(new BorderLayout());
                frame.add(new TestPane());
                frame.pack();
                frame.setLocationRelativeTo(null);
                frame.setVisible(true);
            }

        });
    }

    public class TestPane extends JPanel {

        private BufferedImage background;
        // The current position of the background
        private int xPos = 0;
        // The speed/delta that the xPos is changed...
        private int xDelta = 0;

        public TestPane() {
            Timer timer = new Timer(40, new ActionListener() {
                @Override
                public void actionPerformed(ActionEvent e) {
                    if (xPos < -(getWidth())) {
                        xPos = 0;
                    }
                    xPos -= xDelta;
                    repaint();
                }
            });
            timer.setRepeats(true);
            timer.setCoalesce(true);
            timer.start();
            InputMap im = getInputMap(WHEN_IN_FOCUSED_WINDOW);
            im.put(KeyStroke.getKeyStroke(KeyEvent.VK_LEFT, 0), "slower");
            im.put(KeyStroke.getKeyStroke(KeyEvent.VK_RIGHT, 0), "faster");

            ActionMap am = getActionMap();
            am.put("slower", new AbstractAction() {
                @Override
                public void actionPerformed(ActionEvent e) {
                    setSpeed(-1);
                }
            });
            am.put("faster", new AbstractAction() {
                @Override
                public void actionPerformed(ActionEvent e) {
                    setSpeed(1);
                }
            });
        }

        protected void setSpeed(int delta) {
            xDelta += delta;
            // Check the change in speed to ensure it's within the appropriate range
            if (xDelta < 0) {
                xDelta = 0;
            } else if (xDelta > 9) {
                xDelta = 9;
            }
        }

        @Override
        public Dimension getPreferredSize() {
            return new Dimension(200, 200);
        }

        @Override
        public void invalidate() {
            background = null;
            super.invalidate();
        }

        @Override
        protected void paintComponent(Graphics g) {
            super.paintComponent(g);

            int x = xPos;
            g.setColor(Color.DARK_GRAY);
            while (x < getWidth()) {
                g.drawLine(x, 0, x, getHeight());
                x += 15;
            }

            int width = getWidth();
            int height = getHeight();
            x = (width / 2) - 5;
            int y = (height / 2) - 5;
            g.setColor(Color.RED);
            g.fillOval(x, y, 10, 10);
        }        
    }    
}


 类似资料:
  • 问题内容: 我一直在尝试找出如何 逐渐 加速按下键时的精灵,然后一旦释放键,就逐渐减速直至停止,就像 小行星上 的飞船一样。如果可能,我想在没有任何游戏引擎的情况下执行此操作。我搜索了所以这个时候,发现相关的问题,但他们并没有回答我的问题 恰好 在我看来。 到目前为止,我想到的是: 我只是不确定如何正确地编程,因为我只能想到以相同的值增加而在持有时不会逐渐加速的方法。 所以这是我的目标( 逐渐加快

  • 我在spark streaming中面临一个非常奇怪的问题。我使用的是、节点数3、执行器数3{1个接收器和2个处理器}、每个执行器的内存2GB、每个执行器的内核1。批次间隔为10秒。我的批量大小约为1000条记录(约150KB)。 流转时长从最初的2秒逐渐增加到几分钟,但在最初的40-50小时内运行良好。之后,调度延迟和流转时长开始上升。 我试过查看GC,发现驱动程序的旧一代堆内存容量不断增加。这

  • 与数据帧相比,我对使用< code>data.table的< code>tapply类操作的速度提升印象极为深刻。 例如: 然而,我并没有完全设法让它比类操作中的数据帧工作得更快(即,需要将函数应用于每一行的情况)。 这真的只是意料之中还是有一些技巧?

  • 在可能的范围内,我减少了在这个周期中创建和销毁的对象的数量和大小。这基本上耗尽了我解决这类问题的工具包! 任何关于我如何理解和纠正性能逐渐下降的建议将非常感谢!

  • 需要修改版的插件(支持timer功能): MUI: InstallOptions.dll MUI2:nsDialogs.dll 以及system插件,(受api限制)只能运行于2k或者更高的平台之上。 脚本编写:Restools、X-Star、zhfi 引用transparent.nsi的内容: /*代码开始*/ ## transparent.nsi ## ## Script write by

  • 我们面临的问题是,Java进程的驻留内存逐渐增长。我们将Xmx定义为4096 MB,并且XX:MaxPermSize=1536m。活动线程的数量约为1500,定义了256K的Xss。 当应用服务器(JBoss 6.1)启动时,使用的驻留内存约为5.6GB(一直在使用top命令对其进行监视);它逐渐增长(每天约0.3到0.5 Gb),直到增长到约7.4 Gb,这时内核的OOM杀手由于RAM空间不足而