Java 如何以一致的速度直线移动和移动物体

Java 如何以一致的速度直线移动和移动物体,java,Java,我试着在一条直线上移动一个圆。但是我的代码没有给出预期的结果。我正在使用mouseMotionListener不断地获取目标点,x_位置和y_位置为我的圆圈进行协调。我使用三角函数sincos和atan,以直线移动对象——这是我从堆栈溢出上的一个问题中看到的逻辑-- 但这并没有给我预期的结果,我做错了什么吗?plz帮助: import java.awt.Graphics; import java.awt.event.KeyEvent; import java.awt.event.KeyList

我试着在一条直线上移动一个圆。但是我的代码没有给出预期的结果。我正在使用mouseMotionListener不断地获取目标点,x_位置和y_位置为我的圆圈进行协调。我使用三角函数sincos和atan,以直线移动对象——这是我从堆栈溢出上的一个问题中看到的逻辑-- 但这并没有给我预期的结果,我做错了什么吗?plz帮助:

 import java.awt.Graphics;
import java.awt.event.KeyEvent;
import java.awt.event.KeyListener;
import java.awt.event.MouseEvent;
import java.awt.event.MouseListener;
import java.awt.event.MouseMotionListener;
import java.awt.image.BufferedImage;
import java.io.File;
import java.io.IOException;
import java.util.logging.Level;
import java.util.logging.Logger;
import javax.imageio.ImageIO;
import javax.swing.JPanel;
import java.awt.*;
import javax.swing.*;

public class Snake extends JPanel {
    static Snake snake = new Snake();
    static Co_Ordinates co = new Co_Ordinates();
    static int x_pos = 10, y_pos = 500;
    static int slope;
    int delta_x,delta_y;
    double direction;
    double x_inc,y_inc;
    public Snake() {
    }

    @Override
    protected void paintComponent(Graphics g) {

        super.paintComponent(g);
        Graphics2D g2d=(Graphics2D)g;
        g2d.setColor(Color.green);
        g2d.fillArc(x_pos, y_pos, 20, 20, 0, 360);
        try {
            Thread.sleep(10);
        } catch (Exception e) {
        }
        /*if(x_pos==co.x_Cur){
            if(co.y_Cur>=y_pos)
                y_pos++;
            else if(co.y_Cur<=y_pos)
                y_pos--;

        }
        else if(y_pos==co.y_Cur){
            if(co.x_Cur>=x_pos)
                x_pos++;
            else if(co.x_Cur<=x_pos)
                x_pos--;

        }
        */
        //slope=((co.y_Cur - y_pos) / (co.x_Cur - x_pos));
        //y_pos = slope*x_pos+y_pos;
        //x_pos++;
        //System.out.println("...");
        if(x_pos!=co.x_Cur&&y_pos!=co.y_Cur){
             int delta_x = co.x_Cur - x_pos;
             int delta_y = co.y_Cur - y_pos;
             direction = Math.atan(delta_y / delta_x); // Math.atan2(deltaY, deltaX) does the same thing but checks for deltaX being zero to prevent divide-by-zero exceptions
             double speed = 5.0;
             x_inc = (speed * Math.cos(direction));
             y_inc = (speed * Math.sin(direction));
             x_pos+=x_inc;
             y_pos+=y_inc;
        }

        //x_pos = co.x_Cur;
        repaint(10);// parameters
    }

    public void move() {

    }

    public static void main(String args[]) {
        JFrame jf = new JFrame();
        jf.add(co);
        jf.addMouseMotionListener(co);
        jf.addMouseListener(co);
        jf.add(snake);
        jf.setSize(600, 600);
        jf.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        jf.setVisible(true);
    }
}
class Co_Ordinates extends JPanel implements MouseMotionListener, MouseListener {


    static int slope;
    static Snake sn = new Snake();
    static int x_Cur=sn.x_pos-20;
    static int y_Cur=sn.y_pos-40;
    @Override
    public void mouseDragged(MouseEvent e) {

    }

    @Override
    public void mouseMoved(MouseEvent e) {
        x_Cur = e.getX() - 20;
        y_Cur = e.getY() - 40;

    }

    @Override
    public void mouseClicked(MouseEvent e) {
    }

    @Override
    public void mouseEntered(MouseEvent e) {
        // TODO Auto-generated method stub

    }

    @Override
    public void mouseExited(MouseEvent e) {
        // TODO Auto-generated method stub

    }

    @Override
    public void mousePressed(MouseEvent e) {
        // TODO Auto-generated method stub

    }

    @Override
    public void mouseReleased(MouseEvent e) {
        // TODO Auto-generated method stub

    }

}// Class Listener ends here
导入java.awt.Graphics;
导入java.awt.event.KeyEvent;
导入java.awt.event.KeyListener;
导入java.awt.event.MouseEvent;
导入java.awt.event.MouseListener;
导入java.awt.event.MouseMotionListener;
导入java.awt.image.buffereImage;
导入java.io.File;
导入java.io.IOException;
导入java.util.logging.Level;
导入java.util.logging.Logger;
导入javax.imageio.imageio;
导入javax.swing.JPanel;
导入java.awt.*;
导入javax.swing.*;
公共类Snake扩展了JPanel{
静态Snake=新Snake();
静态坐标坐标=新坐标();
静态整数x_pos=10,y_pos=500;
静态内斜率;
int delta_x,delta_y;
双向;
双x_公司、y_公司;
公蛇({
}
@凌驾
受保护组件(图形g){
超级组件(g);
Graphics2D g2d=(Graphics2D)g;
g2d.setColor(Color.green);
g2d.fillArc(x_位置,y_位置,20,20,0,360);
试一试{
睡眠(10);
}捕获(例外e){
}
/*如果(x_pos==co.x_Cur){
如果(co.y\u Cur>=y\u pos)
y_pos++;
否则如果(co.y\U Cur=x\U pos)
x_pos++;

else if(co.x_Cur在使用
Math.atan
的代码中应更改为
Math.atan2
。 atan
仅给出-90度和90度之间的角度值。
atan2
给出了介于-180度和180度之间的角度值

我修改了代码的这一部分,如下所示

  • 首先,将
    atan
    更改为
    atan2
  • 第二,如果圆与鼠标指针(目标?)相交,则使速度变为零
  • 第三个是次要的,但除非性能非常关键,否则不需要if条件
请试试这个

// if(x_pos!=co.x_Cur&&y_pos!=co.y_Cur){
    delta_x = co.x_Cur - x_pos;
    delta_y = co.y_Cur - y_pos;
    direction = Math.atan2(delta_y, delta_x); 
    double speed = Math.sqrt(delta_x*delta_x + delta_y*delta_y);
    speed = Math.min(speed, 5.0);
    x_inc = (speed * Math.cos(direction));
    y_inc = (speed * Math.sin(direction));
    x_pos+=x_inc;
    y_pos+=y_inc;
//}

这可能是因为您在
paintComponent()
方法中调用
Thread.sleep()
paintComponent()
在EDT上运行,EDT处理所有swing事件,包括MouseEvent等侦听器事件。您在哪里调用此函数?(如果您正在使用此函数,我将讨论重新绘制()。此外,如果在这种情况下不需要,请删除所有注释。Thanx Aloot@Keugyeol,你刚刚解决了我的问题:D它工作得很好。Hello@Keugyeol。我如何将速度调整到屏幕分辨率?在多人游戏中,从0点步行到1920点与从0点步行到800点应该有所不同。。(两名玩家应同时完成)。@Rey333,让我们定义“单位速度”在某一时间从左向右横过屏幕。无论屏幕分辨率如何,移动速度都将保持不变。如果在10秒内横过屏幕,则单位速度将为1920/10或800/10,具体取决于屏幕宽度。此单位速度应乘以当前帧和上一帧之间的增量时间。然后,可以用“单位速度”乘以“增量时间”来替换上述恒定速度(5像素)。