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

[버블버블게임만들기] 5. 스레드로 벽 감지해서 충돌방지하기(1)

by dantriss 2023. 8. 1.

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

IDE : IntelliJ

언어 : Java 8

스프링부트 버전 : 2.7.13

DB : MySQL

빌드관리 도구 : Maven

OS : iOS

참고유튜브 : 메타코딩


보통 게임을 하다보면 캐릭터가 모든곳을 이동하지 못하고 벽에 가로막혀서 이동할 수 없는 공간이 있다.

해당 프로젝트에서도 마찬가지로 캐릭터가 화면 밖으로 이동하지 못하게 벽을 감지해주는 기능을 작성하고자한다.

 

BackgroundPlayerService 클래스를 생성 후 runnable 을 상속해준다.

 

run메서드를 오버라이드 해준다. (mac : commend + o)

 

BubbleFrame 클래스로 이동해서 initObject 메서드에 맵 사진을 backgroundMapService.png로 변경해주고 실행해주면

빨간색과 파란색으로 이루어진 화면이 보인다.

 

이 색을 기준으로 벽으로 만들어 캐릭터 이미지가 해당 색에 가까워졌을때 더이상 해당 방향으로 이동하지 못하게 막을 것이다.

해당부분을 테스트 하기위해서 backgroundMapService 클래스로 이동해서

맵 이미지를 test.png로 만들어주고 콘솔에 색을 rgb로 표현해보자

public class BackgroundPlayerService implements Runnable{
    private BufferedImage image;
    private Player player;

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

    @Override
    public void run() {

        Color Color = new Color(image.getRGB(player.getX(), player.getY()));
		System.out.println("컬러확인 : "+rightColor);

    }
}

 

프로그램을 실행해보면 캐릭터가 위치한 곳에 색상을 콘솔에서 볼 수 있다.

생각한건 캐릭터가 빨간 영역에 있어서 빨간색으로 표현될 줄 알았는데 콘솔에는 하얀색으로 출력이 된다.

반복문으로 테스트를 해보지 않았기 때문에 반복문 while을 넣어서 테스트를 진행해보자

 

while문을 true값으로 무한 반복하게 진행하고 스레드간에 0.01초 텀을 주고 실행해본다.

    @Override
    public void run() {
    
        while (true){
        Color color = new Color(image.getRGB(player.getX() -10, player.getY()+25));
        System.out.println("컬러확인 : "+color);

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

 

캐릭터를 움직여보면 무조건 흰색이 출력되는게 아니라 붉은색도 출력이 되고 파란색도 출력이 되는걸 확인 할 수 있다.

 

캐릭터 이미지에서 기준이 되는 포인트가 캐릭터 왼쪽 상단에 있는것으로 판단해 좌표를 변경해서 왼쪽과 오른쪽으로 나눠서 다시 확인해보자

    @Override
    public void run() {
        while (true){
        Color leftColor = new Color(image.getRGB(player.getX() -10, player.getY()+25));
        Color rightColor = new Color(image.getRGB(player.getX()+50+15, player.getY()+25));
        System.out.println("left컬러확인 : "+leftColor);
        System.out.println("right컬러확인 : "+rightColor);

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

 

기준좌표를 변경하니 아래와 같이 출력되는걸 확인할 수 있었다.

 

해당 기준점들을 기준으로 캐릭터가 왼쪽벽과 오른쪽 벽에 접촉을 했을때의 상황을 콘솔에 출력을 해보자

    @Override
    public void run() {
    
        while (true){
        Color leftColor = new Color(image.getRGB(player.getX() -10, player.getY()+25));
        Color rightColor = new Color(image.getRGB(player.getX()+50+15, player.getY()+25));

        if (leftColor.getRed() == 255 && leftColor.getGreen() == 0 && leftColor.getBlue() ==0) {
            System.out.println("왼쪽벽에 충돌");
        }else if (rightColor.getRed() == 255 && rightColor.getGreen() == 0 && rightColor.getBlue() ==0){
            System.out.println("오른쪽벽에 충돌");
        }

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

 

프로그램을 실행 후 바로 왼쪽벽에 충돌이 일어나는 상황이 있을 수 있는데 해당 부분은 player에서 처음 캐릭터이미지가 위치하는 좌표를 수정해주면 된다.

 

이제 캐릭터가 움직이면서 기준점이 붉은색벽과 닿으면 충돌했다는 걸 확인할 수 있었고 해당 방법을 기준점으로 캐릭터가 벽에 닿았을때 더이상 이동하지 못하게 막아주면 된다.

댓글