2015-05-29 4 views
0

Я работаю над проектом для школы и реализовал способ проверить, пересекаются ли эти два объекта. Я определил два прямоугольника, но когда он проверяет, пересекаются ли они, это всегда верно, даже если они находятся на противоположных сторонах JFrame. Boolean Collision имеет значение false в начале, а x и y - координаты двух фотографий на экране.Прямоугольник Java Прямоугольник всегда True

public Rectangle Bounds() { 
    return (new Rectangle(x, y, 225, 225)) ; 
} 
public Rectangle TrollBounds() { 
    return (new Rectangle(x, y, 24, 24)) ; 
} 
Rectangle hitbox = Bounds() ; 
Rectangle Hitbox2 = TrollBounds() ; 

та часть, которая проверяет наличие пересечений

if (hitbox.intersects(Hitbox2)) { 
      collision = true ; 
      System.out.println("collision") ; 
     } else { 
      collision = false ; 

Весь класс

import java.awt.Color; 
import java.awt.Graphics; 
import java.awt.Graphics2D; 
import java.awt.Rectangle; 
import java.awt.event.KeyEvent; 
import java.awt.event.KeyListener; 
import java.awt.image.BufferedImage; 
import java.io.IOException; 
import javax.imageio.ImageIO; 
import javax.swing.JPanel; 

public class Screen extends JPanel implements Runnable, KeyListener { 

int health = 1200; 

boolean collision = false ; 

BufferedImage Troll ; 
int cubex = 600 ; 
int cubey = 100 ; 

int cubexx = 200 ; 
int cubeyy = 200 ; 

public boolean running = true ; 
BufferedImage Player; 
int x = 100 ; 
int y = 100 ; 

boolean Jumping = false ; 
int startJump = 10 ; 

public void Jump() { 

} 

boolean up = false; 
boolean down = false; 
boolean left = false; 
boolean right = false; 

public Screen() { 
    loadImages(); 
    Thread thread = new Thread(this); 
    thread.start(); 
} 

private void loadImages() { 
    try { 
     Player = ImageIO.read(getClass().getResource("/sanic.png")); 
     Troll = ImageIO.read(getClass().getResourceAsStream("/Trollface.png")) ; 
    } catch (IOException e) { 
     e.printStackTrace(); 
    } 
} 

public void keyPressed(KeyEvent e) { 

    if (e.getKeyCode() == KeyEvent.VK_W) { 
     up = true ; 
    } 
    if (e.getKeyCode() == KeyEvent.VK_A) { 
     left = true ; 
    } 
    if (e.getKeyCode() == KeyEvent.VK_D) { 
     right = true ; 
    } 
    if (e.getKeyCode() == KeyEvent.VK_S) { 
     down = true ; 
    } 
    if (e.getKeyCode() == 31) { 
     Jump() ; 
    } 


} 

public void keyReleased(KeyEvent e) { 

    if (e.getKeyCode() == 87) { 
     up = false ; 
    } 
    if (e.getKeyCode() == 65) { 
     left = false; 
    } 
    if (e.getKeyCode() == 68) { 
     right = false ; 
    } 
    if (e.getKeyCode() == 83) { 
     down = false ; 
    } 

} 

@Override 
public void keyTyped(KeyEvent e) { 


} 

@Override 
public void run() { 

    while(running) { 
     //gravity 

     //gravity 
     //Player movement 
     if (left) { 
      if (x <= -10) { 
       x = 1464 ; 
      } 
      x = x - 2 ; 
     } 
     if (up) { 
      if(y <= -112) { 
       y = 910 ; 
      } 
      y = y - 2 ; 
     } 
     if (right) { 
      if (x >= 1416) { 
       x = -24 ; 
      } 
      x = x + 2; 
     } 
     if (down) { 
      if (y >= 900) { 
       y = -10 ; 
      } 
      y = y + 2 ; 
     } 
     //Player movement 

     //ball movement 
     if (cubey > y) { 
      cubey-- ; 
     } 
     if(cubey < y) { 
      cubey++ ; 
     } 
     if (cubex > x) { 
      cubex-- ; 
     } 
     if (cubex < x) { 
      cubex++ ; 
     } 
     //ball movement 

     if (hitbox.intersects(Hitbox2)) { 
      collision = true ; 
      System.out.println("collision") ; 
     } else { 
      collision = false ; 
     } 

     if (collision) { 
      health -- ; 
     } 
     System.out.println(collision) ; 

     repaint() ; 

     try { 
      Thread.sleep(3) ; 
     } catch (InterruptedException e) { 
      e.printStackTrace(); 
     } 
    } 
} 

protected void paintComponent(Graphics g) { 
    super.paintComponent(g); 
    Graphics2D g2d = (Graphics2D) g; 
    //Graphical loop start 
    g.drawImage(Player, x, y, null) ; 
    g.drawImage(Troll, cubex, cubey, null) ; 
    g.drawString("SANIC", x, y) ; 
    g2d.fillRect(220, 200, health, 50) ; 
    //Graphical loop end 

} 

public Rectangle Bounds() { 
    return (new Rectangle(x,y,cubex+225,cubey+225)) ; 
} 
public Rectangle TrollBounds() { 
    return (new Rectangle(cubex,cubey,cubex+24,cubey+24)) ; 
} 
Rectangle hitbox = Bounds() ; 
Rectangle Hitbox2 = TrollBounds() ; 

}

+4

Оба из ваших прямоугольников включают одну и ту же начальную точку '(x, y)'. Поэтому неудивительно, что они всегда пересекаются. –

+0

Нет, возвращает 'false' для меня (' bounds = new Rectangle (100, 100, 225, 225) 'и' trollBounds = new Rectangle (0, 0, 24, 24) ') – MadProgrammer

+2

В подобных обстоятельствах вы должны нарисуйте 'Прямоугольник' на экране ('Graphics2D # draw (Shape)'), чтобы увидеть, что они на самом деле;) – MadProgrammer

ответ

2

Если этот код побежал, как приказано, с созданием хитбокс и Hitbox2 сразу после друг друга и без изменения x и y между ними, тогда он должен возвращать true.

Он будет создавать прямоугольник от x, y до 255, 255 и другой от x, y до 24,24, и эти прямоугольники пересекаются.

Вот JavaDoc на Rectangle & Shape.intersects().

Смежные вопросы