| | package gameEngine.entites.gameComponents; |
---|
| | |
---|
| | import gameEngine.entites.Entity; |
---|
| | import gameEngine.entites.GameObject; |
---|
| | import gameEngine.views.Window; |
---|
| | |
---|
| | public class Collider extends GameComponent { |
---|
| | private GameObject parent; |
---|
| | private boolean isPassable; // すり抜け可能かどうか |
---|
| | |
---|
| | public Collider(GameObject parent, boolean isPassable) { |
---|
| | this.parent = parent; |
---|
| | this.isPassable = isPassable; |
---|
| | } |
---|
| | |
---|
| | @Override |
---|
| | public GameComponent copy() { |
---|
| | return new Collider(parent, isPassable); |
---|
| | } |
---|
| | |
---|
| | @Override |
---|
| | public void init() { |
---|
| | } |
---|
| | |
---|
| | @Override |
---|
| | public void update() { |
---|
| | for (Entity other : Window.get().getScene().entities.values()) { |
---|
| | GameObject otherObject = (GameObject) other; |
---|
| | if (otherObject == parent) continue; // 自分自身は無視 |
---|
| | |
---|
| | Collider otherCollider = otherObject.getComponent(Collider.class); |
---|
| | if (otherCollider != null && isCollidingWith(otherObject)) { |
---|
| | System.out.println("Collision detected between " |
---|
| | + parent.getName() + " and " + otherObject.getName()); |
---|
| | |
---|
| | if (!isPassable && !otherCollider.isPassable) { |
---|
| | resolveCollision(otherObject); |
---|
| | } |
---|
| | } |
---|
| | } |
---|
| | } |
---|
| | |
---|
| | private boolean isCollidingWith(GameObject other) { |
---|
| | Mesh thisMesh = parent.getComponent(Mesh.class); |
---|
| | Mesh otherMesh = other.getComponent(Mesh.class); |
---|
| | |
---|
| | if (thisMesh == null || otherMesh == null) { |
---|
| | return false; // Meshがない場合は判定できない |
---|
| | } |
---|
| | |
---|
| | float thisLeft = parent.transform.position.x; |
---|
| | float thisRight = thisLeft + thisMesh.getDisplayedWidth(); |
---|
| | float thisTop = parent.transform.position.y; |
---|
| | float thisBottom = thisTop + thisMesh.getDisplayedHeight(); |
---|
| | |
---|
| | float otherLeft = other.transform.position.x; |
---|
| | float otherRight = otherLeft + otherMesh.getDisplayedWidth(); |
---|
| | float otherTop = other.transform.position.y; |
---|
| | float otherBottom = otherTop + otherMesh.getDisplayedHeight(); |
---|
| | |
---|
| | return thisRight > otherLeft && thisLeft < otherRight && |
---|
| | thisBottom > otherTop && thisTop < otherBottom; |
---|
| | } |
---|
| | |
---|
| | private void resolveCollision(GameObject other) { |
---|
| | // 衝突を解消する処理 |
---|
| | Mesh thisMesh = parent.getComponent(Mesh.class); |
---|
| | Mesh otherMesh = other.getComponent(Mesh.class); |
---|
| | |
---|
| | if (thisMesh == null || otherMesh == null) { |
---|
| | return; |
---|
| | } |
---|
| | |
---|
| | float thisLeft = parent.transform.position.x; |
---|
| | float thisRight = thisLeft + thisMesh.getDisplayedWidth(); |
---|
| | float thisTop = parent.transform.position.y; |
---|
| | float thisBottom = thisTop + thisMesh.getDisplayedHeight(); |
---|
| | |
---|
| | float otherLeft = other.transform.position.x; |
---|
| | float otherRight = otherLeft + otherMesh.getDisplayedWidth(); |
---|
| | float otherTop = other.transform.position.y; |
---|
| | float otherBottom = otherTop + otherMesh.getDisplayedHeight(); |
---|
| | |
---|
| | float overlapX = Math.min(thisRight, otherRight) - Math.max(thisLeft, otherLeft); |
---|
| | float overlapY = Math.min(thisBottom, otherBottom) - Math.max(thisTop, otherTop); |
---|
| | |
---|
| | if (overlapX < overlapY) { |
---|
| | // 横方向の重なりを解消 |
---|
| | if (thisLeft < otherLeft) { |
---|
| | parent.transform.position.x -= overlapX; |
---|
| | } else { |
---|
| | parent.transform.position.x += overlapX; |
---|
| | } |
---|
| | } else { |
---|
| | // 縦方向の重なりを解消 |
---|
| | if (thisTop < otherTop) { |
---|
| | parent.transform.position.y -= overlapY; |
---|
| | } else { |
---|
| | parent.transform.position.y += overlapY; |
---|
| | } |
---|
| | } |
---|
| | } |
---|
| | |
---|
| | public boolean isPassable() { |
---|
| | return isPassable; |
---|
| | } |
---|
| | } |
---|
| | |
---|
| | |