#game (1)

그저께 그래픽 출력하기 1편을 포스팅 했었는데 소스가 없었죠? 어제 올리려 했는데 일이 좀 바빠서 오늘 포스팅합니다.

 

자!!!!

 

오늘은 제가 만든 소스와 이미지 파일을 모두 공유할 예정이니 잘 따라와만 주신다면 여러분들도 멋진 게임을 만드실 수 있습니다 ㅋㅋ

( 저도 처음인데 이런 말을 하고있네요 ㅋㅋㅋ)

 

저와 같은 안드로이드 스튜디오를 사용하고 libGDX가 설치되어있으며 이곳의 설정(assets)을 똑같이 하셨다는 가정하에 진행합니다. 그리고 테스트는 안드로이드 폰이 아닌 데스크탑에서 진행합니다. ( 아직 폰에서는 테스트를 못해봤습니다. )

 

 

질문 있으시면 댓글 남겨주세요.

 

그럼 시작합니다.

 

오늘 보시게될 소스는 아래와 같이 실행이 됩니다.

 

 

 

땅은 왼쪽으로 계속 움직이는 것 처럼 보이고 케릭터는 왼쪽, 오른쪽 화살표로 이동이 가능합니다.

 

 

1. 추가된 파일 및 클래스 ( 소스 실행에 필요한 추가된 이미지 파일은 첨부하였습니다. )

- carl-carlson.jpg는 없어도 되는 파일인데 들어가있네요 ㅈㅅ;;;;

 

 

 

2. 첨부된 파일을 다운받아 해당 위치 ( android/assets )에 넣어주세요.

3. core에 있는 소스는 아래와 같습니다.

 

우선 Player 입니다.

 

 

 

 

 

 

 

자, 플레이어는 게임속 주인공 케릭터입니다. Sprite를 이용해서 뿌려줄거구요 setBounds메소드를 이용해서 케릭터의 사이즈를 지정해줬습니다. 그리고 외부에서 characterSprite를 불러쓸 수 있도록 getter를 하나 선언해줬죠.

 

다음은 CharacterProcessor입니다.

 

 

CharacterProcessor가 InputProcessor를 구현하면 그 안에 각종 메소드들을 오버라이드해야하는데 저는 keyDown메소드만 구현을 했고 나머지 메소드들은 기본으로 놔두었습니다.

 

일단 기본적으로 플레이어를 하나 생성해서 들고있고 그 플레이어에대한 getter인 getPlayer()를 만들어줬습니다.

 

이제 키보드 입력을 받아서 케릭터를 움직이기위해 keyDown메소드를 구현합니다.

 

여기서 keycode 21은 왼쪽, 22를 오른쪽 화살표를 말합니다.

왼쪽화살표가 눌리면 좌측으로 이동하는데 조건이 있습니다. 화면의 가장 좌측까지 도달하면 더이상 움직이지 않도록 if 조건을 주었습니다. 오른쪽으로 이동하는것도 마찬가지로 동일한 방법으로 처리했습니다.

 

 

자, 이제 메인클래스인 MyGdxGame 클래스를 보실까요?

public class MyGdxGame extends ApplicationAdapter {
    SpriteBatch batch;
    Texture background;
    Texture terrain;
    TextureRegion groundTextureRegion;
    float backgroundPos = 0;
    CharacterProcessor inputProcessor;

    @Override
    public void create () {
        batch = new SpriteBatch();
        background = new Texture("sky2.jpg");
        terrain = new Texture("grey_stone_1.png");
        terrain.setWrap(Texture.TextureWrap.Repeat, Texture.TextureWrap.Repeat);
        groundTextureRegion = new TextureRegion(terrain);
        inputProcessor = new CharacterProcessor();
        Gdx.input.setInputProcessor(inputProcessor);
    }
    @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();
    }
    private void updateScene(){
        float deltaTime = Gdx.graphics.getDeltaTime();
        backgroundPos -= 200 * deltaTime;
        if ( backgroundPos <= -800 ){
            backgroundPos = 0;
        }
    }
}

 

 

우선 create()에서는 대부분의 객체를 초기화해주었습니다.

 

render()에서는 뿌려주는 것을 담당하는데 게임이 실행되는동안 끊임없이 호출되는 메소드인것 같습니다.

 

enableBlending으로 배경(sky2.jpg)위에 땅(grey_stone_1.png)과 케릭터(player.png)를 그릴 수 있도록 해주었습니다.

 

땅을 그릴때는 batch.draw()에서 TextureRegion을 이용했고, 케릭터는 Sprite.draw를 이용했습니다.

 

그리고 땅을 그릴때 땅이 좌측으로 계속 이동하면서 마치 케릭터가 우측으로 이동하는것 같은 효과를 줄 수 있도록 해보았습니다.

 

updateScene()에서 그 효과를 줄 수 있도록 backgroundPos ( 땅 그림이 뿌려질 위치 )를 변경해주고있습니다.

 

자, 그런데 이렇게 하면 화살표를 계속 누르고 있어도 한번 밖에 움직이지 않습니다.

 

이부분에 대해서는 다음 포스팅에서 해결방법을 알려드리도록 하겠습니다.

 

그럼 오늘도 즐프하시길 ~ ^-^

 

지금까지 libGDX를 독학하고있는 케이치였습니다~

 

P.S : 도움이 되셨으면 댓글 하나 남겨주세요 ^-^

 

 

 

 

 

 

[[ 원본 이미지 파일첨부 ]]