I made a BIG mistake with my indie game
HTML-код
- Опубликовано: 4 июл 2024
- 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 ===
SoundCloud: / insandio
RUclips: ruclips.net/channel/UCCOw...
=== ATTRIBUTIONS ===
Music used in the background is from the incredibly talented Low Frequency Music!
Song: 'Good Day' - www.youtube.com/watch?v=lMhoy...
RUclips Channel: ruclips.net/channel/UC831...
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 Игры
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!
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!
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!
GOD DAMN your pixel art looks great. i cant wait to play!
Thank you so much!
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
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
Looking forward to the full-length Isadora rap on the OST
Ayy, Chim on the beat
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!)
Great work!
As an aspiring game dev, your style and tips are insanely helpfull, keep up the good stuff.
Thanks, will do!
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!
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!
Recently found your channel and immediately interested :].
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
What engine do you use?
Godot!
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.
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