Java tutorial
/* * 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 ch.coldpixel.mario.Sprites; import ch.coldpixel.mario.MarioBros; import ch.coldpixel.mario.Screens.PlayScreen; import com.badlogic.gdx.graphics.g2d.Animation; import com.badlogic.gdx.graphics.g2d.Sprite; import com.badlogic.gdx.graphics.g2d.TextureRegion; 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.CircleShape; import com.badlogic.gdx.physics.box2d.FixtureDef; import com.badlogic.gdx.physics.box2d.World; import com.badlogic.gdx.utils.Array; /** * Created by brentaureli on 8/27/15. */ public class Mario extends Sprite { public enum State { FALLING, JUMPING, STANDING, RUNNING }; public State currentState; public State previousState; public World world; public Body b2body; private TextureRegion marioStand; private Animation marioRun; private Animation marioJump; private float stateTimer; private boolean runningRight; public Mario(World world, PlayScreen screen) { super(screen.getAtlas().findRegion("little_mario")); this.world = world; currentState = State.STANDING; previousState = State.STANDING; stateTimer = 0; runningRight = true; Array<TextureRegion> frames = new Array<TextureRegion>(); for (int i = 1; i < 4; i++) { frames.add(new TextureRegion(getTexture(), i * 16, 0, 16, 16)); } marioRun = new Animation(0.1f, frames); frames.clear(); for (int i = 4; i < 6; i++) { frames.add(new TextureRegion(getTexture(), i * 16, 0, 16, 16)); } marioJump = new Animation(0.1f, frames); marioStand = new TextureRegion(getTexture(), 0, 0, 16, 16); defineMario(); setBounds(0, 0, 16 / MarioBros.PPM, 16 / MarioBros.PPM); setRegion(marioStand); } public void update(float dt) { setPosition(b2body.getPosition().x - getWidth() / 2, b2body.getPosition().y - getHeight() / 2); setRegion(getFrame(dt)); } public TextureRegion getFrame(float dt) { currentState = getState(); TextureRegion region; switch (currentState) { case JUMPING: region = marioJump.getKeyFrame(stateTimer); break; case RUNNING: region = marioRun.getKeyFrame(stateTimer, true); break; case FALLING: case STANDING: default: region = marioStand; break; } if ((b2body.getLinearVelocity().x < 0 || !runningRight) && !region.isFlipX()) { region.flip(true, false); runningRight = false; } else if ((b2body.getLinearVelocity().x > 0 || runningRight) && region.isFlipX()) { region.flip(true, false); runningRight = true; } stateTimer = currentState == previousState ? stateTimer + dt : 0; previousState = currentState; return region; } public void jump() { if (currentState != State.JUMPING) { b2body.applyLinearImpulse(new Vector2(0, 4f), b2body.getWorldCenter(), true); currentState = State.JUMPING; } } public State getState() { if ((b2body.getLinearVelocity().y > 0 && currentState == State.JUMPING) || (b2body.getLinearVelocity().y < 0 && previousState == State.JUMPING)) { return State.JUMPING; } //if negative in Y-Axis mario is falling else if (b2body.getLinearVelocity().y < 0) { return State.FALLING; } //if mario is positive or negative in the X axis he is running else if (b2body.getLinearVelocity().x != 0) { return State.RUNNING; } //if none of these return then he must be standing else { return State.STANDING; } } public void defineMario() { BodyDef bdef = new BodyDef(); bdef.position.set(32 / MarioBros.PPM, 32 / MarioBros.PPM); bdef.type = BodyDef.BodyType.DynamicBody; b2body = world.createBody(bdef); FixtureDef fdef = new FixtureDef(); CircleShape shape = new CircleShape(); shape.setRadius(6 / MarioBros.PPM); fdef.shape = shape; b2body.createFixture(fdef); } }