백그라운드 이미지를 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

