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

HootJem's avatar
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로 읽어 충돌을 감지해야 하지만 유저가 그런 화면을 보며 플레이를 할 수는 없기 때문입니다.
 
충돌을 하면 더이상 움직이지 않아야 합니다. (벽을 뚫고 화면밖으로 나갈 수는 없으니까요)
다음 포스팅에서는 충돌 시 움직이지 않도록 코드를 작성해 보겠습니다.
 
Share article

[HootJem] 개발 기록 블로그