大多数情况下,这些代码都是完美的。
import java.awt.*;
import java.awt.event.MouseEvent;
import java.awt.event.MouseListener;
import javax.swing.*;
public class Main {
public static void main(String[] args) {
new Main();
}
private Main() {
JFrame f = new JFrame("Test");
f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
f.add(new Game());
f.setResizable(false);
f.pack();
f.setVisible(true);
}
private class Game extends JPanel implements MouseListener {
private static final long serialVersionUID = -7048656881407382561L;
int x = 300, y = 300;
Image thing;
ImageIcon ico = new ImageIcon("smiley.png");
private Game() {
setPreferredSize(new Dimension(600, 600));
thing = ico.getImage();
addMouseListener(this);
}
private void goTo(int stX, int stY, int endX, int endY) {
int dx = Math.abs(endX - stX);
int dy = Math.abs(endY - stY);
int sx = endX > stX ? 1 : -1;
int sy = endY > stY ? 1 : -1;
int err = dx - dy;
while (true) {
x = stX;
y = stY;
repaint();
validate();
if (stX == endX && stY == endY) break;
if ((err*2) > -dy) {
err -= dy;
stX += sx;
}
if ((err*2) < dx) {
err += dx;
stY += sy;
}
try {
Thread.sleep(10);
} catch (InterruptedException e) {}
}
}
private void goTo(final int endX, final int endY) {
new Thread(new Runnable() {
@Override
public void run() {
goTo(x, y, endX, endY);
}
}).start();
}
@Override
public void paintComponent(Graphics g) {
super.paintComponent(g);
((Graphics2D)g).drawImage(thing, x, y, null);
}
@Override
public void mousePressed(MouseEvent e) {
goTo(e.getX(), e.getY());
}
public void mouseReleased(MouseEvent e) {} //These
public void mouseEntered(MouseEvent e) {} //are
public void mouseExited(MouseEvent e) {} //useless
public void mouseClicked(MouseEvent e) {} //methods
}
}
只有一个问题:有时,看起来是任意的,图像只是继续前进,而不是停在鼠标被点击的地方。通常情况下是有效的,但有时会搞砸,继续下去。
这是图像,以防与之有关。
我注意到,如果你在他的眼睛之间点击,它总是飞走。
最佳答案
我把你的while语句改了一点,看起来对我很有用。
private void goTo(int stX, int stY, int endX, int endY) {
int dx = Math.abs(endX - stX);
int dy = Math.abs(endY - stY);
int sx = endX > stX ? 1 : -1;
int sy = endY > stY ? 1 : -1;
int err = dx - dy;
while (stX != endX && stY != endY) {
x = stX;
y = stY;
repaint();
validate();
if ((err*2) > -dy) {
err -= dy;
stX += sx;
}
if ((err*2) < dx) {
err += dx;
stY += sy;
}
try {
Thread.sleep(10);
} catch (InterruptedException e) {}
}
}
注意这一行的变化:
while (stX != endX && stY != endY) {
您还可以考虑添加一个切换布尔值,以便在图像移动时不能发出另一个goto,因为现在您可以通过快速的fire点击获得一些非常有趣的结果。
关于java - 在线算法中的“飞过去”?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/13433258/