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

    [STS] 버블버블 - 리팩토링 하기

    HootJem's avatar
    HootJem
    Jan 06, 2025
    [STS] 버블버블 - 리팩토링 하기
    지금 코드는 BubbleFrame 이 주체가 되어서 방울이 만들어 지고 있다. 하지만 행위의 주체는 Player 가 되는게 옳다. (플레이어가 방울을 만들어 공격하기 때문에)
    버블 프레임의 코드를 주석 처리 해준다.
    case KeyEvent.VK_SPACE: //Bubble bubble = new Bubble(mContext); //add(bubble); break; }
     
    Moveable 인터페이스에 attack 메서드를 추가해준다. 이때 디폴트로 만든 이유는 bubble 은 어택하지않고, 플레이어가 어택을 하기 때문
    public interface Moveable { public abstract void left(); public abstract void right(); public abstract void up(); default public void down() {}; default public void attack() {}; }
     
    Player 클래스로 가서 플레이어가 attack메서드를 통해 bubble 을 생성하도록 변경한다.
    이때도 BubbleFrame를 가져와야 하기 때문에 생성자 주입을 하도록 코드를 수정한다.
    private BubbleFrame mContext; public Player(BubbleFrame mContext) { this.mContext = mContext; initObject(); initSetting(); initBackgroundPlayerService(); }
    @Override public void attack() { Bubble bubble = new Bubble(mContext); if(playerDirection == playerDirection.LEFT) { bubble.left(); }else { bubble.right(); } }
     
    그리고 처음에 주석 처리했던 BubbleFrame 의 Space를 수정한다.
    이 코드를 통해 물방울이 BubbleFrame 이 주체가 되어 생성하지 않고, 플레이어가 생성할 수 있도록 할 수 있다.
     
    case KeyEvent.VK_SPACE: player.attack(); break; }
    ❗ 이렇게 실행하니 프로그램이 제대로 실행되지 않음 ❗
    현상 : 스페이스를 누를 때 마다 굉장히 버벅이며 프로그램 종료가 되지 않는다.
    Bubble 클래스의 initThread 에서 left, right 메서드를 호출하는데 attack 에서 호출하니 스레드가 충돌하는 모양이다…
    스레드가 생성되는 위치가 변경되어야 한다.
    private void initThread() { new Thread(()-> { System.out.println("스레드 실행 시작"); if(player.getPlayerDirection()==PlayerDirection.LEFT) { left(); }else { right(); } System.out.println("스레드 실행 완료"); }) .start(); }
    문제가 된 코드
    위의 코드는 지우고 attack 메서드가 실행될 때 스레드가 만들어지도록 변경하였다.
    @Override public void attack() { new Thread(()->{ Bubble bubble = new Bubble(mContext); if(playerDirection == playerDirection.LEFT) { bubble.left(); }else { bubble.right(); } }).start(); }
    수정된 코드
     
    ❗캐릭터는 문제없이 움직이지만 방울이 나오지 않는다.❗
    콘솔 로그를 확인하니 호출하는 부분은 문제없이 작동되었다
    mContext.add(bubble);
    화면에 표시되는 코드가 없어서… 안나왔던것
    방울 시작 방울 시작 방울 왼쪽 방울 종료 방울 오른쪽 방울 종료
    코드는 정상적으로 작동하더라도 화면에 표시가 되는 것은 BubbleFrame이 수행하기 때문에
    add 를 명시해 주지 않으면 화면에 나타나지 않는다(체크하기)
     

    💡
    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. 리팩토링 하기
    1. 적군 만들기
     
    Share article

    [HootJem] 개발 기록 블로그

    RSS·Powered by Inblog