Android Games: Walking

De Aulas

Links relacionados: Jogos Digitais

Vídeo Demonstrativo

Recursos

Versão Simplificada

Nessa versão do nosso exemplo, não utilizamos objetos. Usamos algumas informações para representar o comportamento do nosso personagem (Avatar) na tela. As variáveis x e y são utilizadas para posicionar o personagem, a variável dir é utilizada mudar o sprite do personagem que vai ser desenhado conforme a direção que ele está indo. A variável step é o passo de animação que, no caso desse exemplo são dois, uma perna pra frente ou a outra. A variável count é para que a animação não seja muito rápida, ou seja, iremos apenas alterar o passo de animação a cada 20 frames.

package com.mygdx.game;

import com.badlogic.gdx.ApplicationAdapter;
import com.badlogic.gdx.Gdx;
import com.badlogic.gdx.Input;
import com.badlogic.gdx.graphics.GL20;
import com.badlogic.gdx.graphics.Texture;
import com.badlogic.gdx.graphics.g2d.Sprite;
import com.badlogic.gdx.graphics.g2d.SpriteBatch;

public class MyGdxGame extends ApplicationAdapter {
	SpriteBatch batch;
	Sprite sprite[][];
	float x, y;
	int dir, step;
	final int SPEED = 5;
	final int maxCount = 10;
	int count;

	@Override
	public void create () {
		batch = new SpriteBatch();
		//sprite = new Sprite(new Texture("avatar.0.0.png"));
		sprite = new Sprite[4][2];
		for (int idir = 0; idir < 4; idir++) {
			for (int istep = 0; istep < 2; istep++) {
				sprite[idir][istep] = new Sprite(
						new Texture("avatar." + idir + "." + istep + ".png"));
			}
		}
	}

	void execute() {
		boolean moved = false;
	    if (Gdx.input.isKeyPressed(Input.Keys.UP)) {
	    	dir = 2;
	        y += SPEED;
	        moved = true;
        } else if (Gdx.input.isKeyPressed(Input.Keys.DOWN)) {
	    	dir = 0;
	        y -= SPEED;
			moved = true;
        } else if (Gdx.input.isKeyPressed(Input.Keys.LEFT)) {
	    	dir = 3;
            x -= SPEED;
			moved = true;
        } else if (Gdx.input.isKeyPressed(Input.Keys.RIGHT)) {
	    	dir = 1;
            x += SPEED;
			moved = true;
        }
        count++;
	    if (count >= maxCount) {
	    	count = 0;
			if (moved) step = (step == 1) ? 0 : 1;
		}
    }

	@Override
	public void render () {
	    execute();
		Gdx.gl.glClearColor(0, 0.5f, 0, 1);
		Gdx.gl.glClear(GL20.GL_COLOR_BUFFER_BIT);
		batch.begin();
		sprite[dir][step].setPosition(x, y);
		sprite[dir][step].draw(batch);
		batch.end();
	}
	
	@Override
	public void dispose () {
		batch.dispose();
		for (int idir = 0; idir < 4; idir++) {
			for (int istep = 0; istep < 2; istep++) {
				sprite[idir][istep].getTexture().dispose();
			}
		}
	}
}

Versão Usando Objetos

Nessa versão usamos um objeto para nosso personagem. Isso trás diversas vantagens, pois quando começamos a ter outros personagens, eles também tem suas próprias variáveis de posicionamento, animação, etc. Criar essas variáveis, mesmo que por meio de vetores, na nossa classe principal, aumentaria muito a complexidade do nosso game e diminuiria a modularização.

Actor.class

 1package com.mygdx.game;
 2
 3import com.badlogic.gdx.Gdx;
 4import com.badlogic.gdx.Input;
 5import com.badlogic.gdx.graphics.Texture;
 6import com.badlogic.gdx.graphics.g2d.Sprite;
 7import com.badlogic.gdx.graphics.g2d.SpriteBatch;
 8
 9class Actor {
10    private static final int DOWN = 0;
11    private static final int RIGHT = 1;
12    private static final int UP = 2;
13    private static final int LEFT = 3;
14    private static final int SPEED = 5;
15    private float x, y;
16    private int step, direction;
17    private Sprite sprite[][];
18    private final int maxCount = 10;
19    private int count;
20
21    Actor(float x, float y, String filename) {
22        this.x = x;
23        this.y = y;
24        sprite = new Sprite[4][2];
25        for (int iDirection = 0; iDirection < 4; iDirection++) {
26            for (int iStep = 0; iStep < 2; iStep++) {
27                sprite[iDirection][iStep] = new Sprite(
28                        new Texture(filename + "." + iDirection + "." + iStep + ".png"));
29            }
30        }
31    }
32
33    void run() {
34        boolean moved = false;
35        if (Gdx.input.isKeyPressed(Input.Keys.UP)) {
36            direction = UP;
37            y += SPEED;
38            moved = true;
39        } else if (Gdx.input.isKeyPressed(Input.Keys.DOWN)) {
40            direction = DOWN;
41            y -= SPEED;
42            moved = true;
43        } else if (Gdx.input.isKeyPressed(Input.Keys.RIGHT)) {
44            direction = RIGHT;
45            x += SPEED;
46            moved = true;
47        } else if (Gdx.input.isKeyPressed(Input.Keys.LEFT)) {
48            direction = LEFT;
49            x -= SPEED;
50            moved = true;
51        }
52        if (Gdx.input.isKeyPressed(Input.Keys.ESCAPE)) {
53            Gdx.app.exit();
54        }
55        count++;
56        if (count > maxCount) {
57            count = 0;
58            if (moved) step = (step == 1) ? 0 : 1;
59        }
60    }
61
62    void draw(SpriteBatch batch) {
63        Sprite img = sprite[direction][step];
64        img.setPosition(x, y);
65        img.draw(batch);
66    }
67
68    void dispose() {
69        for (int iDirection = 0; iDirection < 4; iDirection++) {
70            for (int iStep = 0; iStep < 2; iStep++) {
71                sprite[iDirection][iStep].getTexture().dispose();
72            }
73        }
74    }
75}

MyGdxGame.java

Agora nossa classe principal está mais simples. Veja que apenas instanciamos nosso personagem e usamos ele no game pelo run e draw. Assim, podemos criar outros personagens que herdem de Avatar, por exemplo, reimplementando o método run nos filhos. Podemos então instanciar outros objetos com comportamentos diferentes em nosso jogo.

 1package com.mygdx.game;
 2
 3import com.badlogic.gdx.ApplicationAdapter;
 4import com.badlogic.gdx.Gdx;
 5import com.badlogic.gdx.graphics.GL20;
 6import com.badlogic.gdx.graphics.g2d.SpriteBatch;
 7
 8public class MyGdxGame extends ApplicationAdapter {
 9	private SpriteBatch batch;
10	private Actor avatar;
11
12	@Override
13	public void create() {
14		batch = new SpriteBatch();
15		avatar = new Actor(100, 100, "avatar");
16	}
17
18	@Override
19	public void render() {
20		avatar.run();
21		Gdx.gl.glClearColor(0, 0.5f, 0, 1);
22		Gdx.gl.glClear(GL20.GL_COLOR_BUFFER_BIT);
23		batch.begin();
24		avatar.draw(batch);
25		batch.end();
26	}
27
28	@Override
29	public void dispose() {
30		avatar.dispose();
31		batch.dispose();
32	}
33}