1. 적군클래스 셋팅
적군은 화면의 상단에서 생성되어 맵을 랜덤으로 돌아다닙니다.
기본적인 움직임은 플레이어와 비슷하기 때문에 Player 클래스를 복사해서 수정하겠습니다.
플레이어는 PlayerDirection 을 통해 좌,우 방향을 알아봅니다. 이를 복사하고 Enemy 클래스에 넣고 다른 에러가 난 코드들을 수정해줍니다..
private EnemyDirection enemyDirection;
이때 attack 메서드는 필요없기 때문에 삭제 해 줍니다.
버블 프레임에 게임이 실행되면 보이도록 추가해 줍니다.
public class BubbleFrame extends JFrame {
private BubbleFrame mContext = this;
private JLabel backgroundMap;
private Player player;
private Enemy enemy;
private void initObject() {
backgroundMap = new JLabel(new ImageIcon("image/backgroundMap.png"));
setContentPane(backgroundMap);
player = new Player(mContext);
add(player);
enemy = new Enemy(mContext);
add(enemy);
}

2. 물방울로 공격하기

물방울이 적군에 닿았는지 감지하기 VS 적군이 물방울에 닿았는지 감지하기
- 물방울은 이미 하나씩 스레드를 갖고 있고 enemy의 좌표를 가져 온다.
- 적군은 모든 물방울의 정보를 가져와서 계산 해야한다.
물방울은 유저에 의해서 몇개든지 만들어질 수 있기 때문에 적군이 물방울을 감지하기 보다는 물방울에게 감지하는 역할을 주겠습니다.(첫번째 방법!)
public class Bubble extends JLabel implements Moveable{
private BubbleFrame mContext;
private Enemy enemy;
public Bubble(BubbleFrame mContext) {
this.mContext = mContext;
this.player = mContext.getPlayer();
this.enemy = mContext.getEnemy();
initObject();
initSetting();
}
}

현재 이미지들의 크기는 50x50 이고
물방울과 적이 딱 붙어있을때 다음과 같은 좌표를 가진다고 가정합니다.
만약 (0.0) 물방울과 (50.0) 적군이 있을 때
물방울이 (0.10) 이 되면 적군과 부딪혔다고 볼 수 있습니다.
10-50 = -40 ⇒ 40
적군이 (50.0) 물방울이 (100.0) 위치에 존재할 때 물방울이 (90.0) 으로 이동하면 이 또한 충돌했다고 볼 수 있습니다.
50-90=40 ⇒ 40
Math.abs
를 사용하여 절댓값으로 계산해 보겠습니다.left 메서드에 계산식을 추가했습니다.
@Override
public void left() {
left = true;
for(int i=0; i<400; i++) {
x--;
setLocation(x, y);
if(backGroundBubbleService.leftWall()) {
left = false;
break;
}
if(Math.abs(x - enemy.getX()) > 40 && Math.abs(x - enemy.getX()) < 60) {
System.out.println("적군 충돌");
}
try {
Thread.sleep(1);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
up();
}
for문 내부에서 실행되기 때문에 물방울이 적군을 지나가는동안 계속 충돌 로그가 나오는 것을 볼 수 있습니다.
방울 시작 적군 충돌 적군 충돌 적군 충돌 적군 충돌 적군 충돌 적군 충돌
문제는 Y 값은 계산하지 않았기 때문에 이렇게 지나가도 충돌 로그가 출력됩니다…

위와 같은 방법으로 계산하여 Y 값도 적용 하면 문제 없이 적과 방울이 닿았을 때 로그가 나타납니다.
if((Math.abs(x-enemy.getX()) > 40 && Math.abs(x-enemy.getX())<60) &&
(Math.abs(y-enemy.getY()) > 0 && Math.abs(y-enemy.getY())<50)) {
System.out.println("적군 충돌");
}
이후 attack 메서드를 만들어 주겠습니다.
이는 물방울과 적군이 닿았을 때 호출하여
물방울 모양을 적이 가둔 모양으로 변경하는 역할을 하게 됩니다.
@Override
public void attack() {
state = 1;
setIcon(bubbled);
}

- 게임 맵과 캐릭터 추가 https://inblog.ai/hj/sts-버블버블-게임-맵과-캐릭터-추가하기-33126
- 스레드 사용하여 이동하기 https://inblog.ai/hj/sts-버블버블-스레드-사용이동-33335
- 외벽 충돌 시 캐릭터 정지 https://inblog.ai/hj/sts-버블버블-외벽-충돌-시-캐릭터-정지-36946
- 캐릭터 업 다운 시키기 https://inblog.ai/hj/sts-버블버블-캐릭터-업-다운-38143
- 물방울 생성하기(기본셋팅) https://inblog.ai/hj/sts-버블버블-물방울-기본-셋팅-38154
- 물방울 움직이게 하기 https://inblog.ai/hj/sts-버블버블-물방울-움직이게-하기-38195
- 물방울 메모리에서 해제 하고 화면 다시 그리기 https://inblog.ai/hj/sts-버블버블-물방울-완성하기-38589
- 적군 만들기
Share article