inblog logo
|
[HootJem] 개발 기록 블로그
    java

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

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

    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
     

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

    [HootJem] 개발 기록 블로그

    RSS·Powered by Inblog