nklbdev / godot-4-importality

Universal raster graphics and animations importers pack
MIT License
337 stars 7 forks source link

Sprite2D with AnimationPlayer - Animate "animation" properties #22

Open monkeez opened 9 months ago

monkeez commented 9 months ago

Forgive me if this is already an option but would it be possible to have an import option to animate the sprite using the animation properties?

image

nklbdev commented 9 months ago

I'm sorry, but you can't do this directly. This is because when you manipulate the hframes, vframes, frame and frame_coords properties of Sprite2D, your sprite is split into rows and columns without taking into account the borders around each region.

Importality uses the sprite_sheet/edges_artifacts_avoidance_method import setting, which controls the creation of borders around each sprite. You can read about it on the wiki: About exporting data from source files. Importality cannot use the hframes, vframes, frame and frame_coords properties of Sprite2D because they are not compatible with the extra borders around each region.

You can do it differently: Select in import settings:

After importing you will get a JSON resource which will contain the data in the data property. This is a regular Dictionary with primitive data. But the sprite_sheet.atlas field contains the real Texture2D resource in the CompressedTexture2D format to be precise.

You can use this data as you wish. For example, you can create your own post-import script, which from this data will create the Sprite2D you need with animations (via your own AnimationPlayer) based on the hframes, vframes, frame and frame_coords properties. To do this, create your script by copying post_import_script_example.gd. Place it where it is more convenient for you. For example, in the root folder of the project.

Select the script in import settings in the "Post import script" setting.

Change the script to suit you. The context.resource field will contain the same JSON-resource that I mentioned above. Try creating your Sprite2D with a child AnimationPlayer. Create animations based on data from context.resource.data Pack your Sprite2D as PackedScene and put it in context.resource instead of JSON

I hope I was able to help you.

_P.S.: I think I've figured out how I can add this feature in the future. But it will only be available if sprite_sheet/edges_artifacts_avoidance_method is set to None._

An example of the data you will find in your context.resource.data:

{
    "animation_library": {
        "animations": [
            {
                "direction": 0,
                "frames": [
                    {
                        "duration": 0.15,
                        "sprite_index": 0
                    },
                    {
                        "duration": 0.15,
                        "sprite_index": 1
                    }
                ],
                "name": "idle",
                "repeat_count": 0
            },
            {
                "direction": 0,
                "frames": [
                    {
                        "duration": 0.15,
                        "sprite_index": 2
                    },
                    {
                        "duration": 0.15,
                        "sprite_index": 3
                    },
                    {
                        "duration": 0.15,
                        "sprite_index": 4
                    },
                    {
                        "duration": 0.15,
                        "sprite_index": 5
                    }
                ],
                "name": "walking",
                "repeat_count": 0
            },
            {
                "direction": 0,
                "frames": [
                    {
                        "duration": 0.075,
                        "sprite_index": 6
                    },
                    {
                        "duration": 0.075,
                        "sprite_index": 7
                    },
                    {
                        "duration": 0.075,
                        "sprite_index": 8
                    },
                    {
                        "duration": 0.075,
                        "sprite_index": 9
                    }
                ],
                "name": "running",
                "repeat_count": 0
            },
            {
                "direction": 0,
                "frames": [
                    {
                        "duration": 0.15,
                        "sprite_index": 10
                    },
                    {
                        "duration": 0.15,
                        "sprite_index": 11
                    }
                ],
                "name": "braking",
                "repeat_count": 0
            },
            {
                "direction": 0,
                "frames": [
                    {
                        "duration": 0.15,
                        "sprite_index": 12
                    }
                ],
                "name": "jumping",
                "repeat_count": 0
            },
            {
                "direction": 0,
                "frames": [
                    {
                        "duration": 0.15,
                        "sprite_index": 13
                    }
                ],
                "name": "flying_up",
                "repeat_count": 0
            },
            {
                "direction": 0,
                "frames": [
                    {
                        "duration": 0.15,
                        "sprite_index": 14
                    }
                ],
                "name": "flying_down",
                "repeat_count": 0
            },
            {
                "direction": 0,
                "frames": [
                    {
                        "duration": 0.15,
                        "sprite_index": 15
                    }
                ],
                "name": "crouched",
                "repeat_count": 0
            },
            {
                "direction": 0,
                "frames": [
                    {
                        "duration": 0.15,
                        "sprite_index": 16
                    },
                    {
                        "duration": 0.15,
                        "sprite_index": 17
                    },
                    {
                        "duration": 0.15,
                        "sprite_index": 18
                    },
                    {
                        "duration": 0.15,
                        "sprite_index": 19
                    },
                    {
                        "duration": 0.15,
                        "sprite_index": 20
                    },
                    {
                        "duration": 0.15,
                        "sprite_index": 21
                    },
                    {
                        "duration": 0.15,
                        "sprite_index": 22
                    },
                    {
                        "duration": 0.15,
                        "sprite_index": 23
                    }
                ],
                "name": "crawling",
                "repeat_count": 0
            },
            {
                "direction": 0,
                "frames": [
                    {
                        "duration": 0.15,
                        "sprite_index": 24
                    },
                    {
                        "duration": 0.15,
                        "sprite_index": 25
                    },
                    {
                        "duration": 0.15,
                        "sprite_index": 26
                    },
                    {
                        "duration": 0.15,
                        "sprite_index": 27
                    },
                    {
                        "duration": 0.15,
                        "sprite_index": 28
                    },
                    {
                        "duration": 0.15,
                        "sprite_index": 29
                    }
                ],
                "name": "climbing",
                "repeat_count": 0
            },
            {
                "direction": 0,
                "frames": [
                    {
                        "duration": 0.15,
                        "sprite_index": 30
                    },
                    {
                        "duration": 0.15,
                        "sprite_index": 31
                    },
                    {
                        "duration": 0.15,
                        "sprite_index": 32
                    },
                    {
                        "duration": 0.15,
                        "sprite_index": 33
                    }
                ],
                "name": "shocked",
                "repeat_count": 0
            },
            {
                "direction": 0,
                "frames": [
                    {
                        "duration": 0.15,
                        "sprite_index": 34
                    },
                    {
                        "duration": 0.15,
                        "sprite_index": 35
                    },
                    {
                        "duration": 0.15,
                        "sprite_index": 36
                    },
                    {
                        "duration": 0.15,
                        "sprite_index": 37
                    },
                    {
                        "duration": 0.15,
                        "sprite_index": 38
                    },
                    {
                        "duration": 0.15,
                        "sprite_index": 39
                    }
                ],
                "name": "dying",
                "repeat_count": 0
            },
            {
                "direction": 0,
                "frames": [
                    {
                        "duration": 0.15,
                        "sprite_index": 40
                    }
                ],
                "name": "dead",
                "repeat_count": 0
            }
        ],
        "autoplay_index": -1
    },
    "sprite_sheet": {
        "atlas": "<CompressedTexture2D#-9223368087800023943>",
        "source_image_size": "(34, 34)",
        "sprites": [
            {
                "offset": "(-1, -1)",
                "region": "[P: (0, 0), S: (36, 36)]"
            },
            {
                "offset": "(-1, -1)",
                "region": "[P: (36, 0), S: (36, 36)]"
            },
            {
                "offset": "(-1, -1)",
                "region": "[P: (72, 0), S: (36, 36)]"
            },
            {
                "offset": "(-1, -1)",
                "region": "[P: (108, 0), S: (36, 36)]"
            },
            {
                "offset": "(-1, -1)",
                "region": "[P: (144, 0), S: (36, 36)]"
            },
            {
                "offset": "(-1, -1)",
                "region": "[P: (180, 0), S: (36, 36)]"
            },
            {
                "offset": "(-1, -1)",
                "region": "[P: (216, 0), S: (36, 36)]"
            },
            {
                "offset": "(-1, -1)",
                "region": "[P: (252, 0), S: (36, 36)]"
            },
            {
                "offset": "(-1, -1)",
                "region": "[P: (0, 36), S: (36, 36)]"
            },
            {
                "offset": "(-1, -1)",
                "region": "[P: (36, 36), S: (36, 36)]"
            },
            {
                "offset": "(-1, -1)",
                "region": "[P: (72, 36), S: (36, 36)]"
            },
            {
                "offset": "(-1, -1)",
                "region": "[P: (108, 36), S: (36, 36)]"
            },
            {
                "offset": "(-1, -1)",
                "region": "[P: (144, 36), S: (36, 36)]"
            },
            {
                "offset": "(-1, -1)",
                "region": "[P: (180, 36), S: (36, 36)]"
            },
            {
                "offset": "(-1, -1)",
                "region": "[P: (216, 36), S: (36, 36)]"
            },
            {
                "offset": "(-1, -1)",
                "region": "[P: (252, 36), S: (36, 36)]"
            },
            {
                "offset": "(-1, -1)",
                "region": "[P: (0, 72), S: (36, 36)]"
            },
            {
                "offset": "(-1, -1)",
                "region": "[P: (36, 72), S: (36, 36)]"
            },
            {
                "offset": "(-1, -1)",
                "region": "[P: (72, 72), S: (36, 36)]"
            },
            {
                "offset": "(-1, -1)",
                "region": "[P: (108, 72), S: (36, 36)]"
            },
            {
                "offset": "(-1, -1)",
                "region": "[P: (144, 72), S: (36, 36)]"
            },
            {
                "offset": "(-1, -1)",
                "region": "[P: (180, 72), S: (36, 36)]"
            },
            {
                "offset": "(-1, -1)",
                "region": "[P: (216, 72), S: (36, 36)]"
            },
            {
                "offset": "(-1, -1)",
                "region": "[P: (252, 72), S: (36, 36)]"
            },
            {
                "offset": "(-1, -1)",
                "region": "[P: (0, 108), S: (36, 36)]"
            },
            {
                "offset": "(-1, -1)",
                "region": "[P: (36, 108), S: (36, 36)]"
            },
            {
                "offset": "(-1, -1)",
                "region": "[P: (72, 108), S: (36, 36)]"
            },
            {
                "offset": "(-1, -1)",
                "region": "[P: (108, 108), S: (36, 36)]"
            },
            {
                "offset": "(-1, -1)",
                "region": "[P: (144, 108), S: (36, 36)]"
            },
            {
                "offset": "(-1, -1)",
                "region": "[P: (180, 108), S: (36, 36)]"
            },
            {
                "offset": "(-1, -1)",
                "region": "[P: (216, 108), S: (36, 36)]"
            },
            {
                "offset": "(-1, -1)",
                "region": "[P: (252, 108), S: (36, 36)]"
            },
            {
                "offset": "(-1, -1)",
                "region": "[P: (0, 144), S: (36, 36)]"
            },
            {
                "offset": "(-1, -1)",
                "region": "[P: (36, 144), S: (36, 36)]"
            },
            {
                "offset": "(-1, -1)",
                "region": "[P: (72, 144), S: (36, 36)]"
            },
            {
                "offset": "(-1, -1)",
                "region": "[P: (108, 144), S: (36, 36)]"
            },
            {
                "offset": "(-1, -1)",
                "region": "[P: (144, 144), S: (36, 36)]"
            },
            {
                "offset": "(-1, -1)",
                "region": "[P: (180, 144), S: (36, 36)]"
            },
            {
                "offset": "(-1, -1)",
                "region": "[P: (216, 144), S: (36, 36)]"
            },
            {
                "offset": "(-1, -1)",
                "region": "[P: (252, 144), S: (36, 36)]"
            },
            {
                "offset": "(-1, -1)",
                "region": "[P: (0, 180), S: (36, 36)]"
            }
        ]
    }
}