본문 바로가기
프로젝트/버블버블게임 만들기

[버블버블게임만들기] 12. 버블을 벽에 감지하기

by dantriss 2023. 8. 6.

유튜브에서 예전부터 해보고싶던 버블버블게임만들기 프로젝트를 클론코딩해보며 진행사항을 기록하고자 한다.

IDE : IntelliJ

언어 : Java 8

스프링부트 버전 : 2.7.13

DB : MySQL

빌드관리 도구 : Maven

OS : iOS

참고유튜브 : 메타코딩


버블들을 캐릭터가 쏘았을 때 벽을 감지해서 충돌한다면 멈추고 바로 위로 올라가도록 진행 해보자

 

backgroundPlayerService를 복사해서 backgroundBubbleService를 생성

 

불필요한 부분들은 제외하고 아래와 같이 코드를 남겨주면 된다.

 

public class BackgroundBubbleService {

    private BufferedImage image;
    private Bubble bubble;


    public BackgroundBubbleService(Bubble bubble) {
        this.bubble = bubble;
        try {
            image = ImageIO.read(new File("image/backgroundMapService.png"));
        } catch (Exception e) {
            System.out.println(e.getMessage());
        }
    }

    public boolean leftWall() {

        return false;
    }

    public boolean rightWall() {

        return false;


    }

    public boolean upWall(){

        return false;
    }

}

 

해당 클래스를 bubble 클래스에 컴포지션해서 사용할 준비를 해준다.

 

initObject에 backgroundBubbleService를 new 연산자를 통해서 선언을 해서 메모리에 띄워준다..

 

다시 backgroundBubbleService로 이동해서 버블의 기준점(x-10, y+25)을 잡아서 해당 기준점이 빨간색과 마주친다면

true를 리턴해주고 그외의 상황에선 false를 리턴해준다.

public boolean leftWall() {
    Color leftColor = new Color(image.getRGB(bubble.getX() - 10, bubble.getY() + 25));

    if (leftColor.getRed() == 255 && leftColor.getGreen() == 0 && leftColor.getBlue() == 0) {
        return true;
    }

    return false;
}

 

bubble 클래스로 이동해서 backgroudBubbleService에서 받은 값이 true라면 break로 더이상 진행하지 않고 up메서드로 진행해서 벽에 막힌상태로 위로 올라가게 된다.

@Override
    public void left() {
        left = true;
        for (int i = 0; i < 400; i++) {
            x--;
            setLocation(x,y);

            if (backgroundBubbleService.leftWall()){
                break;
            }

            try {
                Thread.sleep(1);
            } catch (InterruptedException e) {
                throw new RuntimeException(e);
            }
        }
        up();
    }

 

오른쪽도 같은 방법으로 진행해주면 된다.

public boolean rightWall() {
    Color rightColor = new Color(image.getRGB(bubble.getX() + 50 + 15, bubble.getY() + 25));
    if (rightColor.getRed() == 255 && rightColor.getGreen() == 0 && rightColor.getBlue() == 0) {
        return true;
    }
    return false;


}

 

그 후 프로그램을 실행해보면 벽 가까이에서 버블을 쏴도 벽에 가로 막힌 뒤 바로 위로 올라가는걸 확인할 수 있다.

버블이 좌우 벽에 막혀서 더이상 벽을 통과하지 않지만 위쪽벽에 닿았을때 멈추게 하기 위해서 같은 방법으로 위쪽 벽도 감지해서 충돌 했을때 멈추게 만들자

backgroundBubbleService에서 upWall메서드를 작성해주고 bubble 클래스에서 up메서드에도 left/right 메서드에서 한 것 과 같은 방법으로 true를 받았을 때 break를 넣어주면 된다.

public boolean upWall(){
    Color upColor = new Color(image.getRGB(bubble.getX() + 25, bubble.getY() - 10));
    if (upColor.getRed() == 255 && upColor.getGreen() == 0 && upColor.getBlue() == 0) {
        return true;
    }
    return false;
}

 

프로그램을 실행해보면 이제 버블들이 위쪽 벽을 뚫고 지나가지 않고 벽에 가로 막혀서 쌓이는걸 확인 할 수 있다.

댓글