Android Games: Walking
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}