여러 객체간에 충돌 감지를 구현하는 방법을 이해하려고합니다. 프로젝트가 개체 간의 충돌을 감지했지만 즉시 충돌합니다.많은 개체 간의 게임 충돌 감지?
이는 JFrame
와 Main Loop
내 주요 클래스 :
public class Window {
public static void main(String[] args){
GamePanel gamepanel = new GamePanel();
JFrame f = new JFrame("Multiple Collision Detection");
f.setSize(400, 400);
f.add(gamepanel);
f.setVisible(true);
f.setResizable(false);
f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
f.setLocationRelativeTo(null);
while(true){
gamepanel.repaint();
gamepanel.update();
try{
Thread.sleep(10);
}catch(Exception e){
System.out.println("Main Loop Error");
}
}
}
}
:
플레이어 :
public class Player {
int x = 175, y = 175, w = 50, h = 50, dx = 0, dy = 0;
Rectangle rect;
public void paint(Graphics g) {
rect = new Rectangle(x, y, w, h);
g.setColor(Color.black);
g.fillRect(rect.x, rect.y, rect.width, rect.height);
g.setColor(Color.CYAN);
g.drawRect(x, y, w, h);
}
public void setDx(int dx) {
this.dx = dx;
}
public void setDy(int dy) {
this.dy = dy;
}
public void move() {
x += dx;
y += dy;
}
public void update() {
move();
}
}
을
에노시 :
public class Enemy {
int x, y, w = 35, h = 35;
Rectangle rect;
public Enemy(int x, int y) {
this.x = x;
this.y = y;
}
public void paint(Graphics g) {
rect = new Rectangle(x, y, w, h);
g.setColor(Color.red);
g.fillRect(rect.x, rect.y, rect.width, rect.height);
}
public void update() {
}
}
I했습니다 통해 (이 경우 3) 하나 이상의 적을 그리는 EnemyManager의 클래스 A List
:
public class EnemyManager {
Player player = new Player();
Rectangle playerrect;
Rectangle enemyrect;
List<Enemy> enemies = new ArrayList<Enemy>();
public void paint(Graphics g) {
enemies.add(new Enemy(20, 20));
enemies.add(new Enemy(320, 20));
enemies.add(new Enemy(20, 320));
for (Enemy e : enemies) {
e.paint(g);
}
}
public void update() {
}
}
마지막으로 난했습니다 다른 클래스에서 Graphics
을 그리는의 GamePanel 클래스 (Player
및 EnemyManager
) :
public class GamePanel extends JPanel implements KeyListener{
Player player = new Player();
EnemyManager enemymanager = new EnemyManager();
public void paint(Graphics g){
g.setColor(Color.LIGHT_GRAY);
g.fillRect(0, 0, 400, 400);
player.paint(g);
enemymanager.paint(g);
}
public void checkPlayerEnemyCollision(){
for(Enemy e : enemymanager.enemies){
if(e.rect.intersects(player.rect)){
System.out.println("Collision");
}
}
}
public void update(){
addKeyListener(this);
setFocusable(true);
player.update();
enemymanager.update();
checkPlayerEnemyCollision();
}
@Override
public void keyPressed(KeyEvent e) {
if(e.getKeyCode() == KeyEvent.VK_W){
player.setDy(-2);
}
if(e.getKeyCode() == KeyEvent.VK_S){
player.setDy(2);
}
if(e.getKeyCode() == KeyEvent.VK_A){
player.setDx(-2);
}
if(e.getKeyCode() == KeyEvent.VK_D){
player.setDx(2);
}
if(e.getKeyCode() == KeyEvent.VK_ESCAPE){
System.exit(0);
}
}
@Override
public void keyReleased(KeyEvent e) {
if(e.getKeyCode() == KeyEvent.VK_W){
player.setDy(0);
}
if(e.getKeyCode() == KeyEvent.VK_S){
player.setDy(0);
}
if(e.getKeyCode() == KeyEvent.VK_A){
player.setDx(0);
}
if(e.getKeyCode() == KeyEvent.VK_D){
player.setDx(0);
}
}
}
, 그것은 콘솔에 "충돌"을 인쇄하지만 그 후이 오류와 충돌 :
누구든지 문제가 무엇인지, 어떻게 해결할 수 있는지 알고 있습니까?
미리 감사드립니다.
그건 적절하지 않습니다 (또는 올바른 수정). ConcurrentModificationException을 발생시키지 않는 유일한 이유는 활성 Iterator가 없기 때문입니다. 대신 그는 1) 같은 적을 두 번 그린다. 2) 한계를 넘을 때 IndexOutOfBounds를 예외로한다. 3) 마지막 인덱스를 얻은 후 추가되기 때문에 적을 페인팅하지 않는다. –