I made a BIG mistake with my indie game
ฝัง
- เผยแพร่เมื่อ 6 ต.ค. 2024
- Follow Isadora's Edge on Kickstarter: www.kickstarte...
Wishlist Isadora's Edge on Steam: store.steampow...
What's up, Gamers?
I really messed up pretty bad with the first pass on my enemy AI system, it legit barely works for what I needed. But that's okay, this video explains how I managed to salvage an otherwise pretty terrible situation!
The game that I'm developing as an indie game dev is called Isadora's Edge! A 2D Pixel Art platformer game, that I'm developing in the Godot Game Engine! If you're new to Godot or have any questions about Godot or game dev in general, feel free to ask me!
=== THE LOVELY AND TALENTED INSANDIO ===
TH-cam: / @insandio
=== ATTRIBUTIONS ===
Music used in the background is from the incredibly talented Low Frequency Music!
Song: 'Good Day' - www.youtube.co....
TH-cam Channel: www.youtube.co....
Soundcloud: / user-551516820
=== HASHTAGS ===
#GameDev #IndieGame #Godot #GodotEngine #IndieGameDev #Vimjam #8BitsToInfinity #Vimlark #VimJam2 #VimJam2021 #Vimjam2021 #Devlog #GameDevlog #GameJam #GameJamDevlog #Jam #GMTK #GMTKJam2021 #GMTKJAM2022 #Indie #Game #Dev #IndieDev
If you're interested, here's where you can wishlist Isadora's Edge on Steam! store.steampowered.com/app/3125320/Isadoras_Edge/
And you can follow the Kickstarter here: www.kickstarter.com/projects/inboundshovel/isadoras-edge
Thank you!
Been working on godot for months, never realized there was an editable children checkbox 😒
i cant believe im saying this but godot seems so complicated to me... all this node based approach that godot enforces make it so hard for my programmer oriented brain to grasp-
@@NoVIcE_Source Have you tried it yourself? I'm no expert but from my experience some youtubers tend to complicate it more than they need to.
I was right there with you on that, at first - but once you get into it, the nodes are pretty easy to work with! Just takes some time playing with it to get comfortable, haha!
@@NoVIcE_Source Nodes were a bit tricky for me to wrap my head around in the beginning too. If you want to take a traditional programming approach to it, just treat each individual node as an object of a class like in C++ or Java. In fact, that's exactly how they function under the hood, we just call them nodes in the editor, which allows us to edit them in the scene tree easier than setting it all up purely in code (which you can still totally do if need be)
And of course, practice makes perfect. Once ya get used to working with nodes, their strengths really start to shine through, but it can take time! Just be patient, and good luck (if you so choose, there are tons of other engines out there too that you might like more, but hey us Godotvians always appreciate new members 😉)
@@NoVIcE_Source its a lot like roblox
Q&A Question: In a past devlog you've talked about the game having four (main) levels. How long do you plan on these levels going to be, and I guess as an extension, what's the goal for the game's overall length?
Thanks so much for the question, I'll add it to the list! :D
Love how you go into detail about the entire process
Thank you so much, I'm glad you like it!
i was zoned out on the side half listening to the video in background when i heard "*EDIBLE CHILDREN*" i snapped back for sure . thanks for showing your experience with game developpement !
i just realised , i heard that way wrong. was funny when it happened though
@@La_Mop_Jaune_QCEDIBLE CHILDREN
State machines are always a headache. You can pretty much make them as finely granular as you want. Finding the right level of abstraction is an artform.
*Very small states with very simple logic*
Pro: Very reusable states.
Cons: State machine complexity explodes exponentially! Transitions between states may need some bespoke logic.
*Very large states with bespoke behavior*
Pro: Fine control over behavior in each state through code.
Cons: Less reusability, and more lines of code need to be written.
You need to find the right balance between those two extremes. And then there is the implementation of the state machine itself. I've seen quite a few different ways of doing that in my time, and they all have their pros and cons. I'm not sure that the one that is built in to Godot is even the best option available. I guess that the biggest pro of that is that if you are to work together with another Godot developer, then chances are that he/she/them/they is already familiar with it, so there is less of a learning curve.
Great analysis, spot on!
Turns out I leaned way too far into the small reusable states, had to course correct to more bespoke behaviors, haha!
13:44 FIR??? THE MARIO ODYSSEY GUY?? Didn't know he did animation lmao
GOD DAMN your pixel art looks great. i cant wait to play!
Thank you so much!
Hey congrats on getting the systems setup the way you like 👍 super big move
Thanks so much! :D
It really does feel good to have easier systems to use - and it's made working on actual level design so much more fun, haha!
Came because of your great shorts. Stayed for the casual swearing. Thanks for the tips
Awesome! Thank you!
13:44 Wait... Fir!?
Thanks a lot for making this episode.
No problem, thanks for leaving helpful comments and asking great questions!
I do define walking distance manually for each instance - or, more accurately, I have the capability to do that! They do have basic edge detection and stuff and default behavior that occurs if I don't override it manually, so it's more of a lever that I can pull if I want to!
My workflow for playtesting is very fast and loose, so having the ability to change all kinds of parameters on the fly on an individual instance of an enemy is really valuable to me - but once I have ideas set in stone, I'll probably force the generic movement handling in the general EnemyPhysicsController and only override it where I've found it completely necessary, heh
I'll make sure to keep editor footage in mind for future devlogs, and try to include it whenever I can! :D
Question: When creating stories and worlds for various TV, film and video game productions, teams tend to create a Story/Show Bible. So I was wondering if you have a Story Bible for your game and if so is that something you would be willing to talk about in the future? Isadora is already a pretty cool character in concept and seeing more of this world would be pretty sweet.
P.S Love your channel as watching your devlogs is a great insight on the day to day process of making an Indie game.
I have the same shirt! All the art and the coding you make looks so clean. I get stuck handling my game's enemy AIs for a while too, making them much more complicated than they had to be. What you came up with may just be what I have been looking for too! Thank you so much!
SHIRT TWINS!
Thank you so much for your comment, and glad my devlog could help you out!
Just checked out your channel too, and your game is looking good, excited to see more!
You are two parts crazy and four parts awesome. Thanks for the videos. I've found the shorts super helpful for understanding how to improve core parts.
Tysm for making these videos! It's so cool to be able to peak into an indie's upcoming game, especially when its such a banger. I learned a bunch from just watching for a while and can't wait to implement that stuff into my own "games".
That's awesome! And you're welcome! :D
Your enemy systems sound wonderful! Been thinking about something like this for a while now. Glad someone was able to implement it!
Looking forward to the full-length Isadora rap on the OST
Ayy, Chim on the beat
I'm not a game dev, but I really enjoy you're videos.
Super cool to learn about all the problems that I wasn't even aware of in video games and solution to the problems.
Looking forward to this game being released, it looks super smooth.
🍻
Legit would play this. It looks sick! I'm also making a game, though it's a totally different game in a different engine, I'm having fun with it. I hope you finish this game someday!
Recently found your channel and immediately interested :].
Great work!
As an aspiring game dev, your style and tips are insanely helpfull, keep up the good stuff.
Thanks, will do!
I watched the little short then came here and that intro… tis peak.
I absolutely LOVE the art of the game so far! I have a quick little note on the running animation (9:35)
The arms and legs should be offset (if the right arm swings to the front, the right leg should move back)
Excited to see the progress of this game!
hey bud, thanks for posting all of your gamedev journey, it's definitely motivating for development on my own game! good to see someone else also get caught in a design cyclone and realize it's a bad idea
About 3 months ago I decided I would learn to program and start deving a game with the help of some friends of mine. Today programing is going good I haven't started the game yet, but with time it will happen. Thanks for showing your experience.
That's awesome! Hope my videos can help with your progress!
I’ve gone down this rabbit hole, oh my god. Im doing everything in GMS2 and now im currently settled on just using scripts for all shared features (like hitbox, health, awareness, elemental interactions like burning, freezing, shocking, water interactions etc), then a subset of different movement scripts with the essential physics needed for each type (ground-roaming enemies, flying enemies, wall-bound enemies, etc) and what i do is basically this:
A main script in the create event will simply initialize the object with a short list of variables and will make it identifiable as an ‘ancestor object’ to a global controller.
Then, in that create event, i can pick and choose other initialization scripts (one to initialize it for having a hitbox, etc)
And in the step event, i have scripts run for each trait I initialized. Like for example something like “ancestor_step_burnable()” so it will catch fire when burned, and use variables initialized in the create event with “ancestor_init_burnable()” that also is used to set some variables like how long it burns, a damage or resistance multiplier, etc
But all code that is even somewhat unique or doesn’t have to behave exactly as other enemies will all be coded inside that object. Best of both worlds, especially when you want to maintain consistent logic for things like, oh, this enemy can burn, but not when wet for example.
I haven't used GMS2 myself, but that sounds like a really strong approach to me!
@@InboundShovel thank you, it works well. I’d say it’s almost like i’m creating custom “variable templates” for objects, and sticking to strict variable naming conventions. A perfect use for this too is interacting with a weather system. A simple initialization script like “ancestor_init_wettable()” would just create a handful of variables (e.g. amount_wet) and a controller can easily just go “ok, for all instances initialized with that function, when outside and it’s raining, or when underwater, etc, increase amount_wet, and decrease otherwise” and now, anything initiated to be burnable as well can also check first if it’s “wettable”, then, if so, can’t burn if it’s amount_wet is over a threshold. But then maybe trying to burn a wet object dries it faster! It becomes very systemic while fully trimmed to fit each type of object, all they have to do more is check a list of like 20 ancestor types “is it electrifiable? Is it a physics object? Can it be picked up and thrown? Does it cause damage?” And then objects can talk to each other easily and without a bunch of unnecessary noise
Very approachable explanations and nice filming setup. I am dying to know what the blinking LED directly above your head in the frame is for, though.
You just relieved some of my anxiety about a recent realization I had. Using the editor is harder for me than just writing some code. All the options and bells and whistles were what made me stop learning Unity because the editor just had too much going on. Thankfully I like Godot's editor in general and the node system, but I hate how often I get screwed up by not checking a box in the editor. I'm only halfway through the vid but this gets a thumbs up from me, dude.
I want to be able to do this in godot, wayyyyyy above me for now XD Love the video!
Thank you, and I'm sure you'll get there! :D
I can't remember that other indie game a guy was making, the character looked like a wizard and the gameplay looked like an updated version of the legend of zelda
Sounds like a Enemy State Machine Class!
amazing devlog and what area is after the plague doctor
Thank you so much!
After the Plague Doctor I'm working on a couple areas, one rooftop area in a big city called the "Shadowed Sky" and an underwater type area (although I don't think I'm gonna change up the physics underwater very much, if at all, haha!)
For the Bottle Sprite, would you consider making the 3 bottles different shapes for colorblind accessibility? Like, as an example: a round poison bottle, a conical flask for fire, and a diamond-based bottle for shock. Just a thought!
I like how I've procrasted making my game for the past 4 years and now that Im in college taking game design these video start popping me telling me to do so
Oh man I just discovered your channel a few days back and let me tell you that it is one of the most inspiring game dev channel that I have seen. I'm a web developer and I always try to extrapolate the web programming mindset to the game development and always struggle heheeh I dont know if you have videos about it but that that implemented on the physics and the hitControl blows my mind jajaja I would like a video that show how to create something like that because I'm learning godot now thx man the game dev secret series it is also huge jejeje I like I save all your videos like notes jejeje thx man I really appreaciate it, bad english non english speaker here jeeje Hi from Cuba.
I saw one yt short and i really wanna play this game!!
Thank you! Steam page coming soon for wishlisting!
I hope you don't take thid the wrong way, but everytime I hear about a mistake I've already dodged, it's really uplifting!
I'm making my own game and your game it's so similar to the idea i have so this is very helpfull for me you just gained a new subscriber
i should really actually make a game at some point lol
heya! Been following these Dev's Logs for a while now, and I too wanted to make a game, however I have zero coding knowledge, so a Q&A question I wanted to ask is: How did you begin coding, and what's the best way of learning how to program?
Also, very excited for the plage boss fight, it already looked very cool on the Game Jam version, so looking up for what you've been cooking!
The animations are insane
But I think you miss spelled the animators name at 13:43 it's with an i instead of e
Interesting. I think ima have the same issue xD isubbed like 2 days ago and im loving ur content man. also ur art style is great!
wow this game caught my eye i’d love to play it, i dont have a pc please release it on ps4 or mobile if possible :)
I'll try my best to do a console release! :D
Bruh he will pay a fucken 20 thousand dollars for porting the game on all big 3 platforms let alone console manufacturers want a share and guidelines so My advice is to get a cheap used steam deck from ebay and your gonna be good 👍..
How is being able to customize the behavior of individual instances of an enemy worth all that effort? Enemy variations that even look slightly different as a way to signal to the player that the enemy is different seems like better game design as it comunicates those differences to the player. Teaching something to the player and then contradicting it causes frustration . That fine control seems useful only to puzzle-heavy games and troll games like "I Wanna Be The Guy ". I really don't want to be a hater. That's a good game and a good youtube channel I just subscribed to. Just trying to understand things. :)
2:15 - So I haven't watched the vid yet but I suspect you are about to implement a State Chart System into your Game? Let's see if I assessed correctly!
Edit: I was severely wrong.
Still think a Behavior Tree/State Chart System would lend itself to such a game but as you mentioned, programming is your strength, setting it up in this way makes a lot of sense.
Hey! awesome videos, I've been watching them all and they are quite inspiring, I was wondering who is the artist making the sprites because I would like to take a look at the rest of their work. TYSM and keep the hard work!!
Can't you setup two things ? a collider box to detect an enemy and attack, and Two dots to tell him where he can't go further ?
"but that's fine, eh, who cares"
hi!! I'm you from the future informing you that it was NOT fine!! Why do you do this to me
LOL
What are your thoughts on hypothetically adding Archipelago multiworld randomizer support (eventually, obviously)
I had never heard of that before, but it looks super cool! I'll have to take a deeper look into it!
Maaan, I want so bad to learn how to create a game but i dont find the motivation, and when i have it it's so complicated. Should I watch many tuto to how create a game and take many note to create mines? Because it feels impossible to memorize.
Like I dont want for each things I want to do watch a tuto, but it is how it's work ?
Btw I love your short, even if I dont make my own game for the moment it is really fun to watch
where will this game be available when it's finished, and do you have an idea of the price tag for it? i just found your content from shorts and this game looks exactly like something i'd love as a huge fan of similar pixel art styled games like Iconoclasts.
I'll definitely be releasing on Steam! Hopefully I can port to Switch too, but that's more of a dream than a direct target, haha!
For price point, I haven't thought about it too much, somewhere in the standard indie game range!
Thanks for your interest, I really appreciate it! :D
@@InboundShovel that's awesome! I'll definitely wishlist it whenever you get a steam page up for it :)
I'm curious why you would need an "Unthreatened" detection area wouldn't this just be easier without the third layer? If the "unthreatened" state is active doesn't that mean the enemy is unaware of the player, wouldn't that be their natural state? I suppose if the system is using those detection areas as the triggers for when to swap states that would make sense, but couldn't you do that with the "Aware" state being either entered or exited? It feels like this could be handled by the 2 areas "Aware" and "Threatened" and have a minor boost to optimization? Maybe I'm off my rocker I'm not a programmer just a designer... So me not program gud. Haha, Either way I love these videos makes me happy to watch the process.
I am new to this channel. And I am interested right off the bat. I have a few questions:
What year will you release this game if you already know a year?
What is this game called?
Will this game be available for free or will it be paid?
Why don't you use a behaviour tree as it is exactly what you tried to implement ?
hi, I see you are using godot, any reasons why not unity (or other game engines)?
p.s. really like your content :)
Amazing content ❤
Hm… when will your game available?
Artificial Stupidity
Hey bro
Where can i learn Godot
There are a ton of great tutorials on TH-cam! I'd check out Heartbeast's stuff - as well as anything from Brackeys!
Why not just use a buncha virtual functions on your base enemy script? That way shared states and behaviors dont need to be copied into new scripts and you aren't running through 10 enemies to fix the same bug 10 times, but you can just overload as needed for 'bespoke' stuff? You can even just store behavior function names as strings in godot "array"s and use 'call' and it'll work fine as long the given enemy of type EnemyStateMachine or whatever actually has a function with that name, and if you really want to dot every i you can check that before the call and throw an error if not or revert to base.
Any community Discord server or Twitter page?
What is your game called???
Isadora's Edge!
Do you have a community discord where we can see updates and bts?
i hate godot i know it because i built pong on it and it was sufficient. i dont say its a bad engine but its really really like overcomplicating things
well seeing how anything more powerful than notepad is overcomplicated for pong...
If its that much complicated cant you just do it manually without the nodes game engine provide?
Idk i never tried game engines
Random Question. Is it meant to play like megaman zero?
Sort of! Megaman X and Hollow Knight are big inspirations, and Megaman Zero has a similar feeling!
@@InboundShovel Sick Looking forward too it!
What engine do you use?
Godot!
Where can i wishlist this game?
it's on steam now!
@@lyraisnapping cheers! :)
I don't like the way you talk, but maybe other people do, so I have no problem driving the algorithm by commenting. Good luck.
I actually liked the way he talks, it's like hes actually sharing something with the viewer instead of monotonously reading out a script and dilluting his personality with a ton of editing
@@NoVIcE_Source there it is bois-no longer a maybe.
I just find some of his affectations to be annoying.
@@Ouvii maybe keep that to yourself then. Imagine talking like this irl, maybe no one told you before but that's incredibly rude.
@@lyraisnapping thanks for the opinion, I appreciate the criticism.
I cant understand the reason for 1:04 nodes although my enemy doesnt attack it movement looks like this
extends Node3D
@onready var rootnode = get_parent()
@onready var originalposition = rootnode.position
var timer = 0
var preparetarget = rootnode
var target = rootnode
var targetname = ""
var move_speed = 5
var localizatetimer
var stop_distance_near = 0.5
var stop_distance_far = 15
func _ready():
target = rootnode
print(target)
func _on_localizateplayer_body_entered(body):
if body.name == "Player" and not target == body:
preparetarget = body
look_at(preparetarget.position)
rotation_degrees.y += 180
rotation_degrees.x = 0
$Animation.play("Taunt")
func _on_animation_animation_finished(_anim_name):
target = preparetarget
func _physics_process(delta):
if target:
if target.name == "Player":
$Animation.play("Atack")
else:
$Animation.play("Idle")
move_towards_target(delta,target)
timer += 1
if timer > 120:
timer = 0
rootnode.position = Vector3(originalposition.x+randf_range(-9,9),originalposition.y,originalposition.z+randf_range(-9,9))
func move_towards_target(delta,tarjet):
look_at(target.position)
rotation_degrees.y += 180
rotation_degrees.x = 0
var distance_to_target = global_transform.origin.distance_to(tarjet.position)
if distance_to_target < stop_distance_near:
$Animation.play("Idle")
return
if distance_to_target > stop_distance_far and not tarjet == rootnode:
target = rootnode
return
var direction = Vector3(tarjet.position.x - global_transform.origin.x, 0, tarjet.position.z - global_transform.origin.z).normalized()
var movement = direction * move_speed * delta
global_transform.origin += movement