SteelGolem

zelda

Aug 22nd, 2026
12,048
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C# 6.61 KB | None | 0 0
  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.  
Advertisement