Android Games: Fisica Simples
De Aulas
Links relacionados: Jogos Digitais
Videoaula
Recursos
Medidas
Cenario: 800 x 600 Mapa: 800 x 600 midori (8 passos x 10 ações): sprite: 85 x 100 spritesheet: 680 x 1000
DesktopLauncher
1package com.mygdx.game.desktop;
2
3import com.badlogic.gdx.backends.lwjgl.LwjglApplication;
4import com.badlogic.gdx.backends.lwjgl.LwjglApplicationConfiguration;
5import com.mygdx.game.MyGdxGame;
6
7public class DesktopLauncher {
8 public static void main (String[] arg) {
9 LwjglApplicationConfiguration config = new LwjglApplicationConfiguration();
10 config.width = 800;
11 config.height = 600;
12 config.title = "Fisica";
13 new LwjglApplication(new MyGdxGame(), config);
14 }
15}
Actor
1package com.mygdx.game;
2
3import com.badlogic.gdx.Gdx;
4import com.badlogic.gdx.Input;
5import com.badlogic.gdx.graphics.g2d.Sprite;
6import com.badlogic.gdx.graphics.g2d.TextureRegion;
7
8class Actor {
9 private static final int w = 85;
10 private static final int h = 100;
11 private final int WALK = 0;
12 private final int PAIN = 1;
13 private final int HIT = 2;
14 private final int JUMP = 3;
15 private final int DIE = 4;
16 private final int LEFT = 0;
17 private final int RIGHT = 1;
18 private final int SPEED = 5;
19 private final float G = 0.99f;
20 private final int stepMax = 8;
21 private int step;
22 private int action;
23 private int direction;
24 private boolean jumping = false;
25 private MyGdxGame game;
26 private Sprite sprite;
27 private TextureRegion texture;
28 private float vectorG = 0;
29
30 Actor(TextureRegion reg, int x, int y, MyGdxGame game) {
31 this.game = game;
32 texture = reg;
33 vectorG = 0;
34 direction = RIGHT;
35 sprite = new Sprite(new TextureRegion(texture,
36 w * step, (action * h * 2) + (direction * h), w, h));
37 sprite.setPosition(x, y);
38 }
39
40 void draw() {
41 sprite.setRegion(texture, w * step, (action * h * 2) + (direction * h), w, h);
42 sprite.draw(game.batch);
43 }
44
45 void run() {
46 gravity();
47 if (step >= stepMax - 1) step = 0;
48 if (Gdx.input.isKeyPressed(Input.Keys.LEFT)) {
49 move(LEFT);
50 } else if (Gdx.input.isKeyPressed(Input.Keys.RIGHT)) {
51 move(RIGHT);
52 }
53 if (Gdx.input.isKeyJustPressed(Input.Keys.SPACE)) {
54 jump();
55 }
56 if (jumping) step = 3;
57 }
58
59 private void move(int dir) {
60 boolean moved = false;
61 direction = dir;
62 if (direction == LEFT) {
63 if (game.isFree(sprite.getX(), sprite.getY())) {
64 sprite.translateX(-SPEED);
65 moved = true;
66 }
67 } else {
68 if (game.isFree(sprite.getX() + sprite.getWidth(), sprite.getY())) {
69 sprite.translateX(SPEED);
70 moved = true;
71 }
72 }
73 if (moved && !jumping) {
74 step++;
75 action = WALK;
76 }
77 }
78
79 private void jump() {
80 if (jumping) return;
81 game.sndJump.play();
82 jumping = true;
83 action = JUMP;
84 sprite.translateY(10);
85 vectorG = -15;
86
87 }
88
89 private void gravity() {
90 boolean falling = false;
91 int middle = w / 2;
92 if (game.isFree(sprite.getX() + middle, sprite.getY() - 1)) {
93 vectorG += G;
94 sprite.translateY(-vectorG);
95 falling = true;
96 }
97 if (!game.isFree(sprite.getX() + middle, sprite.getY())) {
98 while (!game.isFree(sprite.getX() + middle, sprite.getY())) {
99 sprite.translateY(1);
100 }
101 vectorG = 0;
102 jumping = false;
103 action = WALK;
104 falling = false;
105 }
106 if (!falling && jumping) jumping = false;
107 }
108}
MyGdxGame
1package com.mygdx.game;
2
3import com.badlogic.gdx.ApplicationAdapter;
4import com.badlogic.gdx.Gdx;
5import com.badlogic.gdx.Input;
6import com.badlogic.gdx.audio.Sound;
7import com.badlogic.gdx.graphics.Color;
8import com.badlogic.gdx.graphics.GL20;
9import com.badlogic.gdx.graphics.Pixmap;
10import com.badlogic.gdx.graphics.Texture;
11import com.badlogic.gdx.graphics.g2d.SpriteBatch;
12import com.badlogic.gdx.graphics.g2d.TextureRegion;
13
14public class MyGdxGame extends ApplicationAdapter {
15 SpriteBatch batch;
16 Sound sndJump;
17 private Texture midori;
18 private Texture cenario;
19 private Pixmap mapa;
20 private Actor actor;
21 private int w, h;
22
23 @Override
24 public void create() {
25 w = Gdx.graphics.getWidth();
26 h = Gdx.graphics.getHeight();
27 batch = new SpriteBatch();
28 cenario = new Texture("cenario.png");
29 midori = new Texture("midori.png");
30 mapa = new Pixmap(Gdx.files.internal("mapa.png"));
31 sndJump = Gdx.audio.newSound(Gdx.files.internal("jump.wav"));
32 actor = new Actor(
33 new TextureRegion(midori, 0, 24, 680, 1000),
34 100, 200, this);
35 }
36
37 @Override
38 public void render() {
39 if (Gdx.input.isKeyPressed(Input.Keys.ESCAPE)) {
40 Gdx.app.exit();
41 }
42 actor.run();
43
44 Gdx.gl.glClearColor(1, 0, 0, 1);
45 Gdx.gl.glClear(GL20.GL_COLOR_BUFFER_BIT);
46 batch.begin();
47 batch.draw(cenario, 0, 0);
48 actor.draw();
49 batch.end();
50 }
51
52 boolean isFree(float px, float py) {
53 if (px < 0 || px > w || py < 0 || py > h) return false;
54 Color color = new Color();
55 Color.rgb888ToColor(color, mapa.getPixel((int) px, (int) (mapa.getHeight() - py)));
56 return color.r > 0.5f && color.g > 0.5f && color.b > 0.5f;
57 }
58
59 @Override
60 public void dispose() {
61 batch.dispose();
62 midori.dispose();
63 cenario.dispose();
64 mapa.dispose();
65 sndJump.dispose();
66 }
67}