백그라운드 이미지를 test 로 변경한 뒤 확인해 보겠습니다.
private void initObject() {
backgroundMap = new JLabel(new ImageIcon("image/test.png"));
setContentPane(backgroundMap);
player = new Player();
add(player);
}

이 이미지를 버퍼로 읽고 있어야 캐릭터가 위치하고 있는 색깔이 어디인지 알 수 있습니다.
메인 스레드는 이미 키보드 이벤트를 처리하고 있기 때문에 플레이어를 관찰할 새 클래스를 생성합니다.
// 메인 스레드 바쁨 - 키보드 이벤트 처리해야됨
// 백그라운드에서 플레이어 관찰
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
를 사용하여 작성합니다.실행하면 이렇게 해당 색상을 감지하는 것을 볼 수 있습니다.

255.255.255 는 하얀색이라는 의미입니다. 캐릭터의 왼쪽상단이 x,y 좌표이기 때문입니다.

따라서 이 감지하는 부분을


이렇게 변경해 주어야 합니다.
이러게 코드를 작성한 뒤 실행해 보면 아래와 같은 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