itch.io is community of indie game creators and players

Devlogs

Part 6: Making crystal-clear progress

Juicy the Orange
A downloadable game

Hi guys! I've definently noticed that I've been gone for an entire week, and that's because is that I almost didn't know what else to add for Juicy's world, and also, get this, I'm almost done with the first level of Juicy the Orange! Well, kind of almost finished. I still have to add more enemies, and change a certain section near the end of the second section of the first level. You see, with the latter,  I literally added it there because I didn't know what else to really add, and I'm planning to change this section once I have got done typing out Part 6 for my devlogs, and also, Juicy the Orange's difficulty is tailored towards both newcomers, casual gamers, and platforming experts because with my previous game, Owlet and the Biscuit Tower, many people commented on how they enjoyed it, but it was too difficult for some to enjoy. So, I lowered the difficulty heavily on Juicy the Orange from the positive feedback I received on Owlet and the Biscuit Tower, and encouraged me to make changes to suit people who just want to sit back, relax, and play a nice little 2D platformer. (Well, for the first few worlds anyway, because as the game progresses, things will get more difficult as the player progresses on.) But anyways, let's see on how I've grown as a solo game dev, and see those new features! 

First off, and I only just got the half of this part done: A health bar and 3 lives. First off, the health bar, it's your standard, typical, run-of-the-mill health bar, as shown in 3 hearts. However, this one is what I did uniquely: Instead of using a traditional progress bar in Godot, I used an AnimatedSprite2D node to not only display the full health bar, but to play its animations whenever Juicy gets hit by an enemy (whom that enemy is named "Bub", by the way). You see, I watched a BUNCH of Godot 4 tutorials regarding to a health system, and one by one, from which I tried to implement into Juicy the Orange, failed. Until one day, I decided to take a unique spin to it. I'll just add animations for a health bar to play a decreasing animation for every time Juicy gets hit, as in "if currentHealth == 2:, $"../LevelUI/HealthBar".play("2 Health Points")", and also, I setted up Juicy's overall health to be functioned with "var currentHealth: int = 3", and for Juicy's max health, "@export var MAXHEALTH: int = 3", and to decrease the same time as Juicy's health bar's animations play. So, that's exactly what I did, and for Bub to be in collision with Juicy, I added a "DamageArea" Area2D node, with a small rectangle CollisionShape2D child node to go along with, and plus, I added Juicy a "HitArea" Area2D node that is completely surrounded alongside his regular collision shape, and it's to track every time Bub touches Juicy, which can send the signal to both "take_damage" and "HealthUpdate", and for every time Bub touches Juicy, after in the "func _on_hit_area_body_entered(body: Node2D) -> void:", I added a function in Juicy's script called "func HealthUpdate():", and in that function, it goes over the logic of the code, as in "

if currentHealth == 3:

$"../LevelUI/HealthBar".play("Full Health")

if currentHealth == 2:

$"../LevelUI/HealthBar".play("2 Health Points")

if currentHealth == 1:

$"../LevelUI/HealthBar".play("1 Health Point")

if currentHealth == 0:

$"../LevelUI/HealthBar".play("No Health Points")

await get_tree().create_timer(0.5).timeout

get_tree().reload_current_scene()

currentHealth = MAXHEALTH"

Now, for the lives, I haven't fully implemented them yet, but I feel like I could add a simple "var juicy_lives: int = 3", and for whenever Juicy's overall health reaches 0, Juicy's lives will subtract from 1, as in "juicy_lives -= 2", and I'll also add in another function called "func lose_live():", and added the lives logic there, and whenever Juicy loses all of his lives, the game transports itself to the Game Over screen, which I'll implement later on, so I'll implement the lives shortly after I finish Part 6 for my devlog.

Now, the next thing I added is a very minor one, and that's knockback logic and flash invincibility frames. I'm still working on the knockback part though, as Juicy simply boosts in the air instead of getting pushed back in the opposite direction. Plus, Juicy's flash invincibility only dims his sprite, though I have mixed feelings on the latter on whether I want to keep it like that. Basically, I added two @export functions, KNOCKBACK_X, and KNOCKBACK_Y, and here's how it works for both of these functions: KNOCKBACK_X is supposed to send Juicy into the opposite direction as pushed left if Bub's in front moving left, and KNOCKBACK_Y is supposed to send Juicy in the air. Here's the GDScript code I wrote out: 

func knockback():

var knock_dir = sign(global_position.x)

velocity.x = KNOCKBACK_X * knock_dir

velocity.y = -KNOCKBACK_Y 

$AnimatedSprite2D.play("Juicy Hurt") 

and KNOCKBACK_Y is doing just what it's supposed to do, but KNOCKBACK_X isn't doing anything, as Juicy just gets flown into the air whenever he gets hit. So, I'm going to also fix this after this devlog. 

Now, for the next thing I added, and this is probably the most prominent: An actual transition that I can use throughout the game. So, I followed a tutorial called "Scene transition effects in Godot 3" by The Shaggy Dev and took some notes, and this one is what I attempted numerous times, but I failed every single time because I didn't know I was supposed to not only make the scene transition also work as an "Autoload" scene, but also, write separate GDScript code for the main levels and scenes for my game for every time when one scene opens up, I type in "func _ready() -> void: > ColorRect/AnimationPlayer.play("Dissolve"). It might sound a little tedious, with you having to make a new script every time you make a scene, add in the "SceneTransition" scene, and add in ready functions for every time you want to add a transition, but trust me, it's going to make opening up scenes look like a breeze. That's hard work and attention-to-detail right there. 

Also, I added in a little bridge segment with water hanging under the bridges. For the tileset that AxulArt made (Here's the link: Dirt & Grass 2D Platform Tileset Ver. 2 by AxulArt), I made those bridges myself, and for the water, I added in a little animation to give it more life. So, basically I went on into Piskel, animated each half of the water going one side up, the other side up, one side down, the other side down, imported it into Godot 4.4, added it in behind all of the tiles and objects, and duplicated it 3 times so that I have a clean and smooth water effect, and I didn't need to do any fancy code or any special water effect tricks! 

Oh, and for the health bar, I also originally included that in the test world for Juicy the Orange, but unfortunately, that health bar was the reason why I ended up deleting my test world, but now it's back, and with me finally having the urge to recreate the entire health bar.

Now, the next (and last thing, for today) I'm currently implementing are collectibles called "Juice Sprites". Basically, they are your Star Coins from Super Mario Bros., and that every time when Juicy picks up a Juice Sprite, one of them gets saved in three Juice Sprites containers located at the top middle of the screen, and every time when Juicy finishes a level, those Juice Sprites will go over to the Juice Sprite counter in the hub world of the game. as in "Juice Sprites: 0/84", and "Juicy collects 2 Juice Sprites and finishes level -> Juice Sprites: 2/84."  Note that there are 3 Juice Sprites hidden in each level, and they are essential for Juicy to unlock the boss door in every world, as Juicy must collect a certain number of Juice Sprites to gain access to the boss stage (Which is also the last level of each world.), but really, I only thought of this because I needed to find some way to implement these Juice Sprites without making them borderline useless collectibles, but I'll think of something in the future. 

Oh, and I was originally going to implement Juicy ricocheting off walls whenever he rolls and jumps, sort of Juicy’s way of wall climbing, but due to me having trouble implementing that in Godot 4, while also the fact that I’m only just an advanced beginner at this point, and was getting used to my comfort zone in Godot 4, I ultimately put the kibosh on that idea.

I feel like I could plan out my devlogs as here without making my views lose interest: I'll try to make something work and implement it in Juicy the Orange, and then by Friday, I'll make Part [insert number here]: [insert devlog title here], to show off my latest progress, and honestly, this devlog was kind of rushed in my opinion, as I literally haven't posted anything in an entire week, but I'm always proud to show off my progress, even if there are some aspects where I either need to fix, implement, or even improve upon. But really, I'll post whenever I feel like it, and I'll try my best to make and post a part for my devlogs the fastest way I can.

Also, in the past, before I started to make Juicy the Orange in Godot 4.4, I originally made a Reddit account, and posted my devlog over there, but my post ended up getting deleted because I had absolutely zero karma. Now, I browse Reddit ocassionally, but I have no idea what karma regarding to Reddit even is, so, I deleted my Reddit account, and I decided to stick to both itch.io and the Godot Forum (once I get unbanned for the latter.)

So, anyway, I think the next thing I'll be adding is a title screen (which will show Juicy simply walking along a parallax background, the title logo moving up and down smoothly, and cheerful music playing in the background.), a simple JRPG-like menu cursor to go along with the title screen (and the Options menu as well), more enemies to go along with just Bub and Chi Chi, and quite possibly, save files, because the Demo is what I'm going to build upon to the full, completed game. Oh, and also, after I release the Demo version of Juicy the Orange, I think I might change the level design for the first level a bit to make it easier to newcomer gamers and also add in readable signs to go around with the game.

I REALLY try my best to code, playtest, and see what works and what doesn't, as at this point, I've already moved up from a novice Godot developer with Owlet and the Biscuit Tower for the Brackeys Game Jam 2025.2, to an Advanced Beginner with Juicy the Orange. I kept quitting on this project numerous times in GDevelop, and now I'm committed to making this happen in Godot 4.4, and when people definently started noticing on my progress from across the world (well, on itch.io and the Godot Forum, anyway), I knew I couldn't stop. People were commenting left and right, saying on how my game and my current progress looks awesome, and that they enjoyed reading my devlogs (HUGE shoutout to IZebl and ashwinkoli02 for supporting, and ComicallyUnfunny for the help.), and I hope y'all keep enjoying reading my devlogs, as I'm working tirelessly to make Juicy the Orange a reality, and when the Demo finally comes out, it's not going to be the absolute perfect version, but it's definently and always going to be a sign that I've put hours and hours into this project for people to play and most importantly, for me to enjoy game dev. 🍊🍊👾🎮❤️❤️❤️Thanks a million, so much, and always.

You can check out IZebl, ashwinkoli02, and ComicallyUnfunny's games here!: IZebl: PiN by Zebedy, ashwinkoli02: Not Done Yet... by ForsakenVoid, and ComicallyUnfunny: WOMBO! by ComicallyUnfunny.

And as always, here's some screenshots of my current progress right here!:

Yeah, see this? This is too complex for a first level, so that's why I'm replacing this with an easier path before I release the Demo version of Juicy the Orange, because I couldn't really think of anything else.

Leave a comment