안녕하세요~케이치입니다~
방금 전에 포스팅 했었는데 너무 길어지는 것 같아서 끊고 또 포스팅하네요 ㅎㅎ
지난 시간에는 배경화면 넣고 땅도 만들어보고 케릭터도 넣어서 움직여봤습니다.
그런데 문제가 하나있었죠? 보통 화살표를 누르고있으면 계속 연속적으로 움직여줘야 하는데 그렇게 되지 않았던 거죠.
자, 그 해결방법은 생각보다 간단합니다.
우선 수정된 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 불리언 값에따라 케릭터의 좌표를 변경해주는 일을 합니다.
단순히 좌표만 변경합니다.
그리고 메인 클래스에서 이 케릭터를 뿌리고있죠.
이제 이렇게 수정된 소스를 실행해보세요.
방향키를 누르고있는 동안 케릭터가 계속 움직입니다.
아, 그리고 전에는 왼쪽 오른쪽 방향에 대해서 케릭터가 스크린에서 벗어날 수 없도록 했었는데 이번에 수정하면서 그부분이 빠졌네요.
화면에서 사라지지는 못하도록 여러분들이 한번 조건을 넣어보세요~~~ ^-^ 히힛~ 숙제입니다~~~
그리고 점프기능이나 뭐 이런것들을 넣으면 재밌겠죠? ㅋㅋ
그럼 오늘은 이만 줄이겠습니다.
계속 장맛비가 내리는데 곰팡이 조심하시고 즐프하세요~~ ㅋㅋ
이상 친절한 케이치였습니다.
[ASM 5.0] 2. BCI를 이용한 클래스 생성하기 (0) | 2015.07.31 |
---|---|
[ASM 5.0] 1. BCI를 이용한 클래스 파일 읽기 (0) | 2015.07.31 |
libGDX 를 이용한 게임 개발 정리 2 - 그래픽 출력하기 (0) | 2015.07.29 |
안드로이드 스튜디오 메소드 디스크립션(설명) 보기 (0) | 2015.07.28 |
libGdx 프로젝트 생성 직후 데스크탑으로 테스팅 할 때 오류 해결방법 (0) | 2015.07.27 |