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

    [STS] 버블버블 - 충돌감지

    HootJem's avatar
    HootJem
    Oct 29, 2024
    [STS] 버블버블 - 충돌감지
    백그라운드 이미지를 test 로 변경한 뒤 확인해 보겠습니다.
    private void initObject() { backgroundMap = new JLabel(new ImageIcon("image/test.png")); setContentPane(backgroundMap); player = new Player(); add(player); }
    notion image
    이 이미지를 버퍼로 읽고 있어야 캐릭터가 위치하고 있는 색깔이 어디인지 알 수 있습니다.
     
    메인 스레드는 이미 키보드 이벤트를 처리하고 있기 때문에 플레이어를 관찰할 새 클래스를 생성합니다.
    // 메인 스레드 바쁨 - 키보드 이벤트 처리해야됨 // 백그라운드에서 플레이어 관찰 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/test.png")); } catch (Exception e) { System.out.println(e.getMessage()); } } @Override public void run() { while(true) { // 플레이어의 위치에 따른 색상 확인 Color color = new Color(image.getRGB(player.getX(), player.getY())); System.out.println("색상"+color); try { Thread.sleep(10); } catch (Exception e) { System.out.println(e.getMessage()); } } } }
    이 BackGroundPlayerService 는 실행된 뒤 Player 객체가 만들어질 때 실행되도록 하겠습니다.
     
    public Player() { initObject(); initSetting(); initBackgroundPlayerService(); }
    private void initBackgroundPlayerService() { new Thread(new BackGroundPlayerService(this)).start(); }
    이 스레드 타깃은 Runnable 타입만 올 수 있는데 이미 BackGroundPlayerService 는 타입이기 때문에 그냥 넣을 수 있고, 해당 클래스가 Player 내부이기 때문에 this 를 사용하여 작성합니다.
     
    실행하면 이렇게 해당 색상을 감지하는 것을 볼 수 있습니다.
    notion image
    255.255.255 는 하얀색이라는 의미입니다. 캐릭터의 왼쪽상단이 x,y 좌표이기 때문입니다.
    notion image
    따라서 이 감지하는 부분을
    notion image
    notion image
    이렇게 변경해 주어야 합니다.
     
    이러게 코드를 작성한 뒤 실행해 보면 아래와 같은 rgb 가 출력되는 것을 볼 수 있습니다.
    left 가 255.0.0 이면 왼쪽이 빨간 벽에 닿은것,
    right 가 255.0.0 이면 오른쪽에 닿았다는 의미입니다.
    @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 + 10, player.getY()+25)); System.out.println("leftColor"+leftColor); System.out.println("rightColor"+rightColor); try { Thread.sleep(10); } catch (Exception e) { System.out.println(e.getMessage()); } } }
    leftColorjava.awt.Color[r=255,g=255,b=255] rightColorjava.awt.Color[r=255,g=0,b=0] leftColorjava.awt.Color[r=255,g=255,b=255] rightColorjava.awt.Color[r=255,g=0,b=0] leftColorjava.awt.Color[r=255,g=255,b=255] rightColorjava.awt.Color[r=255,g=0,b=0] leftColorjava.awt.Color[r=255,g=255,b=255] rightColorjava.awt.Color[r=255,g=0,b=0] leftColorjava.awt.Color[r=255,g=255,b=255] rightColorjava.awt.Color[r=255,g=0,b=0] leftColorjava.awt.Color[r=255,g=255,b=255] rightColorjava.awt.Color[r=255,g=0,b=0]
     
    이제 프레임과 서비스의 이미지를 backgroundMapservice.png 로 변경합니다.
    그리고 if 문을 추가하여 left, right 의 rgb 값을 가져오면 색상을 감지하여 왼쪽, 오른쪽 충돌 을 출력합니다.
    @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 (Exception e) { System.out.println(e.getMessage()); } } }
     
    잘 작성이 된다면 BackGroundPlayerService 클래스의 이미지는 그대로 둔 채 버블 프레임의 이미지만 backgroundMap.png 로 변경합니다.
    이는 서비스 클래스는 이미지를 IO로 읽어 충돌을 감지해야 하지만 유저가 그런 화면을 보며 플레이를 할 수는 없기 때문입니다.
     
    충돌을 하면 더이상 움직이지 않아야 합니다. (벽을 뚫고 화면밖으로 나갈 수는 없으니까요)
    다음 포스팅에서는 충돌 시 움직이지 않도록 코드를 작성해 보겠습니다.
     

    💡
    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
    Share article

    [HootJem] 개발 기록 블로그

    RSS·Powered by Inblog