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 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 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(); // 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); } }