케릭터움직이기 (1)

안녕하세요~케이치입니다~

 방금 전에 포스팅 했었는데 너무 길어지는 것 같아서 끊고 또 포스팅하네요 ㅎㅎ


지난 시간에는 배경화면 넣고 땅도 만들어보고 케릭터도 넣어서 움직여봤습니다.


그런데 문제가 하나있었죠? 보통 화살표를 누르고있으면 계속 연속적으로 움직여줘야 하는데 그렇게 되지 않았던 거죠.


자, 그 해결방법은 생각보다 간단합니다.


우선 수정된 Player 소스를 보여드릴게요 ~

public class Player extends Actor {

private Sprite characterSprite;

boolean leftMove;
boolean rightMove;

float x;

Player(){
characterSprite = new Sprite(new Texture("player.png"));
characterSprite.setBounds(Gdx.graphics.getWidth()/2-100, 100,
 
Gdx.graphics.getWidth()/10, Gdx.graphics.getHeight()/5);
}
public Sprite getCharacterSprite(){
return characterSprite;
}
public void updateMotion(){
if ( leftMove ){
x = characterSprite.getX() - 5;
characterSprite.setX(x);
}
if ( rightMove ){
x = characterSprite.getX() + 5;
characterSprite.setX(x);
}
}

public void setLeftMove(boolean t){
if ( rightMove && t ) rightMove = false;
leftMove = t;
}
public void setRightMove(boolean t){
if ( leftMove && t ) leftMove = false;
rightMove = t;
}
}

setLeftMove와 setRightMove 그리고 updateMotion이라는 메소드가 새로 생겼네요.


그럼 이번엔 CharacterProcess의 소스가 어떻게 바뀌었는지 볼까요??

@Override
public boolean keyDown(int keycode) {
System.out.println("keycode : " + keycode);
switch(keycode){
case 21:
player.setLeftMove(true);
break;
case 22:
player.setRightMove(true);
break;
}
return true;
}

@Override
public boolean keyUp(int keycode) {

switch(keycode){
case 21:
player.setLeftMove(false);
break;
case 22:
player.setRightMove(false);
break;
}
return true;
}

네, 위 처럼 keyUp 메소드를 새롭게 구현해줬고요 keyDown메소드는 뭔가 되게 간단해졌네요 그쵸? ^-^


이렇게 수정하면 키 이벤트 처리는 끝난겁니다. 에? 이게 뭐냐구요?

한번 소스를 간략하게 설명드릴게요 ^-^ 저는 친절한 케이치니까요 ㅎㅎㅎ

자, 일단 간단하게 바뀐 CharacterProcess에서의 처리부터 한번 보시죠.

왼쪽 화살표 키가 눌리면

1. player.setLeftMove(true)를 호출합니다.

2. setLeftMove(true)가 호출되면 아래 로직을 따라갑니다.

 - 만약 오른쪽으로 이동중이었다면 rightMove를 false로 변경합니다.

 - 무조건 leftMove를 true로 변경합니다.

3. 끝


왼쪽 화살표 키가 올라가면 

1. player.setLeftMove(false)를 호출합니다.

2. setLeftMove(false)가 호출되면 아래 로직을 따라갑니다.

 - if문에서 false와 && 조건이 맞물리면서 if문은 실행되지 않습니다.

 - 무조건 leftMove를 false로 변경합니다.


오른쪽 화살표 키가 눌리거나 올라갔을 때도 동일한 로직을 따라갑니다.


자, 여기서 하는 일은 키가 눌렸을 때 케릭터의 이동을 결정짓는 boolean값을 변경하기만 하는 일을 합니다. 좌표를 변경한 것도 아니고 아직 화면에 뿌려지는 것이 아닙니다.


자 그럼 메인 클래스에서는 뭐가 수정이 됐는지 한번 보실까요?

    @Override
public void render () {
Gdx.gl.glClearColor(1, 0, 0, 1);
Gdx.gl.glClear(GL20.GL_COLOR_BUFFER_BIT);
batch.begin();
batch.disableBlending();
batch.draw(background, 0, 0, 800, 480);
batch.enableBlending();
// let's draw ground image
batch.draw(groundTextureRegion, backgroundPos, 0, 800, 100);
if ( backgroundPos + 800 > 0 && backgroundPos + 800 < 800){
batch.draw(groundTextureRegion, backgroundPos + 800, 0, 800, 100);
}
// let's draw player
inputProcessor.getPlayer().getCharacterSprite().draw(batch);
batch.end();
updateScene();
inputProcessor.getPlayer().updateMotion();

}


자, 메인 클래스에서 변경된 부분은 render()메소드의 마지막 줄에 inputProcessor.getPlayer().updateMotion() 메소드가 호출됐다는 것입니다. 저게 무슨 메소드였는지 위에서 보셨나요?

그냥 지나친 분들을 위해서 아래 다시 보여드릴게요.


    public void updateMotion(){
if ( leftMove ){
x = characterSprite.getX() - 5;
characterSprite.setX(x);
}
if ( rightMove ){
x = characterSprite.getX() + 5;
characterSprite.setX(x);
}
}

이 메소드는 위에서 Player클래스에 새로이 추가되었던 메소드입니다.

여기서 하는 일은 Player객체가 가지고있는 leftMove와 rightMove 불리언 값에따라 케릭터의 좌표를 변경해주는 일을 합니다.

단순히 좌표만 변경합니다.


그리고 메인 클래스에서 이 케릭터를 뿌리고있죠.


이제 이렇게 수정된 소스를 실행해보세요.


방향키를 누르고있는 동안 케릭터가 계속 움직입니다.


아, 그리고 전에는 왼쪽 오른쪽 방향에 대해서 케릭터가 스크린에서 벗어날 수 없도록 했었는데 이번에 수정하면서 그부분이 빠졌네요.


화면에서 사라지지는 못하도록 여러분들이 한번 조건을 넣어보세요~~~  ^-^ 히힛~ 숙제입니다~~~


그리고 점프기능이나 뭐 이런것들을 넣으면 재밌겠죠? ㅋㅋ


그럼 오늘은 이만 줄이겠습니다.


계속 장맛비가 내리는데 곰팡이 조심하시고 즐프하세요~~ ㅋㅋ


이상 친절한 케이치였습니다.