package com.fdangelo.circleworld.universeengine.objects; import com.badlogic.gdx.math.MathUtils; import com.badlogic.gdx.math.Vector2; import com.fdangelo.circleworld.universeengine.tilemap.Planet; import com.fdangelo.circleworld.universeengine.tilemap.TileHitFlags; import com.fdangelo.circleworld.utils.Mathf; import com.fdangelo.circleworld.utils.Vector2I; public class Avatar extends UniverseObject { public AvatarInput input = new AvatarInput(); private final float jumpSpeed = 7.0f; private final float walkSpeedMax = 3.0f; private final float walkAcceleration = 10.0f; private final float walkFriction = 10.0f; private Ship onShip; @Override protected void onUpdate(final float deltaTime) { if (onShip == null) { if (canWalk()) { if (input.walkDirection != 0) { velocityX += input.walkDirection * walkAcceleration * deltaTime; } else { velocityX -= Mathf.Sign(velocityX) * MathUtils.clamp(walkFriction * deltaTime, 0, Math.abs(velocityX)); } velocityX = MathUtils.clamp(velocityX, -walkSpeedMax, walkSpeedMax); } if (input.jump && canJump()) { velocityY = jumpSpeed; } } else { velocityX = 0; velocityY = 0; positionX = onShip.getPositionX(); positionY = onShip.getPositionY(); } input.reset(); } public final boolean canWalk() { return true; } public final boolean canJump() { return (hitFlags & TileHitFlags.Down) != 0; } public final void boardShip(final Ship ship) { onShip = ship; scale = 1.0f; setParent(null, FollowParentParameters.None, ship.getPositionX(), ship.getPositionY(), rotation); setVisible(false); } static private Vector2I tmpvi = new Vector2I(); public final void travelToPlanet(final Planet planet) { if (onShip != null) { Vector2I landTile = tmpvi; // Set position closest to the ship planet.getTileCoordinatesFromPosition(onShip.getPositionX(), onShip.getPositionY(), landTile); final int landTileX = landTile.x; int landTileY = landTile.y; landTile = null; landTileY = planet.getHeight(); final Vector2 tilePositionOnPlanet = planet.getPositionFromTileCoordinate(landTileX, landTileY); setParent(planet, FollowParentParameters.Default, tilePositionOnPlanet.x, tilePositionOnPlanet.y, 0.0f); // Leave ship onShip = null; } else { final Vector2 tilePositionOnPlanet = planet.getPositionFromTileCoordinate(0, planet.getHeight()); setParent(planet, FollowParentParameters.Default, tilePositionOnPlanet.x, tilePositionOnPlanet.y, 0.0f); } setVisible(true); } }