Java &引用;飞过;在线算法?

Java &引用;飞过;在线算法?,java,algorithm,line,Java,Algorithm,Line,大多数情况下,使用此代码一切都是完美的 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() {

大多数情况下,使用此代码一切都是完美的

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
    }

}
import java.awt.*;
导入java.awt.event.MouseEvent;
导入java.awt.event.MouseListener;
导入javax.swing.*;
公共班机{
公共静态void main(字符串[]args){
新的Main();
}
专用干管(){
JFrame f=新JFrame(“测试”);
f、 setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
f、 添加(新游戏());
f、 可设置大小(假);
f、 包装();
f、 setVisible(真);
}
私有类游戏扩展JPanel实现MouseListener{
私有静态最终长serialVersionUID=-7048656881407382561L;
int x=300,y=300;
形象事物;
ImageIcon ico=新的ImageIcon(“smiley.png”);
私人游戏(){
setPreferredSize(新尺寸(600600));
thing=ico.getImage();
addMouseListener(这个);
}
私有void goTo(int stX、int stY、int endX、int endY){
intdx=Math.abs(endX-stX);
int dy=Math.abs(endY-stY);
intsx=endX>stX?1:-1;
int sy=endY>stY?1:-1;
int err=dx-dy;
while(true){
x=stX;
y=麦粒肿;
重新油漆();
验证();
如果(stX==endX&&stY==endY)中断;
如果((错误*2)>-dy){
err-=dy;
stX+=sx;
}
如果((错误*2)
这里只有一个问题:有时候,看起来是随意的,图像只是继续运行,而不是在鼠标被点击的地方停止。通常它是有效的,但有时它会搞砸,继续前进

这是一张图片,以防与此有关。


我注意到,如果你在他的眼睛之间点击,它总是会飞走。

我稍微改变了你的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) {}
        }
    }
private void goTo(int stX、int stY、int endX、int endY){
intdx=Math.abs(endX-stX);
int dy=Math.abs(endY-stY);
intsx=endX>stX?1:-1;
int sy=endY>stY?1:-1;
int err=dx-dy;
while(stX!=endX&&stY!=endY){
x=stX;
y=麦粒肿;
重新油漆();
验证();
如果((错误*2)>-dy){
err-=dy;
stX+=sx;
}
如果((错误*2)
注意这一行的变化:
while(stX!=endX&&stY!=endY){


你也可以考虑增加一个切换布尔值,这样你就不能在图像移动时发出另一个GOTO,因为现在你可以通过快速的点击获得一些有趣的结果。

我认为这是并发问题。你不使用VooCelter,X,Y变量没有标记为易失性,它们出现在不同的TH。阅读。谢谢,我回家后会试试的。现在,向上投票。:)