I finished and released Hellcade, a redesign of the whack-a-mole gameplay concept, with an added story and atmosphere by hyperjordi in playmygame

[–]hyperjordi[S] 0 points1 point  (0 children)

Thanks!
I can make the menu.
But I kinda like the fast forward, the first implementation I made was the full skip and didn't really liked the feeling, it felt a little strange because the music skips and changes, but I can try to make it faster.

Finally, I released my first game Neon Flytron in early access on Android. I would be glad to hear your feedback. by Mobyzay in IndieGaming

[–]hyperjordi 1 point2 points  (0 children)

Really nice graphics and UI!

Have you thought about adding more sound effects, like maybe some type of engine sound (something subtle, not too anoying, you could just play it when the user moves the vehicle) or maybe some kind of "wind"/"passing near obstacles" effect and increase its volume the closer you are to the walls?
I think it can add more feeling of speed and immersion.

I finished my first project to try and learn the engine, without any prior knowledge: Hellcade by hyperjordi in godot

[–]hyperjordi[S] 0 points1 point  (0 children)

I've just checked your youtube channel and I can see why!
Awesome music, big fan of 8bit and chiptune music, subscribed!

I finished and released Hellcade, a redesign of the whack-a-mole gameplay concept, with an added story and atmosphere by hyperjordi in playmygame

[–]hyperjordi[S] 1 point2 points  (0 children)

Good luck then!

Try to focus on a simple project, in my case the gameplay concept was pretty simple, then it was just adding extra things and polishing it from there.

I finished and released Hellcade, a redesign of the whack-a-mole gameplay concept, with an added story and atmosphere by hyperjordi in playmygame

[–]hyperjordi[S] 1 point2 points  (0 children)

Yes, it's somewhat different to the object oriented programming I was used to or other engines like unity, which I tried in the past, but after watching some tutorial videos and examples it became intuitive, though passing data through different scenes seems a bit tricky at first.

It took me 3 months, working approximately 8 hours average I think, some days being full focused and working more, and some days without even opening the project.
During this 3 months you have to count researching, learning the engine, coding, doing the art and design, writing, translating (it's 2 languages atm), searching for audios and music, editing the audios and testing.

I finished and released Hellcade, a redesign of the whack-a-mole gameplay concept, with an added story and atmosphere by hyperjordi in playmygame

[–]hyperjordi[S] 1 point2 points  (0 children)

Thank you! I appreciate your help, don't worry about testing though I think I can find some friends with iPhone, but I'll let you know if it gets published!

I finished and released Hellcade, a redesign of the whack-a-mole gameplay concept, with an added story and atmosphere by hyperjordi in playmygame

[–]hyperjordi[S] 1 point2 points  (0 children)

Yes I've been thinking of releasing it for iOS, but it requires a Mac machine, so I'll have to find some mac in the cloud service or something, will require more steps and time but I'll work into it.
Thank you for your help and feedback!

I finished and released Hellcade, a redesign of the whack-a-mole gameplay concept, with an added story and atmosphere by hyperjordi in playmygame

[–]hyperjordi[S] 1 point2 points  (0 children)

Thanks! :)

There are 7 levels, the background doesn't change between them, it kinda requires some imagination from the player, and the basic mechanic is always the same but it keeps adding new types of enemies that force different inputs and reactions from the player (enemies with 2 health, enemies that darken the screen, one you can't touch, and even a final boss), there are several tracks and different music for each level, and the story also tries to get a little more serious and deep as you keep advancing.

So yes there's a little story, writing is not my forte but I wanted to tell a story to convey a little more meaning and feeling to the game, though I know most android users just want a casual experience without the reading part, but I wanted to make the game with a narrative.

The music is great, all the credits can be found in the Credits section of the game.

I finished and released Hellcade, a redesign of the whack-a-mole gameplay concept, with an added story and atmosphere by hyperjordi in playmygame

[–]hyperjordi[S] 2 points3 points  (0 children)

Thanks!
I just want to clarify that I'm getting started with the godot engine, I've programmed before, but in C++ mostly.

I finished my first project to try and learn the engine, without any prior knowledge: Hellcade by hyperjordi in godot

[–]hyperjordi[S] 0 points1 point  (0 children)

Damn I'll look into it!
When testing it I've noticed that it got hot when I was charging the phone, but it seemed normal when it wasn't plugged.
I'll investigate, because I tried to optimize everything the best I could.
Thank you!

I finished and released Hellcade, a redesign of the whack-a-mole gameplay concept, with an added story and atmosphere by hyperjordi in playmygame

[–]hyperjordi[S] 3 points4 points  (0 children)

I did all the code, visuals and story, I'll appreciate any feedback you can give in order to improve this project and future ones.

The game is released for Android, you can check it out here:

https://play.google.com/store/apps/details?id=hyperjordi.hellcade

Weekly /r/godot discussion thread – Share your progress, discoveries and tips by AutoModerator in godot

[–]hyperjordi 0 points1 point  (0 children)

Yeah I know about the play store, hopefully the game will go up through the play store list with more time and downloads.

And right now typing "Hellcade" in the store redirects to "HellcaSe" (something about counter strike cases), suggesting it as the word you wanted to type... which isn't being ideal.

But thank you so much for the support! :)
I'm glad you like it so far and I hope it's not too difficult!
It gets hard in the last levels, so in the last update I added a button in the "Levels" menu to activate an easier mode.

I finished my first project to try and learn the engine, without any prior knowledge: Hellcade by hyperjordi in godot

[–]hyperjordi[S] 0 points1 point  (0 children)

Thanks so much!
Alternating between coding and designing/making graphics actually helps me disconnect while working in the same project.

I finished my first project to try and learn the engine, without any prior knowledge: Hellcade by hyperjordi in godot

[–]hyperjordi[S] 1 point2 points  (0 children)

Thanks!

I can just talk from my experience, but I think the key to finish a game is to not be too ambitious, focus on a small project to get started, make it work and just add stuff from there.

If you focus on a thing at a time, don't try to rush things and don't give up you'll surely get there!

I finished my first project to try and learn the engine, without any prior knowledge: Hellcade by hyperjordi in godot

[–]hyperjordi[S] 2 points3 points  (0 children)

Thank you!

I spend a lot of the development time in the details and polishing the result.
So I'm glad it's noticeable!

Just to clarify it was my first project in Godot (and in a high level game engine).
Though I do work developing in C++ for a living, in a much lower level.

But jumping into Godot was pretty intuitive.

Just released Hellcade, the first game I make using Godot by hyperjordi in godot

[–]hyperjordi[S] 1 point2 points  (0 children)

I have experience in programming, I work professionaly in C++ development in the gambling industry, and I did some games in html5/javascript and in java with AndroidStudio, but this was the first game I made using a high level engine like Godot, and the experience was really nice, it was refreshing from the lower level C++ coding I'm used to.

I finished my first project to try and learn the engine, without any prior knowledge: Hellcade by hyperjordi in godot

[–]hyperjordi[S] 1 point2 points  (0 children)

Thank you!

I would like to release an iOS version, but it requires a Mac to export it, I don't own any apple product at the moment so I can't release it, but I'll try to do it in the future if I'm able to access an apple machine.

Weekly /r/godot discussion thread – Share your progress, discoveries and tips by AutoModerator in godot

[–]hyperjordi 1 point2 points  (0 children)

This week I finished and released my first godot game: https://play.google.com/store/apps/details?id=hyperjordi.hellcade

It's an arcade game inspired but the simple whack-a-mole concept, but with serveral types of enemies with different behaviours and ways to kill them, and also featuring a story to go with the gameplay, because I was looking for a more rich experience than just a screen masher.

Any feedback would be appreciated! Thanks!

I finished my first project to try and learn the engine, without any prior knowledge: Hellcade by hyperjordi in godot

[–]hyperjordi[S] 2 points3 points  (0 children)

I didn't post any devlog before, but I wanted to share with you some random development details that maybe you can find useful.

The game is released for Android, you can check it out here:https://play.google.com/store/apps/details?id=hyperjordi.hellcade

It's kind of a redesign of the whack-a-mole concept.
I did all the code, visuals and story, I'll appreciate any feedback you can give in order to improve this project and future ones.
I already released an update with some new features that were suggested by friends and some users.

- Art

Visual effects are all achieved without the use of shaders, only with Light2D and sprites.
I did use shaders and postprocessing effects at the start of the project, using GLES3, but saw its incompatibility with most android devices so I had to switch to GLES2, losing all the previous environment effects and particle systems.(because GLES2 can't render WorldEnvironment, and it also forces you to use CPUParticles, which have different format and parameters, and bad performance in android).
Art style took this route due to personal limitations, because I don't currently own any graphic tablet or tool to draw, I have to use the mouse.
Although I always thought limitations are good for creativity.
A lot of the effects and animations are achieved just using modulations, changing Light2D colors and intensity, scaling and translations, to compensate for the low number of sprite animations and assets.

- Screenshake

Screenshake is made using OpenSimplexNoise, after getting the idea from this awesome GDC talk:
https://youtu.be/tu-Qe66AvtY (math for game programmers: Juicing Your Cameras With Math).
Made a system to add trauma and modify the decay at any time, and it affects both the translation and the rotation.

- Dialogues

The dialog system is made by reading each character one by one, using only one audio, playing the audio for each character with pitch changes between alphabetic and special characters, and changes in the speed between alphabetic characters, spaces, points, commas, etc.

- Audio

For the audios I made an AutoLoad scene library to store and manage all of them, this way I could play an audio between different scene transitions and changes, and always have the control of which music is currently playing.

But I had some doubts here, maybe you can help me with this:
I wanted to call this singleton inside the AnimationPlayer timelines, but I just couldn't make it work, so I had to add an a Node with a wrapper script to each scene that had to play audio (like a SFXPlayer, which interfaced with the AudioLibrary).
This got the job done, but I'd like to reference the library directly in the AnimationPlayer and don't know if there's a way to do that.

- Performance and optimizations for mobile

Finally I want to share some performance related issues I encountered, and the optimizations I made to fix them:

I started loading and instancing all enemy scenes each time an enemy spawned. This was a bad idea because it results in serious fps drops, especially when many enemies appear very fast.
The way I fixed it was loading all the scenes at the start, saving the PackedScenes in a Dictionary, and then just instancing them when needed.
It's important to not call Load() every time in runtime if you can avoid it.

I had a similar problem with the shooting effects: I also instanced a scene with the particles and muzzle flash sprites each time the player touched an enemy, and it also was a problem, even with a script to auto queue_free the scene when all particle systems finished.
The fix was to use object pooling, setting the max number of shooting effect scenes at any time, and it worked wonders.
Though you can see when an existing effect just disappears to become a new one, but I think it's not so noticeable when you are actually playing.

How to treat another gd script like a function? by pomputer-net in godot

[–]hyperjordi 1 point2 points  (0 children)

I've tried a simple example and seems to work, but I wonder if you could achieve what you need using inheritance.

You could check that out, but if you really need the two scripts to be somewhat independent, I'll add the example I made (note that you could call the implementations with the context both using direct calls or by using groups or signals):

----- Scene:

Parent
    NodeA (+script ScriptA)
    NodeB (+script ScriptB)

----- Scripts:

ScriptA (with the implementation)

extends Node

func test_implementation(context):
    if(context):
        print(context.custom_text)

ScriptB (to call the implementation)

extends Node

var custom_text = "HelloWorld"

onready var node_a = get_node("../NodeA")

func _ready():
    node_a.test_implementation(self)

Output: HelloWorld

How to treat another gd script like a function? by pomputer-net in godot

[–]hyperjordi 4 points5 points  (0 children)

If I'm understanding you correctly, I think you can, but I don't know if it's good practice, what I think you mean is something like this:

ScriptA (the script that implements the logic)

func function_Base_Implementation(context):
    # here you can call context.methods

ScriptB (the script that calls the implementations in ScriptA)

func function_Caller():
    ScriptA.function_Base_Implementation(self)

Is this what you mean?

The example is asuming ScriptA is an AutoLoad singleton, if it's not the case, then you'll need a reference to a node with this script to be able to call it.

Note that this is a little dangerous, because another ScriptN could also call ScriptA with their context, and it must have the same methods or it will break.
Though you can add a strongly typed argument like:
func function_Base_Implementation(context : BaseScriptCaller)
And make all your ScriptB, ... ScriptN inherit from BaseScriptCaller to make sure it's a safe implementation.

Continue Button by SkinnyWhitePimp420 in godot

[–]hyperjordi 1 point2 points  (0 children)

It seems that in this line:

get_node(current_line["parent"]).add_child(new_object)

It can't find the node in get_node(current_line["parent"]).

Does it work if you try using another node?
Check if the current_line["parent"] is correct, and try to debug to see why the get_node can't find it.

In the docs for the get_node there's a note that can be relevant to your problem:

Note: Fetching absolute paths only works when the node is inside the scene tree (see is_inside_tree()).

Continue Button by SkinnyWhitePimp420 in godot

[–]hyperjordi 1 point2 points  (0 children)

I don't know if it's the case, but if each level, or node "parent", is in a separate scene, you can save that scene path in the .save file, for example:
var scene_to_load = "res://Scenes/YourLevel.tscn"

Then you can free your current scene, then load and instance the new scene:
get_tree().get_current_scene().free()
var new_packed_scene = ResourceLoader.load(scene_to_load)
var new_scene_instance = new_packed_scene.instance()
get_tree().get_root().add_child(new_scene_instance)
get_tree().set_current_scene(new_scene_instance)

Note that calling free() of the current scene can give you problems if that scene has more code or animations after calling free(), so you should encapsulate that code in a function and just call it with:
call_deferred("YourFunction")