Java 如何确定一个形状是否与另一个形状接触?

Java 如何确定一个形状是否与另一个形状接触?,java,graphics,keylistener,2d-games,boundary,Java,Graphics,Keylistener,2d Games,Boundary,我有一个工人阶级,我可以用键盘在屏幕上移动一个圆圈,而其他圆圈在屏幕上以不同的速度移动 我达到了这一点,我正试图找出如何制作它,这样我就可以知道我的形状是否碰到了另一个形状,但这是我一直坚持的部分,因为我对如何制作它没有太多的想法。我尝试过各种方法,但大多数都不起作用 public class Test extends Panel implements Runnable, KeyListener, MouseMotionListener { static final int left = 37

我有一个工人阶级,我可以用键盘在屏幕上移动一个圆圈,而其他圆圈在屏幕上以不同的速度移动

我达到了这一点,我正试图找出如何制作它,这样我就可以知道我的形状是否碰到了另一个形状,但这是我一直坚持的部分,因为我对如何制作它没有太多的想法。我尝试过各种方法,但大多数都不起作用

public class Test extends Panel implements Runnable, KeyListener, MouseMotionListener {

static final int left = 37;
static final int right = 39;
static final int down = 40;
static final int up = 38;

static boolean leftPress = false;
static boolean rightPress = false;
static boolean upPress = false;
static boolean downPress = false;

/*****/
static int upperLeftX;
static int upperLeftY;
static int lowerLeftX;
static int lowerLeftY;
static int upperRightX;
static int upperRightY;
static int lowerRightX;
static int lowerRightY;

int eUpperLeftX;
int eUpperLeftY;
int eLowerLeftX;
int eLowerLeftY;
int eUpperRightX;
int eUpperRightY;
int eLowerRightX;
int eLowerRightY;
/*****/

static boolean eat = false;
static boolean eaten = false;
static int mouseLocationX;
static int mouseLocationY;
static String mouseLocation = "";

/**/
int x1_;
int y1_;
int eSize;
int eRandSpawn;
int sleep;
Color eColor;
/**/

static int x1 = 250;
static int y1 = 250;
static int size = 30;

static JFrame frame = new JFrame("Fishy");
static Test panel = new Test(500, 500, 9);

// static Test time1 = new Test(1000);
// static Test time2 = new Test(500);
// static Test time3 = new Test(250);
// static Test time4 = new Test(Methods.randNum(6,20),Methods.randNum(0, 450));
// static Test time5 = new Test(Methods.randNum(6,20),Methods.randNum(0, 450));

static Test eFish[] = new Test[20];

/** CONSTRUCTOR **/
public Test() {

    sleep = Methods.randNum(6, 50);
    y1_ = Methods.randNum(0, 450);
    eRandSpawn = Methods.randNum(1, 2);
    eColor = Methods.randColor();
    eSize = Methods.randNum(5, 120);

    if (eRandSpawn == 1) {
        x1_ = -100;
    } else {
        x1_ = 600;
    }

    eUpperLeftX = x1_;
    eUpperLeftY = y1_;
    eLowerLeftX = x1_;
    eLowerLeftY = y1_ + eSize;
    eUpperRightX = x1_ + eSize;
    eUpperRightY = y1_;
    eLowerRightX = x1_ + eSize;
    eLowerRightY = x1_ + eSize;

}

/** CONSTRUCTOR **/
public Test(int width, int length, int minusBy) {
    super(width, length, minusBy);
}

/** MAIN **/
public static void main(String args[]) throws InterruptedException {
    for (int i = 0; i < 20; i++) {
        eFish[i] = new Test();
    }
    Thread time[] = new Thread[20];
    for (int i = 0; i < 20; i++) {
        time[i] = new Thread(eFish[i]);
    }

    // Thread time1_ = new Thread(time1);
    // Thread time2_ = new Thread(time2);
    // Thread time3_ = new Thread(time3);

    // Thread time4_ = new Thread(time4);
    // Thread time5_ = new Thread(time5);

    frame.add(panel);
    frame.addKeyListener(panel);
    panel.addMouseMotionListener(panel);
    Frame.showFrame(frame);

    // time1_.start();
    // time2_.start();
    // time3_.start();

    // time4_.start();
    // time5_.start();

    for (int i = 0; i < 20; i++) {
        time[i].start();
    }

    while (true) {

        if (upPress) {
            y1--;
        }
        if (downPress) {
            y1++;
        }
        if (leftPress) {
            x1--;
        }
        if (rightPress) {
            x1++;
        }

        if (upPress || downPress || leftPress || rightPress) {
            upperLeftX = x1;
            upperLeftY = y1;
            lowerLeftX = x1;
            lowerLeftY = y1 + size;
            upperRightX = x1 + size;
            upperRightY = y1;
            lowerRightX = x1 + size;
            lowerRightY = x1 + size;

            Thread.sleep(6);
            frame.repaint();
        }

        for (int i = 0; i < 20; i++) {

            if (eat) {

                size++;
                eFish[i].eRandSpawn = Methods.randNum(1, 2);

                if (eFish[i].eRandSpawn == 1) {
                    eFish[i].y1_ = Methods.randNum(0, 450);
                    eFish[i].x1_ = -100;
                    eFish[i].sleep = Methods.randNum(6, 50);
                    eFish[i].eSize = Methods.randNum(5, 120);
                    eFish[i].eColor = Methods.randColor();
                } else {
                    eFish[i].y1_ = Methods.randNum(0, 450);
                    eFish[i].x1_ = 600;
                    eFish[i].sleep = Methods.randNum(6, 50);
                    eFish[i].eSize = Methods.randNum(5, 120);
                    eFish[i].eColor = Methods.randColor();
                }

                eFish[i].eUpperLeftX = eFish[i].x1_;
                eFish[i].eUpperLeftY = eFish[i].y1_;
                eFish[i].eLowerLeftX = eFish[i].x1_;
                eFish[i].eLowerLeftY = eFish[i].y1_ + eFish[i].eSize;
                eFish[i].eUpperRightX = eFish[i].x1_ + eFish[i].eSize;
                eFish[i].eUpperRightY = eFish[i].y1_;
                eFish[i].eLowerRightX = eFish[i].x1_ + eFish[i].eSize;
                eFish[i].eLowerRightY = eFish[i].x1_ + eFish[i].eSize;

            }
            eat = false;
        }

    }
}

/** PAINT **/
public void paintComponent(Graphics g) {
    super.paintComponent(g);

    g.setColor(Color.CYAN);
    g.fillRect(0, 0, 501, 501);

    g.setColor(Color.BLACK);
    mouseLocation = String.format("%s,%s,%s", x1, y1, size);
    g.drawString(mouseLocation, 100, 100);

    g.setColor(Color.GREEN);
    g.fillOval(x1, y1, size, size);

    // g.drawOval(time4.x1_,time4.y1_,50,50);
    // g.drawOval(time5.x1_,time5.y1_,50,50);

    for (int i = 0; i < 20; i++) {
        g.setColor(eFish[i].eColor);
        g.fillOval(eFish[i].x1_, eFish[i].y1_, eFish[i].eSize, eFish[i].eSize);
    }

    /*
     * for (int i = 0; i < 10; i++) { g.setColor(Methods.randColor()); g.drawRect(x1 + i, y1 + i, width - i * 2, height - i * 2);
     * 
     * }
     */

    // g.drawString(time1.time, 20, 50);
    // g.drawString(time2.time, 20, 100);
    // g.drawString(time3.time, 20, 150);

}

@Override
public void run() {
    while (true) {
        try {
            Thread.sleep(sleep);

            eUpperLeftX = x1_;
            eUpperLeftY = y1_;
            eLowerLeftX = x1_;
            eLowerLeftY = y1_ + eSize;
            eUpperRightX = x1_ + eSize;
            eUpperRightY = y1_;
            eLowerRightX = x1_ + eSize;
            eLowerRightY = x1_ + eSize;

            if (x1_ == -150) {
                y1_ = Methods.randNum(0, 450);
                x1_ = 600;
                sleep = Methods.randNum(6, 50);
                eSize = Methods.randNum(5, 120);
                eColor = Methods.randColor();
            }
            if (x1_ == 650) {
                y1_ = Methods.randNum(0, 450);
                x1_ = -100;
                sleep = Methods.randNum(6, 50);
                eSize = Methods.randNum(5, 120);
                eColor = Methods.randColor();
            }
            if (eRandSpawn == 1) {
                x1_++;
            } else {
                x1_--;
            }
            frame.repaint();

        } catch (InterruptedException e) {
        }
    }

}

@Override
public void keyPressed(KeyEvent e) {

    if (up == e.getKeyCode()) {

        upPress = true;

    }
    if (down == e.getKeyCode()) {

        downPress = true;

    }
    if (left == e.getKeyCode()) {

        leftPress = true;

    }
    if (right == e.getKeyCode()) {

        rightPress = true;

    }
}

@Override
public void keyReleased(KeyEvent e) {

    if (up == e.getKeyCode()) {
        upPress = false;

    }
    if (down == e.getKeyCode()) {
        downPress = false;

    }
    if (left == e.getKeyCode()) {
        leftPress = false;

    }
    if (right == e.getKeyCode()) {
        rightPress = false;

    }
}

@Override
public void keyTyped(KeyEvent arg0) {
    // TODO Auto-generated method stub

}

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

}

@Override
public void mouseMoved(MouseEvent e) {

    mouseLocationX = e.getX();
    mouseLocationY = e.getY();
    mouseLocation = String.format("%s,%s", mouseLocationX, mouseLocationY);
    frame.repaint();

}
}
公共类测试扩展面板实现Runnable、KeyListener、MouseMotionListener{
静态最终整数左=37;
静态最终整数右=39;
静态最终积分下降=40;
静态最终积分上限=38;
静态布尔leftPress=false;
静态布尔rightPress=false;
静态布尔upPress=false;
静态布尔下压=false;
/*****/
静态int-upperLeftX;
静态int-upperLeftY;
静态积分下限;
静态积分较低;
静态int-upperRightX;
静态int右上角;
静态int-lowerRightX;
静态亮度较低;
int-eupperlefx;
左撇子;
int eLowerLeftX;
国际左翼;
int eUpperRightX;
内上右;
国际eLowerRightX;
国际人权;
/*****/
静态布尔eat=false;
静态布尔值=假;
静态int mouseLocationX;
静态int鼠标定位;
静态字符串鼠标定位=”;
/**/
int-x1;
int y1_2;;
内化;
国际典当;
智力睡眠;
颜色生态色;
/**/
静态int x1=250;
静态int y1=250;
静态整数大小=30;
静态JFrame=新JFrame(“鱼型”);
静态测试面板=新测试(500500,9);
//静态试验时间1=新试验(1000);
//静态试验时间2=新试验(500);
//静态试验时间3=新试验(250);
//静态测试时间4=新测试(Methods.randNum(6,20),Methods.randNum(0450));
//静态测试时间5=新测试(Methods.randNum(6,20),Methods.randNum(0450));
静态试验eFish[]=新试验[20];
/**建造师**/
公开考试(){
sleep=Methods.randNum(6,50);
y1=方法randNum(0450);
eRandSpawn=Methods.randNum(1,2);
eColor=Methods.randColor();
eSize=Methods.randNum(5120);
如果(eRandSpawn==1){
x1_u=-100;
}否则{
x1=600;
}
eUpperLeftX=x1_3;;
eUpperLeftY=y1_2;;
eLowerLeftX=x1_3;;
eLowerLeftY=y1_uz+eSize;
eUpperRightX=x1_uz+eSize;
eUpperRightY=y1_3;;
eLowerRightX=x1_uz+eSize;
eLowerRightY=x1_uz+eSize;
}
/**建造师**/
公共测试(int-width、int-length、int-minusBy){
超级(宽度、长度、最小单位);
}
/**主要**/
公共静态void main(字符串args[])引发InterruptedException{
对于(int i=0;i<20;i++){
eFish[i]=新测试();
}
线程时间[]=新线程[20];
对于(int i=0;i<20;i++){
时间[i]=新线程(eFish[i]);
}
//线程时间1=新线程(时间1);
//线程时间2=新线程(时间2);
//线程时间3=新线程(时间3);
//线程时间4=新线程(时间4);
//线程时间5=新线程(时间5);
框架。添加(面板);
frame.addKeyListener(面板);
panel.addMouseMotionListener(panel);
框架。展示框架(框架);
//time1_uu.start();
//time2_uu.start();
//time3_uu.start();
//time4_uu.start();
//time5_uu.start();
对于(int i=0;i<20;i++){
时间[i].start();
}
while(true){
if(upPress){
y1--;
}
如果(向下按){
y1++;
}
如果(按左键){
x1--;
}
如果(右按){
x1++;
}
如果(上压| |下压| | |左压| |右压){
upperLeftX=x1;
upperLeftY=y1;
lowerLeftX=x1;
lowerLeftY=y1+尺寸;
upperRightX=x1+尺寸;
右上Y=y1;
lowerRightX=x1+尺寸;
低亮度=x1+尺寸;
睡眠(6);
frame.repaint();
}
对于(int i=0;i<20;i++){
如果(吃){
大小++;
eFish[i].eRandSpawn=Methods.randNum(1,2);
if(eFish[i].eRandSpawn==1){
eFish[i].y1_=Methods.randNum(0450);
eFish[i].x1_=-100;
eFish[i].sleep=Methods.randNum(6,50);
eFish[i].eSize=Methods.randNum(5120);
eFish[i].eColor=Methods.randColor();
}否则{
eFish[i].y1_=Methods.randNum(0450);
eFish[i].x1_u2;=600;
eFish[i].sleep=Methods.randNum(6,50);
eFish[i].eSize=Methods.randNum(5120);
eFish[i].eColor=Methods.randColor();
}
eFish[i].eUpperLeftX=eFish[i].x1;
eFish[i].eUpperLeftY=eFish[i].y1;
eFish[i].eLowerLeftX=eFish[i].x1;
eFish[i].eLowerLeftY=eFish[i].y1_U2;+eFish[i].eSize;
eFish[i].eUpperRightX=eFish[i].x1_389;+eFish[i].eSize;
eFish[i].eUpperRightY=eFish[i].y1;
eFish[i].eLowerRightX=eFish[i].x1_389;+eFish[i].eSize;
eFish[i].eLowerRightY=eFish[i].x1_389;+eFish[i].eSize;
}
吃=假;
}
}
}
/**油漆**/
公共组件(图形g){
超级组件(g);
g、 setColor(Color.CYAN);
g、 fillRect(0,0501501);
g、 设置颜色(颜色为黑色);
mouseLocation=String.format(“%s,%s,%s”,x1,y1,size);
g、 抽绳(鼠标定位,100100);
g、 setColor(Color.GREEN);
g、 椭圆形(x1,y1,尺寸,尺寸);
//g.drawOval(time4.x1_u2;,time4.y1_2;,50,50);
//g.drawOval(time5.x1_u2;,time5.y1_2;,50,50);
对于(int i=0;i<20;i++){
g、 setColor(eFish[i].ecocolor);
g、 fillOval(eFish[i].x1_,eFish[i].y1_,eFish[i].eSize,eFish[i].eSize);
}
/*
*对于(inti=0;i<10;i++){g.setColor(Methods.randColor());g.drawRect(x1+i,y1+i,width-i*2,hei
public boolean madeContact(Ellipse a, Ellipse b) {
    //Center of ellipse
    int ax = a.getX(), ay = a.getY(), bx = b.getX(), by = b.getY();
    //Radii
    int arx = a.getRadiusX(), ary = a.getRadiusY();
    int brx = b.getRadiusX(), bry = b.getRadiusY();
    //Has hit x, y
    boolean hitx = Math.abs(ax - bx) < arx+brx;
    boolean hity = Math.abs(ay - by) < ary+bry;

    return hitx && hity;
}