[STS] 버블버블 - 적군 만들기

적군을 생성하고 물방울로 공격하기 초기 셋팅을 하겠습니다.
HootJem's avatar
Jan 06, 2025
[STS] 버블버블 - 적군 만들기
 

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); }
notion image
 

2. 물방울로 공격하기

notion image
물방울이 적군에 닿았는지 감지하기 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(); } }
notion image
현재 이미지들의 크기는 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 값은 계산하지 않았기 때문에 이렇게 지나가도 충돌 로그가 출력됩니다…
notion image
위와 같은 방법으로 계산하여 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); }
notion image
 
Share article

[HootJem] 개발 기록 블로그