com.disc.jammers.boxsprite.players.Player.java Source code

Java tutorial

Introduction

Here is the source code for com.disc.jammers.boxsprite.players.Player.java

Source

/*
 * To change this license header, choose License Headers in Project Properties.
 * To change this template file, choose Tools | Templates
 * and open the template in the editor.
 */
package com.disc.jammers.boxsprite.players;

import com.badlogic.gdx.assets.AssetManager;
import com.badlogic.gdx.graphics.g2d.SpriteBatch;
import com.badlogic.gdx.graphics.glutils.ShapeRenderer;
import com.badlogic.gdx.math.Rectangle;
import com.badlogic.gdx.math.Vector2;
import com.badlogic.gdx.physics.box2d.Body;
import com.badlogic.gdx.physics.box2d.BodyDef;
import com.badlogic.gdx.physics.box2d.FixtureDef;
import com.badlogic.gdx.physics.box2d.PolygonShape;
import com.badlogic.gdx.physics.box2d.World;
import com.badlogic.gdx.scenes.scene2d.ui.Table;
import com.disc.jammers.Constant;
import com.disc.jammers.boxsprite.BoxSprite;
import static com.disc.jammers.Constant.PIXEL_PER_METER;
import static com.disc.jammers.Constant.WIDTH;
import static com.disc.jammers.Constant.HEIGHT;
import com.disc.jammers.entity.Country;
import com.disc.jammers.entity.Level;
import com.disc.jammers.entity.SpecialMoveType;
import com.disc.jammers.event.EventMessage;
import com.disc.jammers.event.EventObject;
import com.disc.jammers.event.EventQueue;
import com.disc.jammers.event.EventType;
import java.util.Timer;
import java.util.TimerTask;

/**
 *
 * @author daniel
 */
public class Player extends BoxSprite {

    private boolean isPlayerA;
    private boolean canMove;
    public boolean hasDisc;
    private boolean isSliding;

    private Vector2 destination;
    private Vector2 slidingDest;

    protected String firstName;
    protected String lastName;

    protected Country country;

    protected Level level;

    protected int throwingSpeed;
    protected int curvePower;
    protected int slidePower;

    protected int dexterity;

    protected int overallSpeed;
    protected int overallPower;

    public SpecialMoveType special;

    private Body playerBody;
    private EventObject playerObject;

    private World world;

    private Rectangle upperBound;
    private Rectangle lowerBound;
    private Rectangle midBound;
    private Rectangle playerRec;

    private ShapeRenderer bound;

    public Player(World world, EventQueue queue, AssetManager manager, int player) {
        super(queue, manager);

        destination = new Vector2();
        slidingDest = new Vector2();
        playerObject = new EventObject();

        upperBound = new Table.DebugRect();
        lowerBound = new Table.DebugRect();
        midBound = new Table.DebugRect();
        playerRec = new Table.DebugRect();

        bound = new ShapeRenderer();

        isPlayerA = player == 0;

        this.world = world;
    }

    @Override
    public void handleEvents(EventMessage message) {

        if (message.getMap().containsKey(EventType.MID_BOUNDARY_POSITION)) {
            midBound.x = message.getFloatArray(EventType.MID_BOUNDARY_POSITION)[0];
            midBound.y = message.getFloatArray(EventType.MID_BOUNDARY_POSITION)[1] / 2.5f;
        }
        if (message.getMap().containsKey(EventType.UPPER_BOUNDARY_POSITION)) {
            upperBound.x = message.getFloatArray(EventType.UPPER_BOUNDARY_POSITION)[0] / 4;
            upperBound.y = message.getFloatArray(EventType.UPPER_BOUNDARY_POSITION)[1];
        }
        if (message.getMap().containsKey(EventType.LOWER_BOUNDARY_POSITION)) {
            lowerBound.x = message.getFloatArray(EventType.LOWER_BOUNDARY_POSITION)[0] / 4;
            lowerBound.y = message.getFloatArray(EventType.LOWER_BOUNDARY_POSITION)[1];
        }

        if (message.getMap().containsKey(EventType.MID_BOUNDARY_SIZE)) {
            midBound.width = message.getFloatArray(EventType.MID_BOUNDARY_SIZE)[0] * 2;
            midBound.height = message.getFloatArray(EventType.MID_BOUNDARY_SIZE)[1] * 2;
        }
        if (message.getMap().containsKey(EventType.UPPER_BOUNDARY_SIZE)) {
            upperBound.width = message.getFloatArray(EventType.UPPER_BOUNDARY_SIZE)[0] * 2;
            upperBound.height = message.getFloatArray(EventType.UPPER_BOUNDARY_SIZE)[1] * 2;
        }
        if (message.getMap().containsKey(EventType.LOWER_BOUNDARY_SIZE)) {
            lowerBound.width = message.getFloatArray(EventType.LOWER_BOUNDARY_SIZE)[0] * 2;
            lowerBound.height = message.getFloatArray(EventType.LOWER_BOUNDARY_SIZE)[1] * 2;
        }

        if (isPlayerA) {

            if (message.getMap().containsKey(EventType.PLAYER_A_TOUCH_DOWN)) {
                playerTouchDown(message);
            }
            if (message.getMap().containsKey(EventType.PLAYER_A_TOUCH_UP)) {
                playerTouchUp(message);
            }

            if (message.getMap().containsKey(EventType.PLAYER_A_TOUCH_DRAGGED)) {
                playerTouchDragged(message);
            }

            if (message.getMap().containsKey(EventType.PLAYER_A_HAS_DISC)) {
                hasDiscAction(message);
            }

            /*if (message.getMap().containsKey(EventType.STOP_PLAYER_A)) {
            playerBody.setLinearVelocity(0, 0);
            }*/

        } else {

            if (message.getMap().containsKey(EventType.PLAYER_B_TOUCH_DOWN)) {
                playerTouchDown(message);
            }
            if (message.getMap().containsKey(EventType.PLAYER_B_TOUCH_UP)) {
                playerTouchUp(message);
            }
            if (message.getMap().containsKey(EventType.PLAYER_B_TOUCH_DRAGGED)) {
                playerTouchDragged(message);
            }

            if (message.getMap().containsKey(EventType.PLAYER_B_HAS_DISC)) {
                hasDiscAction(message);
            }

            /*if (message.getMap().containsKey(EventType.STOP_PLAYER_B)) {
            playerBody.setLinearVelocity(0, 0);
            }*/
        }

    }

    @Override
    public void update(float dt) {
        checkCollisionAndMovement(dt);
    }

    @Override
    public void render(SpriteBatch sb) {
        bound.begin(ShapeRenderer.ShapeType.Line);
        bound.rect(upperBound.x, upperBound.y, upperBound.width, upperBound.height);
        bound.end();

        bound.begin(ShapeRenderer.ShapeType.Line);
        bound.rect(lowerBound.x, lowerBound.y, lowerBound.width, lowerBound.height);
        bound.end();

        bound.begin(ShapeRenderer.ShapeType.Line);
        bound.rect(midBound.x, midBound.y, midBound.width, midBound.height);
        bound.end();

        bound.begin(ShapeRenderer.ShapeType.Line);
        bound.rect(playerRec.x, playerRec.y, playerRec.width, playerRec.height);
        bound.end();
    }

    @Override
    public void dispose() {
    }

    @Override
    public void init() {

        createPlayerBox(world);

        if (isPlayerA) {
            fixture.setUserData(Constant.PLAYER_A);
        } else {
            fixture.setUserData(Constant.PLAYER_B);
        }

    }

    private void hasDiscAction(EventMessage message) {
        hasDisc = true;
        canMove = false;
        isSliding = false;
        playerObject.setObject(true);
        eventQueue.addEvent(new EventMessage(EventType.STOP_DISC, playerObject));
    }

    private void createPlayerBox(World world) {
        int xSet = WIDTH / 4;
        int ySet = HEIGHT / 2;

        BodyDef bodyDef = new BodyDef();
        PolygonShape shape = new PolygonShape();
        FixtureDef fdef = new FixtureDef();

        if (!isPlayerA) {
            xSet = WIDTH - xSet;
            ySet = HEIGHT - ySet;

        }

        bodyDef.position.set(xSet / PIXEL_PER_METER, ySet / PIXEL_PER_METER);
        bodyDef.type = BodyDef.BodyType.DynamicBody;
        playerBody = world.createBody(bodyDef);
        playerBody.setFixedRotation(true);
        shape.setAsBox(50 / PIXEL_PER_METER, 50 / PIXEL_PER_METER);

        fdef.shape = shape;
        fdef.density = 108f;
        fdef.friction = 100;
        fdef.isSensor = true;
        fdef.filter.categoryBits = Constant.BIT_PLAYERS;
        fdef.filter.maskBits = Constant.BIT_BOUNDARY | Constant.BIT_DISC | Constant.BIT_BOUNDARY_MID;
        fixture = playerBody.createFixture(fdef);

        shape.dispose();
    }

    private void cretePlayerRec() {
        playerRec.x = (playerBody.getPosition().x * PIXEL_PER_METER) - 50;
        playerRec.y = (playerBody.getPosition().y * PIXEL_PER_METER) - 50;
        playerRec.width = 100;
        playerRec.height = 100;
    }

    private void playerTouchDown(EventMessage message) {
        destination.set(message.getIntArray(EventType.PLAYER_A_TOUCH_DOWN)[0] / PIXEL_PER_METER,
                (((HEIGHT) - message.getIntArray(EventType.PLAYER_A_TOUCH_DOWN)[1])) / PIXEL_PER_METER);
        canMove = true;
    }

    private void playerTouchUp(EventMessage message) {
        isSliding = false;
    }

    private void playerTouchDragged(EventMessage message) {
        slidingDest.set(message.getIntArray(EventType.PLAYER_A_TOUCH_DRAGGED)[0] / PIXEL_PER_METER,
                message.getIntArray(EventType.PLAYER_A_TOUCH_DRAGGED)[1] / PIXEL_PER_METER);
        isSliding = true;
        canMove = false;
    }

    private void checkCollisionAndMovement(float dt) {
        cretePlayerRec();

        if (playerRec.overlaps(midBound)) {
            playerBody.setLinearVelocity(-.1f, 0);
        } else if (playerRec.overlaps(lowerBound)) {
            playerBody.setLinearVelocity(0, +.1f);
        } else if (playerRec.overlaps(upperBound)) {
            playerBody.setLinearVelocity(0, -.1f);
        } else if (canMove) {
            float x = destination.x - playerBody.getPosition().x;
            float y = destination.y - playerBody.getPosition().y;

            playerBody.setLinearVelocity(getMoveStep(x, y, dt));
        } else if (isSliding) {
            float x = destination.x - slidingDest.x;
            float y = destination.y - slidingDest.y;

            playerBody.setLinearVelocity(x * -1, y);
        }
    }

    private Vector2 getMoveStep(float x, float y, float dt) {

        if (x < 0) {
            x -= dt;
        } else {
            x += dt;
        }

        if (y < 0) {
            y -= dt;
        } else {
            y += dt;
        }

        return new Vector2(x, y);
    }
}