150 lines
4.4 KiB
C#
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);
|
|
}
|
|
}
|