마스터Q&A 안드로이드는 안드로이드 개발자들의 질문과 답변을 위한 지식 커뮤니티 사이트입니다. 안드로이드펍에서 운영하고 있습니다. [사용법, 운영진]

자바로 게임 만들고있는데 점프 두번 처리를 어떻게 해야될까요..

0 추천
private TextureRegion mJumpTextureRegion;
public HUD mHUD;
private boolean isLanded = false;
public static float mImpulseY = 7f;
private String fix1_name = "", fix2_name = "";
 
boolean jumping = false; // 점프하게 되면 true
 
Sprite jump = new Sprite(CAMERA_WIDTH - 120, CAMERA_HEIGHT - 175,
mJumpTextureRegion, this.getVertexBufferObjectManager()) {
 
@Override
public boolean onAreaTouched(TouchEvent pEvent, float pX, float pY) {
 
// 점프 버튼이 클릭되고, 플레이어 캐릭이 땅에 도착했을 때 점프한다.
if (pEvent.isActionDown() && isLanded) {
 
jumpPlayer(player_body);
 
isLanded = false;
}
if (pEvent.isActionUp()) {
 
isLanded = false;
 
}
 
return false;
 
}
 
};
jump.setScale(0.70f);
mHUD.registerTouchArea(jump);
mHUD.attachChild(jump);
 
public void jumpPlayer(Body _playerBody) {
 
_playerBody.applyLinearImpulse(0, -mImpulseY, 0,
_playerBody.getPosition().y);
 
}
 
Debug.d("fix1_name : " + fix1_name);
Debug.d("fix2_name : " + fix2_name);
 
if ((fix1_name.contains("player") && fix2_name.contains("wall"))
|| (fix2_name.contains("player") && fix1_name
.contains("wall"))) {
isLanded = true;
Debug.d("player hits wall");
}

점프하는곳의 소스만 따왔는데 제대로 따왔는지 모르겠네요..

 

제가 생각하기로는 

 

 //점프 버튼이 클릭되고, 플레이어 캐릭이 땅에 도착했을 때 점프한다.
if (pEvent.isActionDown() && isLanded) {
 
jumpPlayer(player_body);
 
isLanded = false;
}
if (pEvent.isActionUp()) {
 
isLanded = false;
 
}
 
return false;
 
}
 
};
 
여기부분을 바꾸어 주면 어떻게 되지 않을까 싶은데 잘 안되네요..
 
도와주세요!!////
익명사용자 님이 2014년 6월 13일 질문

1개의 답변

0 추천
JumpCount 같은 변수를 두어서 2회가 되면, 더이상 점프가 안되게 하면 되겠죠.

땅에 착지하거나 하면 변수를 다시 초기화 해주고요.
바야바 (3,840 포인트) 님이 2014년 6월 13일 답변
@Override
            public boolean onAreaTouched(TouchEvent pEvent, float pX, float pY) {

                int jumpcount=0;
                // 점프 버튼이 클릭되고, 플레이어 캐릭이 땅에 도착했을 때 점프한다.
                if (pEvent.isActionDown() && isLanded) {

                    jumpPlayer(player_body);
                   
                    jumpcount++;
                }

                if (pEvent.isActionUp() && jumpcount<2) {

                    mImpulseY=5f;

                }

                return false;

            }

        };

소스를 이렇게 바꾸었는데 무한점프가 되요...

어디가 잘못됬는지 봐주세요 ㅠㅠ
int jumpcount = 0;를 onAreaTouched 안에 넣으면,
점프 버튼이 터치될때마다 0이 되는거니까 당연히 무한점프가 되죠.
변수를 밖으로 빼서 전역으로 처리하면 됩니다.
아 감사합니다!!
혹 count가 2번 됬을시 초기화 부분 코드를 어떻게 짜야하는지도 여쭈어봐도될까요...
초기화를  mImpulseY를 0으로 한다고 되는게 아니겠죠?
count가 2가 되면 점프 루틴에서 처리 하지 말고 그냥 리턴시키면 되지 않을까요? 정확하게는 땅에 착지했을때 count를 0으로 리셋해야 합니다.
public boolean onAreaTouched(TouchEvent pEvent, float pX, float pY) {
               
                // 점프 버튼이 클릭되고, 플레이어 캐릭이 땅에 도착했을 때 점프한다.
                if (pEvent.isActionDown() && isLanded) {

                    jumpPlayer(player_body);
                    isLanded = false;
                    jumpcount++;
                }

                if (pEvent.isActionUp() && !isLanded) {
                    jumpcount++;
                    jumpPlayer(player_body);
                }
                if(jumpcount==2)
                {   
                     jumpcount=0;
                     return true;
                }
                return false;

            }

        };

이런식으로 해봤는데... 역시나 무한점프가 됩니다 ..

이 코드에서 2번 점프시 점프버튼이 안먹히게끔 하고싶은데
어떻게 해야되는지 모르겠네요...
코드가 너무 난해하군요.

if ( 점프조건성립 )
{
    if ( jumpCount < 2 )
    {
        jumpPlayer(....);
        jumpCount++;
    }
}

if ( 플레이어착지 )
{
    jumpCount = 0;
}

이러면 끝인데요.
아...제가 코드짜는게 익숙치 않아서 ....
혹시 pEvent.isActionDown()과 pEvent.isActionUp()의 차이에 대해서 여쭈어 봐도 될까요...?
말해주신대로 코드를 짜면

            public boolean onAreaTouched(TouchEvent pEvent, float pX, float pY) {
               
                // 점프 버튼이 클릭되고, 플레이어 캐릭이 땅에 도착했을 때 점프한다.
                if (pEvent.isActionDown()) {
                    if(jumpcount<2) {
                       
                        jumpPlayer(player_body);
                        jumpcount++;
                    }
                }
               
                if (pEvent.isActionUp()) {
                    isLanded = false;
                }
               
                if (isLanded == false) {
                    jumpcount=0;
                }
           
                return false;
               
            }

이렇게 나오는거 아닌가요?,,,

어디부분이 잘못 되었으면 아직도 무한점프가 될까요 ...

지면에 착지하는부분이 잘못된건가요?
ActionDown과 ActionUp은 키가 눌렸을때와 뗐을때를 의미합니다.
키를 눌렀을때 점프가 되지만, 떼면서 다시 isLanded가 false가 되고
false가 되는 순간 jumpcount가 바로 0이 되니 당연히 무한점프가 됩니다.
땅에 착지하는 순간을 키로 하는게 아니라 오브젝트의 위치를 기준으로
계산하셔야 합니다.
감사합니다 ㅜㅜ 제가 모르는게 많아서 정말 많은 도움을 받았습니다

정말 정말 감사합니다!

가르쳐주신것을 토대로 제대로  만들어 보겠습니다 !!
...