zelda
  1.  
  2. using Microsoft.Xna.Framework;
  3. using Microsoft.Xna.Framework.Graphics;
  4. using Microsoft.Xna.Framework.Input;
  5. using System;
  6. using System.Collections.Generic;
  7.  
  8. partial class GAME : Game
  9. {
  10. static void Main() { new GAME().Run(); }
  11.  
  12. GraphicsDeviceManager graphics;
  13. SpriteBatch sprite_batch;
  14.  
  15. int draw_scale = 3;
  16. Matrix scale_matrix;
  17.  
  18. const int NES_W = 256;
  19. const int NES_H = 224;
  20. const int HUD_H = 56;
  21. XY SCREEN_SIZE = new XY(16, 11) * new XY(16, 16);
  22.  
  23. Dictionary<string, Texture2D> pngs;
  24.  
  25. Texture2D bg_png;
  26. Vector2 link_pos;
  27. XY link_dir;
  28. float link_speed;
  29. bool using_sword;
  30. Vector2 sword_pos;
  31. ANIM link_anim;
  32. ANIM sword_anim;
  33.  
  34. class FRAME
  35. {
  36. public string png;
  37. public XY xy;
  38. public static FRAME EMPTY = new FRAME("", 0, 0);
  39. public FRAME() { }
  40. public FRAME(string png, int x, int y) { this.png = png; xy.x = x; xy.y = y; }
  41. }
  42. class ANIM
  43. {
  44. public bool repeats;
  45. public int frame;
  46. public FRAME[] frames;
  47. public ANIM() { }
  48. public ANIM(FRAME[] frames) { this.frames = frames; }
  49. }
  50. Dictionary<string, ANIM> anims;
  51. void reset_anim(ANIM anim) { anim.frame = 0; }
  52. void update_anim(ANIM anim)
  53. {
  54. if (anim.frame < anim.frames.Length) anim.frame++;
  55. if (anim.frame == anim.frames.Length && anim.repeats) anim.frame = 0;
  56. }
  57. bool anim_done(ANIM anim) { return anim.frame >= anim.frames.Length; }
  58. string anim_png(ANIM anim)
  59. {
  60. if (anim.frame >= anim.frames.Length) return null;
  61. return anim.frames[anim.frame].png;
  62. }
  63. XY anim_offset(ANIM anim)
  64. {
  65. if (anim.frame >= anim.frames.Length) return XY.ZERO;
  66. return anim.frames[anim.frame].xy;
  67. }
  68.  
  69. // from anims.cs //
  70.  
  71. void init_anims()
  72. {
  73. anims = new Dictionary<string, ANIM>();
  74.  
  75. // just pulled one dir of each //
  76. anims.Add("link_walk_e", new ANIM(new FRAME[]
  77. {
  78. new FRAME("link_walk_e1", 0, 0), // 0
  79. new FRAME("link_walk_e1", 0, 0), // 1
  80. new FRAME("link_walk_e1", 0, 0), // 2
  81. new FRAME("link_walk_e1", 0, 0), // 3
  82. new FRAME("link_walk_e1", 0, 0), // 4
  83. new FRAME("link_walk_e1", 0, 0), // 5
  84. new FRAME("link_walk_e2", 0, 0), // 6
  85. new FRAME("link_walk_e2", 0, 0), // 7
  86. new FRAME("link_walk_e2", 0, 0), // 8
  87. new FRAME("link_walk_e2", 0, 0), // 9
  88. new FRAME("link_walk_e2", 0, 0), // 10
  89. new FRAME("link_walk_e2", 0, 0), // 11
  90. })); anims["link_walk_e"].repeats = true;
  91. anims.Add("link_attack_e", new ANIM(new FRAME[]
  92. {
  93. new FRAME("link_attack_e", 0, 0), // 0
  94. new FRAME("link_attack_e", 0, 0), // 1
  95. new FRAME("link_attack_e", 0, 0), // 2
  96. new FRAME("link_attack_e", 0, 0), // 3
  97. new FRAME("link_attack_e", 0, 0), // 4
  98. new FRAME("link_attack_e", 0, 0), // 5
  99. new FRAME("link_attack_e", 0, 0), // 6
  100. new FRAME("link_attack_e", 0, 0), // 7
  101. new FRAME("link_attack_e", 0, 0), // 8
  102. new FRAME("link_attack_e", 0, 0), // 9
  103. new FRAME("link_attack_e", 0, 0), // 10
  104. new FRAME("link_attack_e", 0, 0), // 11
  105. new FRAME("link_walk_e2", 0, 0), // 12
  106. new FRAME("link_walk_e1", 0, 0), // 13
  107. }));
  108. anims.Add("sword_e", new ANIM(new FRAME[]
  109. {
  110. FRAME.EMPTY, // 0
  111. FRAME.EMPTY, // 1
  112. FRAME.EMPTY, // 2
  113. FRAME.EMPTY, // 3
  114. new FRAME("sword_e", +11, 0), // 4
  115. new FRAME("sword_e", +11, 0), // 5
  116. new FRAME("sword_e", +11, 0), // 6
  117. new FRAME("sword_e", +11, 0), // 7
  118. new FRAME("sword_e", +11, 0), // 8
  119. new FRAME("sword_e", +11, 0), // 9
  120. new FRAME("sword_e", +11, 0), // 10
  121. new FRAME("sword_e", +11, 0), // 11
  122. new FRAME("sword_e", +8, 0), // 12
  123. new FRAME("sword_e", +4, 0), // 13
  124. }));
  125. }
  126.  
  127. public GAME()
  128. {
  129. graphics = new GraphicsDeviceManager(this);
  130. set_backbuffer_size(NES_W * draw_scale, NES_H * draw_scale);
  131. IsMouseVisible = true;
  132. }
  133.  
  134. protected override void LoadContent()
  135. {
  136. sprite_batch = new SpriteBatch(GraphicsDevice);
  137. scale_matrix = Matrix.CreateScale(draw_scale);
  138. pngs = load_pngs(".");
  139. pngs.Add("", null);
  140. init_anims();
  141. bg_png = pngs["background"];
  142. link_anim = anims["link_walk_n"];
  143. link_dir = XY.UP;
  144. link_pos = new Vector2(120, 136);
  145. link_speed = 1.5f;
  146. using_sword = false;
  147. }
  148.  
  149. protected override void Update(GameTime gameTime)
  150. {
  151. update_keyboard();
  152.  
  153. if (using_sword)
  154. {
  155. update_anim(link_anim);
  156. update_anim(sword_anim);
  157. sword_pos = link_pos + anim_offset(sword_anim);
  158. if (anim_done(sword_anim))
  159. {
  160. using_sword = false;
  161. if (link_dir == XY.UP) link_anim = anims["link_walk_n"];
  162. else if (link_dir == XY.DOWN) link_anim = anims["link_walk_s"];
  163. else if (link_dir == XY.LEFT) link_anim = anims["link_walk_w"];
  164. else if (link_dir == XY.RIGHT) link_anim = anims["link_walk_e"];
  165. reset_anim(link_anim);
  166. }
  167. }
  168. if (!using_sword)
  169. {
  170. if (keydown(Keys.X))
  171. {
  172. using_sword = true;
  173. char dir_c = '\0';
  174. if (link_dir == XY.UP) dir_c = 'n';
  175. else if (link_dir == XY.DOWN) dir_c = 's';
  176. else if (link_dir == XY.LEFT) dir_c = 'w';
  177. else if (link_dir == XY.RIGHT) dir_c = 'e';
  178. link_anim = anims["link_attack_" + dir_c];
  179. sword_anim = anims["sword_" + dir_c];
  180. reset_anim(link_anim);
  181. reset_anim(sword_anim);
  182. sword_pos = link_pos + anim_offset(sword_anim);
  183. }
  184. else if (keydown(Keys.Up))
  185. {
  186. update_anim(link_anim);
  187. if (link_dir != XY.UP)
  188. {
  189. link_dir = XY.UP;
  190. link_anim = anims["link_walk_n"];
  191. reset_anim(link_anim);
  192. }
  193. link_pos += link_dir * link_speed;
  194. }
  195. else if (keydown(Keys.Down))
  196. {
  197. update_anim(link_anim);
  198. if (link_dir != XY.DOWN)
  199. {
  200. link_dir = XY.DOWN;
  201. link_anim = anims["link_walk_s"];
  202. reset_anim(link_anim);
  203. }
  204. link_pos += link_dir * link_speed;
  205. }
  206. else if (keydown(Keys.Left))
  207. {
  208. update_anim(link_anim);
  209. if (link_dir != XY.LEFT)
  210. {
  211. link_dir = XY.LEFT;
  212. link_anim = anims["link_walk_w"];
  213. reset_anim(link_anim);
  214. }
  215. link_pos += link_dir * link_speed;
  216. }
  217. else if (keydown(Keys.Right))
  218. {
  219. update_anim(link_anim);
  220. if (link_dir != XY.RIGHT)
  221. {
  222. link_dir = XY.RIGHT;
  223. link_anim = anims["link_walk_e"];
  224. reset_anim(link_anim);
  225. }
  226. link_pos += link_dir * link_speed;
  227. }
  228. }
  229.  
  230. base.Update(gameTime);
  231. }
  232.  
  233. protected override void Draw(GameTime gameTime)
  234. {
  235. GraphicsDevice.Clear(Color.Black);
  236.  
  237. start_batch(scale_matrix);
  238. draw_sprite(bg_png, Vector2.Zero, null, Color.White);
  239. if (using_sword) draw_sprite(pngs[anim_png(sword_anim)], (XY)sword_pos, null, Color.White);
  240. draw_sprite(pngs[anim_png(link_anim)], (XY)link_pos, null, Color.White);
  241. end_batch();
  242.  
  243. base.Draw(gameTime);
  244. }
  245. }
  246.  
Pasted 2026-08-21 12:21:50

Short link: