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

    [STS] 버블버블 - 캐릭터 업 다운

    HootJem's avatar
    HootJem
    Dec 18, 2024
    [STS] 버블버블 - 캐릭터 업 다운
    notion image
    캐릭터가 점프 했을 시 파란 바닥에 착지 하거나, 공중일 때는 바닥으로 떨어져야 한다.
    지금은 캐릭터의 상단 좌, 우 의 컬러를 감지해 벽과 충돌했는지 감지하는 leftColor 와 rightColor 가 있다. 바닥 충돌 감지를 위해서는 X,Y 값의 계산을 수정해야한다.
    notion image
    int bottomColor = image.getRGB(player.getX()+25, player.getY()+50 + 5); System.out.println("바닥 색상"+bottomColor);
    이렇게 코드를 추가한 뒤 실행해 보면
    공중일 때 -1
    바닥에 닿고 있을 때 -16776961 이런 숫자가 로그에 나온다.
    즉 -1 일때만 바닥으로 떨어뜨리면 된다는 결과가 나온다.
    notion image
    조금 응용해서 캐릭터의 왼쪽, 오른쪽 하단을 감지하도록 하면
    캐릭터가 걸쳐져야 할 때 (어느 한쪽이라도 바닥에 닿아있다면) 으로 조건 수정이 가능하다.
    (
    notion image
    int bottomColor = image.getRGB(player.getX(), player.getY()+50 + 5) // 왼쪽 하단 + image.getRGB(player.getX()+50, player.getY()+50 + 5); // 오른쪽 하단
    이 코드를 추가 하고 player 의 Down 메서드를 수정한다.
    if(bottomColor != -1) { System.out.println("바닥에 충돌함"); player.setDown(false); }
    현재 for 문이 들어있기 때문에 false 로 상태가 변경 되더라도 메서드에 영향을 미치지 않기 때문에 while 로 변경하여 상태를 확인해야 한다.
    @Override public void down() { System.out.println("down"); down = true; new Thread(()->{ for(int i=0; i<130/JUMPSPEED; i++) { y = y + JUMPSPEED; setLocation(x, y); try { Thread.sleep(3); } catch (InterruptedException e) { e.printStackTrace(); } } down = false; }).start(); }
     
    이미 false 라서 공중을 걷더라도 바닥에 떨어지지 않음
    이미 false 라서 공중을 걷더라도 바닥에 떨어지지 않음
     
    notion image
     
    그렇다면 이번엔 바닥이 없을 때 하강을 시켜야 한다.
    int bottomColor = image.getRGB(player.getX() + 25, player.getY()+50 + 5); if(bottomColor != -1) { //System.out.println("바닥에 충돌함"); player.setDown(false); }
    현재 바닥이 존재할 때 -1 이라는 bottomColor 를 추적하여 플레이어를 바닥에 착지 시키고 있다.
    그렇다면 바닥이 존재하지 않는다면 down 을 시키면 될 것이다.
    up 상태가 아닐 때 다운을 시켜야 캐릭터가 빈 바닥을 만났을 때 하강하게 된다. (if문이 빠진다면 아무 변화가 없음)
     
    else { if(!player.isUp()) { player.down(); } }
    이렇게 설정하니 무한으로 down 이 실행되어 캐릭터가 프레임을 뚫고 추락해 버린다..
     
    Exception in thread "Thread-0" java.lang.ArrayIndexOutOfBoundsException: Coordinate out of bounds! at java.desktop/sun.awt.image.ByteInterleavedRaster.getDataElements(ByteInterleavedRaster.java:314) at java.desktop/java.awt.image.BufferedImage.getRGB(BufferedImage.java:918) at bubble.test.ex09.BackGroundPlayerService.run(BackGroundPlayerService.java:31) at java.base/java.lang.Thread.run(Thread.java:1583)
     
    움직임을 관리해주는 Player 클래스에 true, false 상태를 확인하지 않고
    계속해서 실행되기 때문이다.
    @Override public void down() { //System.out.println("down"); down = true; new Thread(()->{ while(down) { y = y + JUMPSPEED; setLocation(x, y); try { Thread.sleep(3); } catch (InterruptedException e) { e.printStackTrace(); } } down = false; }).start(); }
    @Override public void down() { if(down==false) { //System.out.println("down"); down = true; new Thread(()->{ while(down) { y = y + JUMPSPEED; setLocation(x, y); try { Thread.sleep(3); } catch (InterruptedException e) { e.printStackTrace(); } } down = false; }).start(); } }
    이렇게 down 메서드에서 상태 체크를 하거나 if 문 자체에서 조건을 하나 더 추가해준다.
    else { if(!player.isUp() && !player.isDown()) { System.out.println("down"); player.down(); } }
     
    notion image
    이렇게 움직임이 완성 되었다.
     

    💡
    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
    1. 외벽 충돌 시 캐릭터 정지 https://inblog.ai/hj/sts-버블버블-외벽-충돌-시-캐릭터-정지-36946
    1. 캐릭터 업 다운 https://inblog.ai/hj/sts-버블버블-캐릭터-업-다운-38143
    1. 캐릭터 업 다운 시키기 https://inblog.ai/hj/sts-버블버블-캐릭터-업-다운-38143
    1. 물방울 생성하기(기본셋팅)
     
    Share article

    [HootJem] 개발 기록 블로그

    RSS·Powered by Inblog