我试图在按下按钮时逐渐提高精灵速度,而不是仅移动恒定速度。同时设置最大速度限制。我希望你明白我的意思。
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();
}
您的示例代码有很多(最初)错误。
paint
方法。建议您改写该paintComponent
方法。如果您要覆盖paint
顶级容器(如)的方法JFrame
,则建议您不要这样做。相反,使用类似的东西JPanel
作为自定义绘画的基础…Graphics
过去的上下文。这是非常危险的,因为这样可以防止其他东西被涂上。该Graphics
上下文是一个共享资源,一切都需要这个重绘周期中会使用相同的更新Graphics
内容。KeyListener
。 KeyListener
患有焦点问题。通过使用键绑定 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空间不足而