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;
}