2008-12-02 57 views
11

我有兩個字符顯示在我正在寫的遊戲中,玩家和敵人。這樣定義:Java中兩個圖像之間的碰撞檢測

public void player(Graphics g) { 
    g.drawImage(plimg, x, y, this); 
} 

public void enemy(Graphics g) { 
    g.drawImage(enemy, 200, 200, this); 
} 

然後調用:

player(g); 
enemy(g); 

我能夠移動播放器()與周圍的鍵盤,但我很茫然試圖檢測兩者之間的衝突時。很多人都說過要使用矩形,但是作爲初學者,我看不出如何將其鏈接到我現有的代碼中。任何人都可以爲我提供一些建議嗎?

回答

18

我認爲你的問題在於你沒有爲你的玩家和敵人使用好的OO設計。創建兩個類:

public class Player 
{ 
    int X; 
    int Y; 
    int Width; 
    int Height; 

    // Getters and Setters 
} 

public class Enemy 
{ 
    int X; 
    int Y; 
    int Width; 
    int Height; 

    // Getters and Setters 
} 

您的玩家應該有X,Y,寬度和高度變量。

你的敵人也應該如此。

在你的遊戲循環,這樣做(C#):

foreach (Enemy e in EnemyCollection) 
{ 
    Rectangle r = new Rectangle(e.X,e.Y,e.Width,e.Height); 
    Rectangle p = new Rectangle(player.X,player.Y,player.Width,player.Height); 

    // Assuming there is an intersect method, otherwise just handcompare the values 
    if (r.Intersects(p)) 
    { 
     // A Collision! 
     // we know which enemy (e), so we can call e.DoCollision(); 
     e.DoCollision(); 
    } 
} 

爲了加快速度,不要打擾,如果敵人COORDS是屏幕外檢查。

2

使用矩形圍住每個玩家和敵人,矩形的高度和寬度應與您周圍的物體相對應,想象它只在一個足夠大的盒子中。

現在,您將這些矩形一樣的,你做的對象,所以他們有一個「邊框」

我不知道,如果Java有這一點,但它可能具有矩形對象的方法叫做.intersects()所以你應該這樣做(rectangle1.intersectS(rectangle2)來檢查一個對象是否與另一個對象發生衝突。

否則你可以得到x和y座標的框和使用它們的高度/寬度檢測它們是否已經與你自己相交

無論如何,你可以用它來做交叉事件(make on爆炸或其他)或阻止運動被吸引。 (恢復到以前的座標)

編輯:在這裏我們去

布爾

相交(矩形R) 確定此Rectangle與指定 Rectangle是否相交。

所以我會做(不粘貼此代碼,它最有可能將無法正常工作,沒有做Java的很長一段時間,當我沒有使用它,我沒有做圖形。)

Rectangle rect1 = new Rectangle(player.x, player.y, player.width, player.height); 

Rectangle rect2 = new Rectangle(enemy.x, enemy.y, enemy.width, enemy.height); 

//detects when the two rectangles hit 
if(rect1.intersects(rect2)) 
{ 

System.out.println("game over, g"); 
} 

顯然你需要適應在某個地方。

+0

這是我在獲得。 Java確實有交集,但我正努力將它應用到我已有的代碼中。我需要在player()和enemy()裏面定義矩形嗎? – 2008-12-02 22:24:14

+0

不。我以前沒有在java中使用繪畫的東西,但是你應該明確地擁有一個像「Creature」這樣的對象,然後創建Creature的實例,即玩家/敵人,或者讓它們成爲你創建實例的子類。創建對象應包含更新/繪製所需的所有內容NoCharsLeft – Tablet 2008-12-02 22:31:06

2

您不希望在繪畫代碼中使用碰撞檢查代碼。這幅畫需要很快。碰撞可以進入遊戲循環。因此,您需要獨立於其精靈的對象的內部表示。

2

由於Java沒有交叉函數(真的!),所以可以通過簡單地比較每個可能潛在對象的邊界框(矩形)的X和Y值,寬度和高度值碰撞。

因此......在每個碰撞對象的基礎對象中...即,如果你的玩家和敵人有一個共同的基礎,你可以把一個簡單的Rectangle對象叫做BoundingBox。如果公共基礎是一個內置的Java類,那麼您需要創建一個類來擴展該類的構建,讓玩家和敵方對象擴展您的新類或者是該類的實例。

在創建(以及每個打勾或更新)時,您需要爲玩家和敵人設置邊界框參數。我沒有面向我的Rectangle類,但它最有可能是X,Y,Width和Height。 X和Y是你遊戲世界中的物體位置。我認爲寬度和高度是自我解釋的。儘管如此,他們很可能會從玩家位置的右側出來,如果X和Y在0處,而你的寬度和高度都是256,那麼你不會看到任何東西,因爲角色會位於左上角在屏幕外面。

反正......爲了檢測碰撞,你需要比較玩家和敵方的BoundingBoxes的屬性。因此,像這樣......

if(Player.BoundingBox.X = Enemy.BoundingBox.X && If(Player.BoundingBox.Y = Enemy.BoundingBox.Y) 
{ 
     //Oh noes! The enemy and player are on top of eachother. 
} 

邏輯可以得到某種複雜,但你需要比較每個BoundingBox的之間的距離和比較的位置。

+2

Java確實有一個相交方法:http://java.sun.com/javase/6/docs/api/java/awt/Rectangle.html#intersects(java .awt.Rectangle)。 – 2008-12-02 23:04:19

5

首先,使用Jonathan Holland所述的邊界框來查找是否可能發生碰撞。

從(多色)精靈創建黑白版本。如果你的精靈是透明的,你可能已經擁有了這些東西(例如,有些地方在邊界框內,但你仍然可以看到背景)。這些是「面具」。

在掩模上使用Image.getRGB()以獲得像素。對於不透明的每個像素,請在整數陣列中設置一個位(下面的playerArrayenemyArray)。如果width <= 32像素,則陣列的大小爲height,否則爲(width+31)/32*height。以下代碼適用於width <= 32

如果你有邊框的碰撞,這樣做:

// Find the first line where the two sprites might overlap 
int linePlayer, lineEnemy; 
if (player.y <= enemy.y) { 
    linePlayer = enemy.y - player.y; 
    lineEnemy = 0; 
} else { 
    linePlayer = 0; 
    lineEnemy = player.y - enemy.y; 
} 
int line = Math.max(linePlayer, lineEnemy); 

// Get the shift between the two 
x = player.x - enemy.x; 
int maxLines = Math.max(player.height, enemy.height); 
for (line < maxLines; line ++) { 
    // if width > 32, then you need a second loop here 
    long playerMask = playerArray[linePlayer]; 
    long enemyMask = enemyArray[lineEnemy]; 
    // Reproduce the shift between the two sprites 
    if (x < 0) playerMask << (-x); 
    else enemyMask << x; 
    // If the two masks have common bits, binary AND will return != 0 
    if ((playerMask & enemyMask) != 0) { 
     // Contact! 
    } 

} 

鏈接:JGameFramework for Small Java Games

3

下面是從我的碰撞檢測程序的主類。
你可以看到它在運行:http://www.youtube.com/watch?v=JIXhCvXgjsQ

/** 
* 
* @author Tyler Griffin 
*/ 
import java.awt.*; 
import javax.swing.*; 
import java.awt.event.*; 
import java.awt.GraphicsDevice.*; 
import java.util.ArrayList; 
import java.awt.Graphics; 
import java.awt.geom.Line2D; 


public class collision extends JFrame implements KeyListener, MouseMotionListener, MouseListener 
{ 
    ArrayList everything=new ArrayList<tile>(); 

    int time=0, x, y, width, height, up=0, down=0, left=0, right=0, mouse1=0, mouse2=0; 
    int mouseX, mouseY; 

    GraphicsEnvironment environment = GraphicsEnvironment.getLocalGraphicsEnvironment(); 
    GraphicsDevice screen = environment.getDefaultScreenDevice(); 
    DisplayMode displayMode = screen.getDisplayMode(); 

    //private BufferStrategy strategy; 

    JLayeredPane pane = new JLayeredPane(); 

    tile Tile; 
    circle Circle; 
    rectangle Rectangle; 

     textPane text; 

    public collision() 
    { 
     setUndecorated(screen.isFullScreenSupported()); 
     setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
     setVisible(true); 
     setLayout(null); 
     setResizable(false); 
     screen.setFullScreenWindow(this); 


     width=displayMode.getWidth(); 
     height=displayMode.getHeight(); 


      Circle=new circle(-(int)Math.round((double)height/7*2),-(int)Math.round((double)height/7*2),(int)Math.round((double)height/7*.85),this); 
      Rectangle=new rectangle(-(int)Math.round((double)height/7*1.5),-(int)Math.round((double)height/7*1.5),(int)Math.round((double)height/7*1.5),(int)Math.round((double)height/7*1.5),this); 
      Tile=Circle; 
      Tile.move(mouseX-Tile.width/2, mouseY-Tile.height/2); 
        text=new textPane(0,0,width,height,this); 

      everything.add(new circle((int)Math.round((double)width/100*75),(int)Math.round((double)height/100*15),(int)Math.round((double)width/100*10),this)); 
        everything.add(new rectangle((int)Math.round((double)width/100*70),(int)Math.round((double)height/100*60),(int)Math.round((double)width/100*20),(int)Math.round((double)height/100*20),this)); 
        //everything.add(new line(750,250,750,750,this)); 
        /*everything.add(new line(width/700*419,height/700*68,width/700*495,height/700*345,this)); 
        everything.add(new line(width/700*495,height/700*345,width/700*749,height/700*350,this)); 
        everything.add(new line(width/700*749,height/700*350,width/700*549,height/700*519,this)); 
        everything.add(new line(width/700*549,height/700*519,width/700*624,height/700*800,this)); 
        everything.add(new line(width/700*624,height/700*800,width/700*419,height/700*638,this)); 
        everything.add(new line(width/700*419,height/700*638,width/700*203,height/700*800,this)); 
        everything.add(new line(width/700*203,height/700*800,width/700*279,height/700*519,this)); 
        everything.add(new line(width/700*279,height/700*519,width/700*76,height/700*350,this)); 
        everything.add(new line(width/700*76,height/700*350,width/700*333,height/700*345,this)); 
        everything.add(new line(width/700*333,height/700*345,width/700*419,height/700*68,this)); 

        everything.add(new line(width/950*419,height/700*68,width/950*624,height/700*800,this)); 
        everything.add(new line(width/950*419,height/700*68,width/950*203,height/700*800,this)); 
        everything.add(new line(width/950*76,height/700*350,width/950*624,height/700*800,this)); 
        everything.add(new line(width/950*203,height/700*800,width/950*749,height/700*350,this)); 
        everything.add(new rectangle(width/950*76,height/700*350,width/950*673,1,this));*/ 

        everything.add(new line((int)Math.round((double)width/1350*419),(int)Math.round((double)height/1000*68),(int)Math.round((double)width/1350*624),(int)Math.round((double)height/1000*800),this)); 
        everything.add(new line((int)Math.round((double)width/1350*419),(int)Math.round((double)height/1000*68),(int)Math.round((double)width/1350*203),(int)Math.round((double)height/1000*800),this)); 
        everything.add(new line((int)Math.round((double)width/1350*76),(int)Math.round((double)height/1000*350),(int)Math.round((double)width/1350*624),(int)Math.round((double)height/1000*800),this)); 
        everything.add(new line((int)Math.round((double)width/1350*203),(int)Math.round((double)height/1000*800),(int)Math.round((double)width/1350*749),(int)Math.round((double)height/1000*350),this)); 
        everything.add(new rectangle((int)Math.round((double)width/1350*76),(int)Math.round((double)height/1000*350),(int)Math.round((double)width/1350*673),1,this)); 


     addKeyListener(this); 
     addMouseMotionListener(this); 
     addMouseListener(this); 
    } 

    public void keyReleased(KeyEvent e) 
    { 
     Object source=e.getSource(); 

     int released=e.getKeyCode(); 

     if (released==KeyEvent.VK_A){left=0;} 
     if (released==KeyEvent.VK_W){up=0;} 
     if (released==KeyEvent.VK_D){right=0;} 
     if (released==KeyEvent.VK_S){down=0;} 
    }//end keyReleased 


    public void keyPressed(KeyEvent e) 
    { 
     Object source=e.getSource(); 

     int pressed=e.getKeyCode(); 

     if (pressed==KeyEvent.VK_A){left=1;} 
     if (pressed==KeyEvent.VK_W){up=1;} 
     if (pressed==KeyEvent.VK_D){right=1;} 
     if (pressed==KeyEvent.VK_S){down=1;} 

     if (pressed==KeyEvent.VK_PAUSE&&pressed==KeyEvent.VK_P) 
     { 
      //if (paused==0){paused=1;} 
      //else paused=0; 
     } 
    }//end keyPressed 

    public void keyTyped(KeyEvent e){} 

//*********************************************************************************************** 

    public void mouseDragged(MouseEvent e) 
    { 
     mouseX=(e.getX()); 
     mouseY=(e.getY()); 

      //run(); 
    } 

    public void mouseMoved(MouseEvent e) 
    { 
     mouseX=(e.getX()); 
     mouseY=(e.getY()); 

      //run(); 
    } 

//*********************************************************************************************** 

    public void mousePressed(MouseEvent e) 
    { 
     if(e.getX()==0 && e.getY()==0){System.exit(0);} 

    mouseX=(e.getX()+x); 
     mouseY=(e.getY()+y); 

     if(Tile instanceof circle) 
     { 
       Circle.move(0-Circle.width, 0-Circle.height); 
       Circle.setBounds(Circle.x, Circle.y, Circle.width, Circle.height); 
       Tile=Rectangle; 
     } 
     else 
     { 
       Rectangle.move(0-Rectangle.width, 0-Rectangle.height); 
       Rectangle.setBounds(Rectangle.x, Rectangle.y, Rectangle.width, Rectangle.height); 
       Tile=Circle; 
     } 

     Tile.move(mouseX-Tile.width/2, mouseY-Tile.height/2); 
    } 

    public void mouseReleased(MouseEvent e) 
    { 
     //run(); 
    } 

    public void mouseEntered(MouseEvent e){} 
    public void mouseExited(MouseEvent e){} 

    public void mouseClicked(MouseEvent e){} 

//*********************************************************************************************** 

    public void run()//run collision detection 
    { 
     while (this == this) 
     { 
      Tile.move(Tile.x + ((mouseX - (Tile.x + (Tile.width/2)))/10), Tile.y + ((mouseY - (Tile.y + (Tile.height/2)))/10)); 
      //Tile.move((mouseX - Tile.width/2), mouseY - (Tile.height/2)); 

      for (int i = 0; i < everything.size(); i++) 
      { 
       tile Temp = (tile) everything.get(i); 

       if (Temp.x < (Tile.x + Tile.width) && (Temp.x + Temp.width) > Tile.x && Temp.y < (Tile.y + Tile.height) && (Temp.y + Temp.height) > Tile.y)//rectangles collided 
       { 
        if (Temp instanceof rectangle) 
        { 
         if (Tile instanceof rectangle){rectangleRectangle(Temp);} 
         else {circleRectangle(Temp);}//Tile instanceof circle 
        } 
        else 
        { 
         if (Temp instanceof circle) 
         { 
          if (Tile instanceof rectangle) {rectangleCircle(Temp);} 
          else {circleCircle(Temp);} 
         } 
         else//line 
         { 
          if (Tile instanceof rectangle){rectangleLine(Temp);} 
          else{circleLine(Temp);} 
         } 
        } 
       }//end if 
      }//end for 

      try {Thread.sleep(16L);} 
      catch (Exception e) {} 

      Tile.setBounds(Tile.x, Tile.y, Tile.width, Tile.height); 
      //Rectangle.setBounds(x, y, width, height); 
      //Circle.setBounds(x, y, width, height); 
      repaint(); 

      text.out=" "; 
     }//end while loop 
    }//end run 

//***************************************special collision detection/handling functions************************************************ 

    void rectangleRectangle(tile Temp) 
    { 
     int lapTop, lapBot, lapLeft, lapRight, small, scootX=0, scootY=0; 

     lapTop=(Temp.y+Temp.height)-Tile.y; 
     lapBot=(Tile.y+Tile.height)-Temp.y; 
     lapLeft=(Temp.x+Temp.width)-Tile.x; 
     lapRight=(Tile.x+Tile.width)-Temp.x; 

     small=999999999; 

     if (lapTop<small){small=lapTop; scootX=0; scootY=lapTop;} 
     if (lapBot<small){small=lapBot; scootX=0; scootY=lapBot*-1;} 
       if (lapLeft<small){small=lapLeft; scootX=lapLeft; scootY=0;} 
       if (lapRight<small){small=lapRight; scootX=lapRight*-1; scootY=0;} 

     Tile.move(Tile.x+scootX, Tile.y+scootY);text.out="collision detected!"; 
    } 



    void circleRectangle(tile Temp) 
    { 
     if((Tile.x+Tile.width/2<=Temp.x+Temp.width && Tile.x+Tile.width/2>=Temp.x)||(Tile.y+Tile.height/2>=Temp.y && Tile.y+Tile.height/2<=Temp.y+Temp.height)) 
     { 
      rectangleRectangle(Temp); 
     } 
     else//push from nearest corner 
     { 
      int x,y; 
      if(Tile.x+Tile.width/2>Temp.x+Temp.width && Tile.y+Tile.height/2<Temp.y){x=Temp.x+Temp.width; y=Temp.y;} 
      else if(Tile.x+Tile.width/2<Temp.x && Tile.y+Tile.height/2<Temp.y){x=Temp.x; y=Temp.y;} 
      else if(Tile.x+Tile.width/2>Temp.x+Temp.width && Tile.y+Tile.height/2>Temp.y+Temp.height){x=Temp.x+Temp.width; y=Temp.y+Temp.height;} 
      else {x=Temp.x; y=Temp.y+Temp.height;} 

      double distance = Math.sqrt(Math.pow(Tile.x+(Tile.width/2) - x, 2) + Math.pow(Tile.y+(Tile.height/2) - y, 2)); 

      if((int)Math.round(distance)<Tile.height/2) 
      { 
          double normY = ((Tile.y+(Tile.height/2) - y)/distance); 
          double normX = ((Tile.x+(Tile.width/2) - x)/distance); 

          Tile.move(x-Tile.width/2+(int)Math.round(normX*((Tile.width/2))) , y-Tile.height/2+(int)Math.round(normY*((Tile.height/2))));text.out="collision detected!"; 
      } 
     } 
    } 



    void rectangleCircle(tile Temp) 
    { 
     if((Temp.x+Temp.width/2<=Tile.x+Tile.width && Temp.x+Temp.width/2>=Tile.x)||(Temp.y+Temp.height/2>=Tile.y && Temp.y+Temp.height/2<=Tile.y+Tile.height)) 
     { 
      rectangleRectangle(Temp); 
     } 
     else//push from nearest corner 
     { 
      int x,y; 
      if(Temp.x+Temp.width/2>Tile.x+Tile.width && Temp.y+Temp.height/2<Tile.y){x=Tile.x+Tile.width; y=Tile.y;} 
      else if(Temp.x+Temp.width/2<Tile.x && Temp.y+Temp.height/2<Tile.y){x=Tile.x; y=Tile.y;} 
      else if(Temp.x+Temp.width/2>Tile.x+Tile.width && Temp.y+Temp.height/2>Tile.y+Tile.height){x=Tile.x+Tile.width; y=Tile.y+Tile.height;} 
      else {x=Tile.x; y=Tile.y+Tile.height;} 

      double distance = Math.sqrt(Math.pow(Temp.x+(Temp.width/2) - x, 2) + Math.pow(Temp.y+(Temp.height/2) - y, 2)); 

      if((int)Math.round(distance)<Temp.height/2) 
      { 
      double normY = ((Temp.y+(Temp.height/2) - y)/distance); 
      double normX = ((Temp.x+(Temp.width/2) - x)/distance); 

      if(Temp.x+Temp.width/2>Tile.x+Tile.width && Temp.y+Temp.height/2<Tile.y){Tile.move((Temp.x+Temp.width/2)-(int)Math.round(normX*((Temp.width/2)))-Tile.width,(Temp.y+Temp.height/2)-(int)Math.round(normY*((Temp.height/2))));text.out="collision detected!";} 
       else if(Temp.x+Temp.width/2<Tile.x && Temp.y+Temp.height/2<Tile.y){Tile.move((Temp.x+Temp.width/2)-(int)Math.round(normX*((Temp.width/2))),(Temp.y+Temp.height/2)-(int)Math.round(normY*((Temp.height/2))));text.out="collision detected!";} 
       else if(Temp.x+Temp.width/2>Tile.x+Tile.width && Temp.y+Temp.height/2>Tile.y+Tile.height){Tile.move((Temp.x+Temp.width/2)-(int)Math.round(normX*((Temp.width/2)))-Tile.width,(Temp.y+Temp.height/2)-(int)Math.round(normY*((Temp.height/2)))-Tile.height);text.out="collision detected!";} 
       else {Tile.move((Temp.x+Temp.width/2)-(int)Math.round(normX*((Temp.width/2))),(Temp.y+Temp.height/2)-(int)Math.round(normY*((Temp.height/2)))-Tile.height);text.out="collision detected!";} 
      } 
     } 
    } 




    void circleCircle(tile Temp) 
    { 
     double distance = Math.sqrt(Math.pow((Tile.x+(Tile.width/2)) - (Temp.x+(Temp.width/2)),2) + Math.pow((Tile.y+(Tile.height/2)) - (Temp.y+(Temp.height/2)), 2)); 

     if((int)distance<(Tile.width/2+Temp.width/2)) 
     { 
         double normX = ((Tile.x+(Tile.width/2)) - (Temp.x+(Temp.width/2)))/distance; 
         double normY = ((Tile.y+(Tile.height/2)) - (Temp.y+(Temp.height/2)))/distance; 

      Tile.move((Temp.x+(Temp.width/2))+(int)Math.round(normX*(Tile.width/2+Temp.width/2))-(Tile.width/2) , (Temp.y+(Temp.height/2))+(int)Math.round(normY*(Tile.height/2+Temp.height/2))-(Tile.height/2));text.out="collision detected!"; 
     } 
    } 



    void circleLine(tile Temp) 
    { 
      line Line=(line)Temp; 

      if (Line.x1 < (Tile.x + Tile.width) && (Line.x1) > Tile.x && Line.y1 < (Tile.y + Tile.height) && Line.y1 > Tile.y)//circle may be hitting one of the end points 
      { 
       rectangle rec=new rectangle(Line.x1, Line.y1, 1, 1, this); 
       circleRectangle(rec); 
       remove(rec); 
      } 

      if (Line.x2 < (Tile.x + Tile.width) && (Line.x2) > Tile.x && Line.y2 < (Tile.y + Tile.height) && Line.y2 > Tile.y)//circle may be hitting one of the end points 
      { 
       rectangle rec=new rectangle(Line.x2, Line.y2, 1, 1, this); 
       circleRectangle(rec); 
       remove(rec); 
      } 


      int x1=0, y1=0, x2=Tile.x+(Tile.width/2), y2=Tile.y+(Tile.height/2); 

      x1=Tile.x+(Tile.width/2)-Line.height;//(int)Math.round(Line.xNorm*1000); 
      x2=Tile.x+(Tile.width/2)+Line.height; 
      if(Line.posSlope) 
      { 
       y1=Tile.y+(Tile.height/2)-Line.width; 
       y2=Tile.y+(Tile.height/2)+Line.width; 
      } 
      else 
      { 
       y1=Tile.y+(Tile.height/2)+Line.width; 
       y2=Tile.y+(Tile.height/2)-Line.width; 
      } 

      Point point=intersection((double)x1,(double)y1,(double)x2,(double)y2,(double)Line.x1,(double)Line.y1,(double)Line.x2,(double)Line.y2);//find intersection 

      if (point.x < (Line.x + Line.width) && point.x > Line.x && point.y < (Line.y + Line.height) && point.y > Line.y)//line intersects within line segment 
      { 
       //if(point!=null){System.out.println(point.x+","+point.y);} 
       double distance = Math.sqrt(Math.pow((Tile.x+(Tile.width/2)) - point.x,2) + Math.pow((Tile.y+(Tile.width/2)) - point.y, 2)); 

       if((int)distance<Tile.width/2) 
       { 
        //System.out.println("hit"); 
        double normX = ((Tile.x+(Tile.width/2)) - point.x)/distance; 
        double normY = ((Tile.y+(Tile.height/2)) - point.y)/distance; 

        Tile.move((point.x)+(int)Math.round(normX*(Tile.width/2))-(Tile.width/2) , (point.y)+(int)Math.round(normY*(Tile.height/2))-(Tile.height/2));text.out="collision detected!"; 
        //System.out.println(point.x+","+point.y); 
       } 
      } 

      //new bullet(this, (int)Math.round(tryX), (int)Math.round(tryY)); 
    } 

     void rectangleLine(tile Temp) 
    { 
      line Line=(line)Temp; 
      if(new Line2D.Double(Line.x1,Line.y1,Line.x2,Line.y2).intersects(new Rectangle(Tile.x,Tile.y,Tile.width,Tile.height))) 
      { 
       if (Line.x1 < (Tile.x + Tile.width) && (Line.x1) > Tile.x && Line.y1 < (Tile.y + Tile.height) && Line.y1 > Tile.y)//circle may be hitting one of the end points 
       { 
        rectangle rec=new rectangle(Line.x1, Line.y1, 1, 1, this); 
        rectangleRectangle(rec); 
        remove(rec); 
       } 

       if (Line.x2 < (Tile.x + Tile.width) && (Line.x2) > Tile.x && Line.y2 < (Tile.y + Tile.height) && Line.y2 > Tile.y)//circle may be hitting one of the end points 
       { 
        rectangle rec=new rectangle(Line.x2, Line.y2, 1, 1, this); 
        rectangleRectangle(rec); 
        remove(rec); 
       } 

       if(Line.posSlope)//positive sloped line 
       { 
        //first we'll do the top left corner 
        int x1=Tile.x-Line.height; 
        int x2=Tile.x+Line.height; 
        int y1=Tile.y-Line.width; 
        int y2=Tile.y+Line.width; 
        Point topPoint=new Point(-99,-99), botPoint=new Point(-99,-99); 
        double topDistance=0, botDistance=0; 

        topPoint=intersection((double)x1,(double)y1,(double)x2,(double)y2,(double)Line.x1,(double)Line.y1,(double)Line.x2,(double)Line.y2);//find intersection 

        topDistance = Math.sqrt(Math.pow(Tile.x - topPoint.x,2) + Math.pow(Tile.y - topPoint.y, 2)); 

        //new let's do the bottom right corner 
        x1=Tile.x+Tile.width-Line.height; 
        x2=Tile.x+Tile.width+Line.height; 
        y1=Tile.y+Tile.height-Line.width; 
        y2=Tile.y+Tile.height+Line.width; 

        botPoint=intersection((double)x1,(double)y1,(double)x2,(double)y2,(double)Line.x1,(double)Line.y1,(double)Line.x2,(double)Line.y2);//find intersection 

        botDistance = Math.sqrt(Math.pow((Tile.x+Tile.width) - botPoint.x,2) + Math.pow((Tile.y+Tile.height) - botPoint.y, 2)); 


        if(topDistance<botDistance) 
        { 
         if(new Rectangle(Tile.x,Tile.y,Tile.width,Tile.height).contains(topPoint) && new Rectangle(Line.x,Line.y,Line.width,Line.height).contains(topPoint)) 
         { 
          Tile.move(topPoint.x,topPoint.y);text.out="collision detected!"; 
         } 
        } 
        else 
        { 
         if(new Rectangle(Tile.x,Tile.y,Tile.width,Tile.height).contains(botPoint) && new Rectangle(Line.x,Line.y,Line.width,Line.height).contains(botPoint)) 
         { 
          Tile.move(botPoint.x-Tile.width,botPoint.y-Tile.height);text.out="collision detected!"; 
         } 
        } 
       } 
       else//negative sloped lne 
       { 
        //first we'll do the top right corner 
        int x1=Tile.x+Tile.width-Line.height; 
        int x2=Tile.x+Tile.width+Line.height; 
        int y1=Tile.y+Line.width; 
        int y2=Tile.y-Line.width; 
        Point topPoint=new Point(-99,-99), botPoint=new Point(-99,-99); 
        double topDistance=0, botDistance=0; 

        topPoint=intersection((double)x1,(double)y1,(double)x2,(double)y2,(double)Line.x1,(double)Line.y1,(double)Line.x2,(double)Line.y2);//find intersection 

        topDistance = Math.sqrt(Math.pow(Tile.x + Tile.width - topPoint.x,2) + Math.pow(Tile.y - topPoint.y, 2)); 

        //new let's do the bottom left corner 
        x1=Tile.x-Line.height; 
        x2=Tile.x+Line.height; 
        y1=Tile.y+Tile.height+Line.width; 
        y2=Tile.y+Tile.height-Line.width; 

        botPoint=intersection((double)x1,(double)y1,(double)x2,(double)y2,(double)Line.x1,(double)Line.y1,(double)Line.x2,(double)Line.y2);//find intersection 

        botDistance = Math.sqrt(Math.pow(Tile.x - botPoint.x,2) + Math.pow((Tile.y+Tile.height) - botPoint.y, 2)); 


        if(topDistance<botDistance) 
        { 
         if(new Rectangle(Tile.x,Tile.y,Tile.width,Tile.height).contains(topPoint) && new Rectangle(Line.x,Line.y,Line.width,Line.height).contains(topPoint)) 
         { 
          Tile.move(topPoint.x-Tile.width,topPoint.y);text.out="collision detected!"; 
         } 
        } 
        else 
        { 
         if(new Rectangle(Tile.x,Tile.y,Tile.width,Tile.height).contains(botPoint) && new Rectangle(Line.x,Line.y,Line.width,Line.height).contains(botPoint)) 
         { 
          Tile.move(botPoint.x,botPoint.y-Tile.height);text.out="collision detected!"; 
         } 
        } 
       } 
      } 
    } 

     public Point intersection(double x1, double y1, double x2, double y2,double x3, double y3, double x4, double y4)//I didn't write this. got it from http://www.ahristov.com/tutorial/geometry-games/intersection-lines.html (I altered it) 
     { 
      double d = (x1 - x2) * (y3 - y4) - (y1 - y2) * (x3 - x4); 

      double xi = ((x3 - x4) * (x1 * y2 - y1 * x2) - (x1 - x2) * (x3 * y4 - y3 * x4))/d; 
      double yi = ((y3 - y4) * (x1 * y2 - y1 * x2) - (y1 - y2) * (x3 * y4 - y3 * x4))/d; 

      int x=(int)Math.round(xi); 
      int y=(int)Math.round(yi); 

      return new Point(x, y); 
     } 

//*************************************************************************************** 

    public static void main(String[] args) 
    { 
     final collision Collision=new collision(); 
      Collision.run(); 
    }//end main 
}//end class 
2

有一個問題:

Rectangle box1 = new Rectangle(100,100,100,100); 
Rectangle box2 = new Rectangle(200,200,100,100); 

// what this means is if any pixel in box2 enters (hits) box1 
if (box1.contains(box2)) 
{ 
    // collision occurred 
} 

// your code for moving the boxes 


這也可以應用到社交圈:

Ellipse2D.Double ball1 = new Ellipse2D.Double(100,100,200,200); 
Ellipse2D.Double ball2 = new Ellipse2D.Double(400,100,200,200); 

// what this means is if any pixel on the circumference in ball2 touches (hits) 
// ball1 
    if (ball1.contains(ball2)) 
    { 
     // collision occurred 
    } 

    // your code for moving the balls 



檢查是否你已打到你可以使用下面的屏幕的邊緣:

Rectangle screenBounds = jpanel.getBounds(); 
Ellipse2D.Double ball = new Ellipse2D.Double(100,100,200,200); // diameter 200 
Rectangle ballBounds = ball.getBounds(); 

if (!screenBounds.contains(ballBounds)) 
{ 
// the ball touched the edge of the screen 
} 
1

無需使用矩形......不斷比較的2名球員的座標。

like if(x1===x&&y1==y) 記得在比較的時候增加x的範圍。

如果烏拉圭回合矩形寬度爲30就拿if (x1>x&&x2>x+30) ..likewiseŸ