I have a characterbody2d and I want to display the equipment being worn. So this equipment would need to be swapped around during game play.

I currently am using several sprites layered. How is best to handle this situation?

  • I Cast Fist@programming.dev
    link
    fedilink
    arrow-up
    3
    ·
    4 days ago

    One sprite node for the naked character, another for each part of armor (helmet, chest, pants, for instance). If every armor sprite is equally positioned in its image, you can then load different files as needed - on an equipment change, call a load("res://armor2.png") for the Texture of the armor node. You’ll also need to keep the file path string saved somewhere, likely within the rest of the armor’s attributes

    While it may not be an immediate problem for you, keep in mind that each .png image the game keeps loaded will use some VRAM, according to its total size. For instance, each 1000x1000 png image will take ~4MB of VRAM. I recommend cropping as much unused vertical and horizontal space as feasible.

    • @ICastFist @Fizz i see this is godot specific and I’m not 100% sure how godot handles it but the normal way to store your image data for sprites like this is to index them from a packed sprite sheet (there’s tons of sprite packers out there, lots of animation tools have them built in), so instead of each obj being a 1000x1000png to use your example you may have a 4000x4000png with 10 objects packed in it.

      Most engines will handle this for you, you just have to pack the assets correctly for it.

      • I Cast Fist@programming.dev
        link
        fedilink
        arrow-up
        2
        ·
        3 days ago

        If you pack 10 objects in a 4000x4000 picture, but it has like 500px margins on every side, you’re wasting memory for literally no reason, that’s the point I wanted to bring attention to. Unused image space consumes memory. A spritesheet that only goes to 600px horizontally, but the image file has 1200px, it’s wasting resources.

      • Fizz@lemmy.nzOP
        link
        fedilink
        arrow-up
        1
        ·
        4 days ago

        Thank you for the reply.

        So this is similar to a tilemap in how you pick tiles based on their position on the map. I can draw sprites with just refernces to this sheet that sounds pretty good. I gotta look into this for when i spawn large groups of enemies with various gear.

        For now on my main characters I’m sticking with the 10 sprite nodes stacked.

        • @Fizz similar but for games/engines that don’t use uniform tile maps you basically just have a metadata set alongside the image that indexes where each sub-image is located in it.

          It doesn’t really change the end product, and as I said most engines already work like this for most 2d stuff, and many editors will pack for you if you tell them. You’re just indexing portions of a texture, but it uses an order of magnitude less memory/storage and loads faster even off slow storage or web streaming.

  • Pennomi@lemmy.world
    link
    fedilink
    English
    arrow-up
    1
    ·
    4 days ago

    Yep, multiple sprites layered is the right way to do this, one sprite per equipment item. That’s the normal way to approach this problem.

    Unless you are rendering literally thousands of characters at the same time, you should not reach any performance bottlenecks from this approach. If you are rendering that many characters at once, you might need to build a custom shader to handle it.

    But the important thing in gamedev is to keep things as simple as possible. Implement everything in the most obvious way you can. I think the solution you described is very good.