하나의 사각형이 다른 사각형과 충돌했다는 문제가 있습니다. 그래서 내 질문은 어떻게 충돌을 검사하는 intersect 메서드를 얻을 수 있습니까? 아니면이 상황에서 충돌을 처리 할 수있는 다른 방법이 있습니까?Slick2D 사각형 충돌 감지
플레이어의 캐릭터가 화면의 오른쪽에 있고 적이 왼쪽에있는 턴 기반 전투 게임 (파이널 판타지 또는 드래곤의 전설과 비슷합니다)을 만들고 있습니다. 플레이어와 적 각각이 차례로 공격을합니다. 따라서 플레이어가 공격을하면 스프라이트 애니메이션이 화면을 가로 질러 오른쪽에서 왼쪽으로 움직여 적, 공격 앞에서 멈출 때까지 시작 좌표로 돌아갑니다. 플레이어와 적 모두 주위에 각 캐릭터의 경계를 나타내는 직사각형이 그려져 있습니다.
플레이어가 앞으로 움직이면 적의 직사각형을 통과하고 그 안에 멈 춥니 다. 이 시점에서 콘솔에 "INTERSECT!"라고 출력되어야합니다. 두 직사각형 사이에 충돌이 있음을 보여주기 위해 불행히도 존재하지 않습니다.
클래스 내에서 불필요한 코드를 생략하고 내 문제와 관련된 코드를 제공하려했음을 유의하십시오. 이 내 플레이어 클래스에서 엿볼
public class GameClass extends BasicGame{
//other variable declarations
public void init(GameContainer container) throws SlickException {
player = new Player();
enemy = new Enemy();
skeleton = new Skeleton();
enemy = skeleton;
playX = player.getStartX(); //700
playY = player.getStartY(); //140
playW = player.rect.getWidth(); //40
playH = player.rect.getHeight(); //70
enemyX = enemy.getStartX(); //100
enemyY = enemy.getStartY(); //140
enemyWidth = enemy.getWidth(); //50
enemyHeight = enemy.getHeight(); //55
SpriteSheet sheet = new SpriteSheet("data/homeranim.png", 36, 65);
anim = new Animation();
for (int i=0;i<8;i++) {
anim.addFrame(sheet.getSprite(i,0), 150);
}
}
public void render(GameContainer container, Graphics g)
throws SlickException {
anim.draw(playX,playY); // draws player animation
skeletonAnim.draw(enemyX, enemyY); // draws enemy
g.draw(player.rect); //draws player bounds
g.draw(enemy.rect); //draws enemy bounds
}
public void update(GameContainer container, int delta)
throws SlickException {
playerUpdate(delta);
if (player.rect.intersects(enemy.rect)) {
System.out.println("INTERSECT!");
System.out.println("Player minX: " + player.rect.getMinX());
System.out.println("Player maxX: " + player.rect.getMaxX());
System.out.println("Enemy minX: " + enemy.rect.getMinX());
System.out.println("Enemy maxX: " + enemy.rect.getMaxX());
}
}
public void playerUpdate(int delta) {
if (playerForward == true){
playX -= delta * 0.4f;
if (playX <= 140) {
playX = 140;
playerForward = false;
playerBackward = true;}
}
if (playerBackward == true) {
playX += delta * 0.4f;
if (playX >= 700) {
playX = 700;
playerBackward = false;
delay = 1250;
}
public void keyReleased(int key, char c) {
if (key == Input.KEY_ENTER){
playerForward = true;}
}
}
:
public class Player {
private int startX = 700;
private int startY = 140;
public Shape rect = new Rectangle(startX, startY, 40, 70);
//plus getters and setters
}
그리고 내 전체 적 클래스 :
public class Enemy {
private int startX, startY, width, height;
public Shape rect = new Rectangle(startX, startY, width, height);
// plus getters and setters
}
내 해골
이것은, GameClass 내 진입 점입니다 클래스 확장 Enemy :
public class Skeleton extends Enemy {
public Skeleton() {
// TODO Auto-generated constructor stub
setMaxHealth(120);
setStartX(100);
setStartY(140);
setWidth(50);
setHeight(55);
}
}
참고 : g.drawRect()를 g.draw()로 전환 했으므로 적 사각형이 그려지지 않습니다. 시작 지점에서
사각형 경계 : http://i.imgur.com/QDDk858.png
사각형 바인딩 충돌이 있어야한다 : http://i.imgur.com/pOANfvN.png
나는 내 문제가 무엇인지를 보여 충분한 코드를 제공 한 바랍니다. 나는 운이없는 몇 시간 동안 인터넷을 뒤적 거리다. 제공해야하는 다른 코드가 있으면 언제든지 물어보십시오. 여러분의 도움과 성원에 진심으로 감사드립니다!
그럼 정확한 문제는 무엇입니까? intersects 메서드가 실행되고 있지 않습니까? – 1337
그리고 x 및 y 대신 centerX 및 centerY로 히트 박스를 만드는 이유는 무엇입니까? Rectangle 생성자의 인수는 가운데가 아니라 (startX, startY, width, height)입니다. 그래서 이것은 히트 박스가 상쇄 될 때 문제가 될 수 있습니다. – 1337
정확하게, intersects 메서드가 트리거되지 않습니다. centerX와 centerY 변수는 직사각형이 오프셋이나 그 밖의 어떤 것도 그려지지 않기 때문에 이름이 잘못 지정되었습니다. 그것들은 startX와 startY를 나타냅니다. 편집 : startX, 등 centerX 변경했습니다 – Breezy