SteelGolem icon

zelda

SteelGolem | PRO | 08/22/26 10:21:33 AM UTC | 0 ⭐ | 8154 👁️ | Never ⏰ | []
C# |

6.61 KB

|

None

|

0 👍

/

0 👎

 
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