using Microsoft.Xna.Framework;
using Microsoft.Xna.Framework.Graphics;
using Microsoft.Xna.Framework.Input;
using System;
using System.Collections.Generic;
partial class GAME : Game
{
static void Main() { new GAME().Run(); }
GraphicsDeviceManager graphics;
SpriteBatch sprite_batch;
int draw_scale = 3;
Matrix scale_matrix;
const int NES_W = 256;
const int NES_H = 224;
const int HUD_H = 56;
XY SCREEN_SIZE = new XY(16, 11) * new XY(16, 16);
Dictionary<string, Texture2D> pngs;
Texture2D bg_png;
Vector2 link_pos;
XY link_dir;
float link_speed;
bool using_sword;
Vector2 sword_pos;
ANIM link_anim;
ANIM sword_anim;
class FRAME
{
public string png;
public XY xy;
public static FRAME EMPTY = new FRAME("", 0, 0);
public FRAME() { }
public FRAME(string png, int x, int y) { this.png = png; xy.x = x; xy.y = y; }
}
class ANIM
{
public bool repeats;
public int frame;
public FRAME[] frames;
public ANIM() { }
public ANIM(FRAME[] frames) { this.frames = frames; }
}
Dictionary<string, ANIM> anims;
void reset_anim(ANIM anim) { anim.frame = 0; }
void update_anim(ANIM anim)
{
if (anim.frame < anim.frames.Length) anim.frame++;
if (anim.frame == anim.frames.Length && anim.repeats) anim.frame = 0;
}
bool anim_done(ANIM anim) { return anim.frame >= anim.frames.Length; }
string anim_png(ANIM anim)
{
if (anim.frame >= anim.frames.Length) return null;
return anim.frames[anim.frame].png;
}
XY anim_offset(ANIM anim)
{
if (anim.frame >= anim.frames.Length) return XY.ZERO;
return anim.frames[anim.frame].xy;
}
// from anims.cs //
void init_anims()
{
anims = new Dictionary<string, ANIM>();
// just pulled one dir of each //
anims.Add("link_walk_e", new ANIM(new FRAME[]
{
new FRAME("link_walk_e1", 0, 0), // 0
new FRAME("link_walk_e1", 0, 0), // 1
new FRAME("link_walk_e1", 0, 0), // 2
new FRAME("link_walk_e1", 0, 0), // 3
new FRAME("link_walk_e1", 0, 0), // 4
new FRAME("link_walk_e1", 0, 0), // 5
new FRAME("link_walk_e2", 0, 0), // 6
new FRAME("link_walk_e2", 0, 0), // 7
new FRAME("link_walk_e2", 0, 0), // 8
new FRAME("link_walk_e2", 0, 0), // 9
new FRAME("link_walk_e2", 0, 0), // 10
new FRAME("link_walk_e2", 0, 0), // 11
})); anims["link_walk_e"].repeats = true;
anims.Add("link_attack_e", new ANIM(new FRAME[]
{
new FRAME("link_attack_e", 0, 0), // 0
new FRAME("link_attack_e", 0, 0), // 1
new FRAME("link_attack_e", 0, 0), // 2
new FRAME("link_attack_e", 0, 0), // 3
new FRAME("link_attack_e", 0, 0), // 4
new FRAME("link_attack_e", 0, 0), // 5
new FRAME("link_attack_e", 0, 0), // 6
new FRAME("link_attack_e", 0, 0), // 7
new FRAME("link_attack_e", 0, 0), // 8
new FRAME("link_attack_e", 0, 0), // 9
new FRAME("link_attack_e", 0, 0), // 10
new FRAME("link_attack_e", 0, 0), // 11
new FRAME("link_walk_e2", 0, 0), // 12
new FRAME("link_walk_e1", 0, 0), // 13
}));
anims.Add("sword_e", new ANIM(new FRAME[]
{
FRAME.EMPTY, // 0
FRAME.EMPTY, // 1
FRAME.EMPTY, // 2
FRAME.EMPTY, // 3
new FRAME("sword_e", +11, 0), // 4
new FRAME("sword_e", +11, 0), // 5
new FRAME("sword_e", +11, 0), // 6
new FRAME("sword_e", +11, 0), // 7
new FRAME("sword_e", +11, 0), // 8
new FRAME("sword_e", +11, 0), // 9
new FRAME("sword_e", +11, 0), // 10
new FRAME("sword_e", +11, 0), // 11
new FRAME("sword_e", +8, 0), // 12
new FRAME("sword_e", +4, 0), // 13
}));
}
public GAME()
{
graphics = new GraphicsDeviceManager(this);
set_backbuffer_size(NES_W * draw_scale, NES_H * draw_scale);
IsMouseVisible = true;
}
protected override void LoadContent()
{
sprite_batch = new SpriteBatch(GraphicsDevice);
scale_matrix = Matrix.CreateScale(draw_scale);
pngs = load_pngs(".");
pngs.Add("", null);
init_anims();
bg_png = pngs["background"];
link_anim = anims["link_walk_n"];
link_dir = XY.UP;
link_pos = new Vector2(120, 136);
link_speed = 1.5f;
using_sword = false;
}
protected override void Update(GameTime gameTime)
{
update_keyboard();
if (using_sword)
{
update_anim(link_anim);
update_anim(sword_anim);
sword_pos = link_pos + anim_offset(sword_anim);
if (anim_done(sword_anim))
{
using_sword = false;
if (link_dir == XY.UP) link_anim = anims["link_walk_n"];
else if (link_dir == XY.DOWN) link_anim = anims["link_walk_s"];
else if (link_dir == XY.LEFT) link_anim = anims["link_walk_w"];
else if (link_dir == XY.RIGHT) link_anim = anims["link_walk_e"];
reset_anim(link_anim);
}
}
if (!using_sword)
{
if (keydown(Keys.X))
{
using_sword = true;
char dir_c = '\0';
if (link_dir == XY.UP) dir_c = 'n';
else if (link_dir == XY.DOWN) dir_c = 's';
else if (link_dir == XY.LEFT) dir_c = 'w';
else if (link_dir == XY.RIGHT) dir_c = 'e';
link_anim = anims["link_attack_" + dir_c];
sword_anim = anims["sword_" + dir_c];
reset_anim(link_anim);
reset_anim(sword_anim);
sword_pos = link_pos + anim_offset(sword_anim);
}
else if (keydown(Keys.Up))
{
update_anim(link_anim);
if (link_dir != XY.UP)
{
link_dir = XY.UP;
link_anim = anims["link_walk_n"];
reset_anim(link_anim);
}
link_pos += link_dir * link_speed;
}
else if (keydown(Keys.Down))
{
update_anim(link_anim);
if (link_dir != XY.DOWN)
{
link_dir = XY.DOWN;
link_anim = anims["link_walk_s"];
reset_anim(link_anim);
}
link_pos += link_dir * link_speed;
}
else if (keydown(Keys.Left))
{
update_anim(link_anim);
if (link_dir != XY.LEFT)
{
link_dir = XY.LEFT;
link_anim = anims["link_walk_w"];
reset_anim(link_anim);
}
link_pos += link_dir * link_speed;
}
else if (keydown(Keys.Right))
{
update_anim(link_anim);
if (link_dir != XY.RIGHT)
{
link_dir = XY.RIGHT;
link_anim = anims["link_walk_e"];
reset_anim(link_anim);
}
link_pos += link_dir * link_speed;
}
}
base.Update(gameTime);
}
protected override void Draw(GameTime gameTime)
{
GraphicsDevice.Clear(Color.Black);
start_batch(scale_matrix);
draw_sprite(bg_png, Vector2.Zero, null, Color.White);
if (using_sword) draw_sprite(pngs[anim_png(sword_anim)], (XY)sword_pos, null, Color.White);
draw_sprite(pngs[anim_png(link_anim)], (XY)link_pos, null, Color.White);
end_batch();
base.Draw(gameTime);
}
}
Comments