boulder-dash/src/actors/Tiles/Player.cs

150 lines
4.4 KiB
C#

enum Animation : int
{
NORMAL = 0,
IDLE1 = 1,
IDLE2 = 2,
IDLE3 = 3,
WALK_LEFT = 4,
WALK_RIGHT = 5,
}
class Player : Tile
{
private int walkCD = 0;
const int TICKS_PER_TILE = 10;
private double i, j;
private int tileXIdle;
private int tileXWalk;
private bool isMoving = false;
private bool direction = true;
private int idleCD = 512;
private TileSet tileSet;
private int age = 0;
public Player(TileSet tileSet, int srcX, int srcY) : base(tileSet, srcX, srcY)
{
this.tileSet = tileSet;
}
public override void Draw(Context context, int x, int y)
{
if (age < 12 * 16)
{
if (age % 32 < 16)
{
context.renderer.DrawTileSet(tileSet, x, y, 1, 6);
}
else
{
context.renderer.DrawTileSet(tileSet, x, y, 2, 6);
}
return;
}
else if (age < 15 * 16)
{
context.renderer.DrawTileSet(tileSet, x, y, 1 + (age - 12 * 16) / 16, 0);
return;
}
var animation = Animation.NORMAL;
var tileX = 0;
if (isMoving)
{
animation = direction ? Animation.WALK_RIGHT : Animation.WALK_LEFT;
tileX = tileXWalk;
}
else
{
if (idleCD < 0)
{
animation = Animation.IDLE1;
tileX = tileXIdle;
}
if (idleCD < -256)
{
animation = Animation.IDLE2;
}
if (idleCD < -512)
{
animation = Animation.IDLE3;
}
}
context.renderer.DrawTileSet(tileSet, x, y, tileX, (int)animation);
}
public override void Update(Context context, Map map, int x, int y)
{
++i;
i = i % 64;
tileXIdle = (int)(i * (8.0 / 64.0));
++j;
j = j % 32;
tileXWalk = (int)(j * (8.0 / 32.0));
age++;
if (age < 15 * 16) return;
if (GameState.keyState.isPressed(Control.UP) && walkCD is 0)
{
if (!map.IsSolid(x, y - 1) || map.IsSemiSolid(x, y - 1))
{
map.SetTile(x, y - 1, 9);
map.SetTile(x, y, 0);
}
walkCD = TICKS_PER_TILE;
}
if (GameState.keyState.isPressed(Control.DOWN) && walkCD is 0)
{
if (!map.IsSolid(x, y + 1) || map.IsSemiSolid(x, y + 1))
{
map.SetTile(x, y + 1, 9);
map.SetTile(x, y, 0);
}
walkCD = TICKS_PER_TILE;
}
if (GameState.keyState.isPressed(Control.LEFT) && walkCD is 0)
{
if (!map.IsSolid(x - 1, y) || map.IsSemiSolid(x - 1, y))
{
map.SetTile(x - 1, y, 9);
map.SetTile(x, y, 0);
}
if (map.GetTile(x - 1, y) is (int)TileType.ROCK && map.GetTile(x - 2, y) is (int)TileType.AIR)
{
map.SetTile(x - 1, y, 9);
map.SetTile(x - 2, y, (int)TileType.ROCK);
map.SetTile(x, y, 0);
}
walkCD = TICKS_PER_TILE;
}
if (GameState.keyState.isPressed(Control.RIGHT) && walkCD is 0)
{
if (!map.IsSolid(x + 1, y) || map.IsSemiSolid(x + 1, y))
{
map.SetTile(x + 1, y, 9);
map.SetTile(x, y, 0);
}
if (map.GetTile(x + 1, y) is (int)TileType.ROCK && map.GetTile(x + 2, y) is (int)TileType.AIR)
{
map.SetTile(x + 1, y, 9);
map.SetTile(x + 2, y, (int)TileType.ROCK);
map.SetTile(x, y, 0);
}
walkCD = TICKS_PER_TILE;
}
if (GameState.keyState.isPressed(Control.LEFT) || GameState.keyState.isPressed(Control.RIGHT))
{
direction = GameState.keyState.isPressed(Control.RIGHT);
}
if (GameState.keyState.isPressed(Control.LEFT) || GameState.keyState.isPressed(Control.RIGHT) || GameState.keyState.isPressed(Control.UP) || GameState.keyState.isPressed(Control.DOWN))
{
isMoving = true;
idleCD = 512;
}
else
{
isMoving = false;
idleCD--;
}
walkCD = Math.Max(0, walkCD - 1);
base.Update(context, map, x, y);
}
}