Android Games: SimpleGravity

De Aulas

Recursos

Classe MyGdxGame

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.SpriteBatch;

public class MyGdxGame extends ApplicationAdapter {
    SpriteBatch batch;
    Texture img;
    float x, y;
    int speed = 5;
    int H, W;
    int h, w;
    float G = 0.98f;
    float fy = 0f;
    boolean jumping = false;

    @Override
    public void create() {
        // Inicializa e aloca os recursos
        batch = new SpriteBatch();
        img = new Texture("sphere.png");
        h = img.getHeight();
        w = img.getWidth();
        H = Gdx.graphics.getHeight();
        W = Gdx.graphics.getWidth();
    }

    private void execute() {
        // Pega as setas do teclado para ir para os lados
        if (Gdx.input.isKeyPressed(Input.Keys.LEFT)) {
            x -= speed;
        } else if (Gdx.input.isKeyPressed(Input.Keys.RIGHT)) {
            x += speed;
        }
        // Se digitar a seta para cima, a bolinha irá pular se ela já não estiver pulando
        if (Gdx.input.isKeyJustPressed(Input.Keys.UP)) {
            if (!jumping) {
                // O pulo é simplesmente dar uma força negativa da gravidade
                fy = -20;
                jumping = true;
            }
        }
        // Aplica a gravidade
        // na força da bolinha em y, será adicionado mais gravidade para cada iteração,
        // ou seja, é uma aceleração. O y ser-a o valor da força y negativada.
        fy += G;
        y -= fy;

        // Não deixa a bolinha sair da tela.
        if (x + w > W) x = W - w;
        if (x < 0) x = 0;
        if (y + h > H) y = H - h;
        if (y < 0) {
            // Se cair no chão, inverte a força y da bolinha, somando menos 2 e zera y
            fy = -(fy - 2);
            y = 0;
            // Mas só pode pular novamente depois que parar de quicar
            if (fy > 0) {
                jumping = false;
            }
        }
    }

    @Override
    public void render() {
        /*
        O gameloop é [processInput -> execute -> render] e depois reinicia esses processos.
        O processInput já foi feito pela biblioteca. Aqui é o render, então temos que fazer
        o execute antes das linhas de código do render.
         */
        execute();
        // Linhas de código do render
        Gdx.gl.glClearColor(0, 0.5f, 0, 1);
        Gdx.gl.glClear(GL20.GL_COLOR_BUFFER_BIT);
        batch.begin();
        batch.draw(img, x, y);
        batch.end();
    }

    @Override
    public void dispose() {
        // Limpa a memória dos recursos alocados.
        batch.dispose();
        img.dispose();
    }
}