Combat Platformer in Godot 4: April 2024 progress
Summary
Visual revamp
Big revamp! I finally switched the whole game to full custom graphics. I first worked with a resolution similar to the proto character asset (see previous post 3 months ago), then tried smaller sizes to draw faster. Below, some character scale research:
From left to right:
- Tiny: fast to draw, but hard to show details like scars, sword erosion or body limb animations. Instead, it relies a lot on translations and FX.
- Chibi: I don’t like how this one turned out, it was supposed to look like Momodora I-III but got ugly and now it reminds me of the horned idol statue in Indiana Jones and the Fate of Atlantis.
- Small: It’s a nice compromise, I’d go with this one if I had more time.
- Normal: The original sprite I’ve drawn, would take more time to animate, but I’d go with this one if I hired a pixel artist.
- Tall: A funny experiment with the “thin body - long legs” pixel art style found in indie games like Superbrothers: Sword & Sworcery EP.
In the end I went for the Tiny art style, using references such as Time for Lunch (PICO-8 game) and Necrosphere.
Then I converted the other elements (boss, projectiles and FX) and added new elements (background, HUD) to fit in this style. The ice spike FX is very big so it was quite easy to convert (although the warm up animation needed some tuning), while I had to redo the fireball animation from scratch (and also recolored them).
Rebuilt boss level
I also rebuilt the whole level to something symmetrical with a few platforms. Kudos to the Lospec Pixel School which helped me tune the color palette! Using Aseprite, it’s quite fast with the Indexed Color Mode + Edit Color button.
First SFX
Finally, I added fireball spawn SFX. Instead of the usual sfxr (via jsfxr), I tried to use audio synthesizer Vital. I had already tested its free little brother Helm but was limited by the lack of wave modulation and wanted more features… Well, I got them, there are too many for me to understand now, so I just used a little bit of Vital’s features.
The biggest issue was Reaper + Vital plugin crashing on Linux which forced me to manually record the SFX from Vital standalone. I may eventually switch back to jsfxr or Helm because of this.
Since I was busy working on new graphics and plugging the HUD behavior, there is no new gameplay features in this update. I will work on improved boss patterns and main character moves next time.
Changelog
Level
- Rebuilt full level as a small, one-screen room with 5 platforms
UI
- HUD: plug main character & boss life gauges to their remaining HP
Visual
- Main character sprites: Idle (1 frame), Run cycle (4 frames), Attack (7 frames)
- Boss sprites (Tiny art style): Idle (1 frame)
- Fireball sprites (Tiny art style): Move (4 frames)
- Ice spikes (Tiny art style): Warm up (13 frames), Appear (6 frames), Active (4 frames), Disappear (3 frames)
- HUD: Main character life gauge (discrete cells), Boss life gauge (continuous gauge)
Audio
- SFX: Fireball spawn
Godot threads opened
For the first time, I’ll also post the list of Godot issues and proposals I opened since the last devlog. It’s pretty long because they span over 3 months, hopefully next list will be shorter.
I realised I spent a considerable amount of time debugging, isolating MWE (Minimum Working Examples) and posting them on GitHub, so tracking issues I have opened is a good way to motivate me: I’ve not been doing nothing that day!
For now it’s my main way to contribute to Godot, but I hope I’ll be able to send pull requests to contribute to engine code in the near future.
Issues
- #87254 Sometimes after saving scene, both instantiated scene and original scene node numerical properties become null, shown as 0 in inspector
- #88067 Erratic behavior when CharacterBody2D is inside tilemap (or group of small colliders) with collision shapes, is_on_floor returns false
- #88115 AnimatedSprite2D: Empty Animation name error on ready/instantiation propagates to inherited scenes
- #88303 Scene editor: Mouse middle click doesn’t always close scene tab
- #88400 Export: Save a File: Godot doesn’t update Quick Access folders if changed after opening editor, causing offset display or even out-of-bounds error
- #88408 Linux: Scene editor: Control: Releasing mouse primary button after Alt+drag for centered Control resize will not end resize operation
- #89543 Linux X11 OpenGL/Vulkan - After changing window size, window content doesn’t immediately refresh to match new size
- #89621 Linux - Portable installation of Blender not recognized for Blender import with error: Blender Path does not contain a Blender installation
- #89785 Autocomplete Input.get_axis StringName parameter suddenly switches from action name to symbols while typing
- #89910 When Import ETC2 ASTC option is disabled, Remote Debug on Android is still allowed but fails Export with empty error message in Project Run popup
- #89923 TileSet: Leftover patterns after TileSet atlas source removal causes output error spam “No TileSet atlas source with id N”
- #90021 Instances of inherited scenes are not updated when changing exported var value on base scene if scene containing them was already open, until editor restart
- #90264 Literal String as int (or float) cast causes Parser Error “Cannot cast a value of type “String” as “int”.” although it works with variable String
- #90537 Repeated toggle fullscreen increases window size by the window decorations size each time we leave fullscreen
Discussions
- #8948 Add a button/option to build and run directly on plugged Android device
- #8958 Confused by CanvasLayer property follow_viewport_enable / follow_viewport_enabled, sounded like follow_camera_enabled but it’s the opposite
- #9096 Ctrl+Click to go to definition of method name defined as StringName &”my_method”
- #9396 Add Control child class/node that fits own size to children (maximum bounding box) to be used as intermediate parent under HBoxContainer/VBoxContainer
- #9400 Tilemap tile full rect collision shapes are considered independent, causing Raycast to hit individual tiles inside tilemap
- #9461 Add exception methods to CharacterBody2D to ignore specific collision objects during move_and_slide
Proposals
- #8854 Hover long editor bell notification text (cut with ellipsis) to see full message and/or allow copying full text with right-click
- #8947 Export to Android: improve Invalid package name error message by showing Project name converted to $genname explicitly
- #9095 F1 Search Help reused to navigate code: show custom symbols without doc + go to source code of custom class/method (from F1 popup or documentation)
- #9102 Debug: Code editor: command to debug content of Object variable under cursor/caret in remote Inspector
- #9105 Allow setting Mouse Default Cursor Shape differently when Button is disabled
- #9107 Add contextual menu to convert binary resource .res to serialized text .tres (and vice-versa)
- #9129 Windows export: Indicate reason for “Invalid file version” and “Invalid product version”
- #9146 Project settings: add Debug > GDScript > Warnings parameter to include/exclude specific add-ons
- #9307 Add an option to make Wide / Full Rect control anchor presets take Window Stretch Scale project setting into account
- #9387 Animation SpriteFrames: do not lose focus when deleting frame