以一定角度移动球

时间:2014-04-08 06:53:48

标签: java graphics awt

我是一名新手并试图在斜坡上移动一个球。这是我给出坐标(100,300,300,600)的代码,以便在斜坡上移动球但是它远离斜坡线。这是代码: -

import javax.swing.*;
import java.awt.*;

public class AgentMotion extends JPanel implements Runnable
{
    Color color = Color.red;
    int   dia   = 0;
    long  delay = 40;
    private double x;
    private double y;
    private double x1;
    private double y1;
    private int dx = 1;
    private int dy = 1;
    private int dv = 1;
    private double direction;
    double a;
    double b;
    double a1;
    double b1;


    public void abc(double x, double y, double x2, double y2) {
        this.x = x;
        this.y = y;
        this.x1 = x2;
        this.y1 = y2;
        this.direction=Math.toRadians(Math.atan2(x1-x,y1-y));
        System.out.println("segfewg"+direction);
        this.a = x;
        this.b = y;
        this.a1 = x1;
        this.b1 = y1;
    }



    protected void paintComponent(Graphics g){
        super.paintComponent(g);
        Graphics2D g2 = (Graphics2D)g;
        g2.setRenderingHint(RenderingHints.KEY_ANTIALIASING,
                            RenderingHints.VALUE_ANTIALIAS_ON);
        g.setColor(color);
        //int x=100;
        //int y=200;
        int x3=(int)this.x;
        int y3=(int)this.y;
        g.fillOval(x3,y3,5,5);   // adds color to circle
        g.setColor(Color.black);
        g2.drawOval(x3,y3,5,5);   // draws circle
        g2.drawLine(100, 300, 300, 600);
    }

    public void run() {

        if(direction<0)
        {
            System.out.println("refregreg");
            while(dy!=0) {
                try {
                    Thread.sleep(delay);
                } catch(InterruptedException e) {
                    System.out.println("interrupted");
                }
                move2();

                repaint();

                move();
                repaint();
            }
        }
        else
        {
            while(dx!=0) {

                try {
                    Thread.sleep(delay);
                } catch(InterruptedException e) {
                    System.out.println("interrupted");
                }
                move2();

                repaint();

                move();
                repaint();
            }


        }


    }


    public void move() {


        if(direction>0)
        {
            if(x + dv*Math.cos(direction) <a ||x  + dia + dv * Math.cos(direction) >b) {
                dx *= 0;
                color = getColor();

            }

            x += dx;
        }
        else
        {
            System.out.println(x  + dia + dv * Math.cos(direction));
            if(x  + dia + dv * Math.cos(direction) >b) {
                dx *= 0;
                color = getColor();

            }

            x -= dx;

        }
    }


    public void move2() {

        if(direction>0)
        {
            if(dv * Math.sin(direction) + y <a1 || dv * Math.sin(direction) + dia + y > b1) {

                dy *= 0;
                color = getColor();
            }
            y += dy;
        }
        else
        {

            System.out.println(dv * Math.sin(direction) + dia + y);
            if(dv * Math.sin(direction) + y <a1 || dv * Math.sin(direction) + dia + y < b1) {


                dy *= 0;
                color = getColor();
            }
            y -= dy;
        }

    }



    public Color getColor() {
        int rval = (int)Math.floor(Math.random() * 256);
        int gval = (int)Math.floor(Math.random() * 256);
        int bval = (int)Math.floor(Math.random() * 256);
        return new Color(rval, gval, bval);
    }

    public void start() {
        while(dx==0) {
            try {
                System.out.println("jiuj");
                Thread.sleep(25);
            } catch(InterruptedException e) {
                System.out.println("dwdwdwd");
            }
        }
        Thread thread = new Thread(this);
        thread.setPriority(Thread.NORM_PRIORITY);
        thread.start();
    }
}

1 个答案:

答案 0 :(得分:0)

一些建议

  1. dx和dy应该是双重
  2. 正如@Spektre所说,
  3. atan有点矫枉过正。你想要的是计算方向要简单得多。

    this.direction = (y2 - y) / (x2 - x)

  4. 如果我们给(100,300,300,600)作为abc的参数(可能是这个类的构造函数),斜率为1.5。因此我们可以说:

    dx = 1.0 dy = 1.5

  5. 这将完美地保持在线。对于要更改开始点和结束点的一般情况,您必须计算比率。因此,您可以将dx或dy设置为1.0,然后设置另一个,以便保持比率。像下面的数学伪代码那样:

    • dx =(x2 - x)/ minimum(x2-x,y2-y)
    • dy =(y2-y)/ minimum(x2-x,y2-y)