Ow WOW GODIT is awesome and the tutorial is perfect.
@Mrsomfingblock2 күн бұрын
thanks so much, this helped me so much : )
@LtsVapor2 күн бұрын
this is my first game in godot and its been really helpful teaching me all the basics im sure ill forget the complicated stuff but I think this is gonna give me a good starting point so thank you
@dgc74192 күн бұрын
thanks again! top teacher!
@dgc74192 күн бұрын
thank you! u rock
@EvilCrash30003 күн бұрын
41:45 when my enemy touches a wall, the game crashes and it shows me this error in godot: "Cannot call method 'as_relative' on a null value."
@Gongikong4 күн бұрын
u are making the generation smart
@thesquirrelchase-exploreph56354 күн бұрын
Phenomenal series!
@langsor5 күн бұрын
Thank you. I'm really enjoying this tutorial series. I just finished a 2D tutorial by "Brackeys" (recommended). In his he said that the `_process` function ran as fast as the computer would allow and is for onscreen animation. Here you can use `delta` to create steady movements. Then `_physics_process` runs at 60 fps consistently. As a complete noob to video game development I can't say if that is correct, but thought it worth a mention.
@Charon385 күн бұрын
Thanks! I noticed that "the `_process` function ran as fast as the computer would allow and is for onscreen animation" part. But I didn't know the solution. It worked for me thank you :).
@langsor4 күн бұрын
@@Charon38 Awesome! Glad I could be of help. Godot seems like it has a great community and it feels good to start being a part of that.
@NextToMe1991Dev5 күн бұрын
thx sifuu!
@PeterSkye6 күн бұрын
Great video, but please, could you share blend file with the blocks because me as a blender 3D artist, I already know this stuff and would like to focus on next Godot lessons instead.
@sykojme6 күн бұрын
Thanks
@BornCG6 күн бұрын
Thank you! 🤩
@Necrincito7 күн бұрын
Hello, I want that when interacting with a monster, when pressing the button (_si_button) of the DialogScreen script, being in the world, the function called _on_si_presionado() is activated, in short it is an interaction with a dialogue in a monster in the world and I want to activate the function of another scene from a button, how can I do it?
@Necrincito7 күн бұрын
script (ui)(script in node child,) scene parent node name (name batallas res://Escenas/batallas/batallas.tscn) extends Control var picapica_activado : bool = false var picapica_instanciada : Node = null @onready var picapica = preload("res://Escenas/ParaEquipo/pika_icon.tscn") # Preload de la escena con la animación @onready var posiciones = [ Vector2(350, 45), Vector2(350, 132), Vector2(350, 220), Vector2(350, 308), Vector2(350, 397), Vector2(350, 483) ] var animaciones_instanciadas = [] func _ready(): instanciar_animacion() func _on_si_presionado() -> void: print("Activando animación") instanciar_animacion(true) # Activar la animación func instanciar_animacion(activar: bool = false): picapica_activado = true print("verdad") if activar and picapica_activado: # Verificamos si picapica está activado for posicion in posiciones: var libre = true for anim in animaciones_instanciadas: if anim.position == posicion: libre = false break if libre: picapica_instanciada = picapica.instantiate() # Instanciamos la animación picapica_instanciada.position = posicion # Colocamos la animación en la posición libre cambiar.add_child(picapica_instanciada) # Añadimos la animación al nodo Cambiar picapica_instanciada.scale = Vector2(1.5, 1.5) animaciones_instanciadas.append(picapica_instanciada) # Agregamos la animación a la lista break # Salimos del ciclo ya que hemos colocado la animación actualizar_visibilidad() func actualizar_visibilidad(): for i in range(posiciones.size()): var posicion = posiciones[i] if hay_animacion_en_posicion(posicion): mostrar_nodos_vida(i + 1) # Mostrar los nodos correspondientes mostrar_boton_posicion(i + 1) # Mostrar el botón correspondiente else: ocultar_nodos_vida(i + 1) # Ocultar los nodos si no hay animación ocultar_boton_posicion(i + 1) # Ocultar el botón correspondiente si no hay animación func hay_animacion_en_posicion(posicion: Vector2) -> bool: for anim in animaciones_instanciadas: if anim.position == posicion: return true return false
@Necrincito7 күн бұрын
script DialogScreen(is dialog) extends Control class_name DialogScreen var _step: float = 0.05 var _id: int = 0 var data: Dictionary = {} @export_category("Objects") @export var _name: Label = null @export var _dialog: RichTextLabel = null @export var _faceset: TextureRect = null @export var jugador_0: Node = null # Referencia al nodo del jugador @export var pikachu_1: Node = null # Referencia al nodo de pikachu_1 @export var _si_button: Button = null # Referencia al botón "Sí" @export var _no_button: Button = null # Referencia al botón "No" var _is_interacting: bool = false var show_buttons: bool = false # Controla la visibilidad de los botones func _ready() -> void: _initialize_dialog() _is_interacting = false # Inicialmente no está interactuando _si_button.visible = false # Ocultar los botones inicialmente _no_button.visible = false # Ocultar los botones inicialmente # Conectar el botón "Sí" para que active la animación de picapica _si_button.connect("pressed", Callable(self, "_on_si_pressed")) # Conectar el botón "No" para que cierre el diálogo _no_button.connect("pressed", Callable(self, "_on_no_pressed")) func _process(_delta: float) -> void: # Verificar si el jugador está cerca de pikachu_1 if jugador_0.global_position.distance_to(pikachu_1.global_position) < 25.0: # Ajusta la distancia según lo necesario if Input.is_action_just_pressed("ui_accept") and not _is_interacting: _is_interacting = true _initialize_dialog() else: _is_interacting = false if Input.is_action_pressed("ui_end") and _dialog.visible_ratio < 1: _step = 0.01 return _step = 0.05 if Input.is_action_just_pressed("ui_end"): _id += 1 if _id == data.size(): queue_free() return _initialize_dialog() func _initialize_dialog() -> void: if _id < data.size(): _name.text = data[_id]["title"] _dialog.text = data[_id]["dialog"] _faceset.texture = load(data[_id]["faceset"]) # Control de visibilidad de los botones if data[_id]["dialog"] == "¿Quieres añadir a este pokemon?": $No.grab_focus() _si_button.visible = true _no_button.visible = true show_buttons = true else: _si_button.visible = false _no_button.visible = false show_buttons = false _dialog.visible_characters = 0 while _dialog.visible_ratio < 1: await get_tree().create_timer(_step).timeout _dialog.visible_characters += 1 pass func _on_si_pressed() -> void: _on_no_pressed() # Esto cierra el diálogo si no se activa picapica # Función que se llama cuando el botón "No" es presionado (cierra el diálogo) func _on_no_pressed() -> void: # Aquí cerramos el diálogo, eliminamos los botones y ocultamos el texto _si_button.visible = false _no_button.visible = false _dialog.text = "" # Opcional: limpia el texto del diálogo _name.text = "" # Opcional: limpia el título _faceset.texture = null # Opcional: borra la cara # Oculta el diálogo y termina la interacción _is_interacting = false queue_free() # Cierra la escena o el diálogo, según lo que prefieras
@Necrincito7 күн бұрын
script mundo_salvaje_1 (is world:script in world intermediary dialog HUD in world: is canvasLayer ) extends Node2D class_name mundo_salvaje_1 const _DIALOG_SCREEN: PackedScene = preload("res://Escenas/Dialogos/dialog_screen.tscn") var _dialog_data: Dictionary = { 0: { "faceset": "res://Recursos/Imagenes/Sprites/Interface/Objetos/pokeIcon_1.png", "dialog": "Este pokemon es amigable", "title": "Poke Wild:" }, 1: { "faceset": "res://Recursos/Imagenes/Sprites/Interface/Objetos/pokeIcon_1.png", "dialog": "¿Quieres añadir a este pokemon?", "title": "Poke Wild:" } } @export_category("Objects") @export var _hud: CanvasLayer = null @export var jugador_0: Node = null # Referencia al jugador @export var pikachu_1: Node = null # Referencia a pikachu_1 var _is_interacting: bool = false # Para controlar si la interacción ya está activa func _process(_delta: float) -> void: # Verificar si el jugador está cerca de pikachu_1 if jugador_0.global_position.distance_to(pikachu_1.global_position) < 25.0: # Ajusta la distancia según sea necesario # Si el jugador está cerca y presiona "ui_accept", se inicia la interacción if Input.is_action_just_pressed("ui_accept") and not _is_interacting: _is_interacting = true _start_dialog() else: _is_interacting = false # Si el jugador se aleja, resetear la interacción func _start_dialog() -> void: var _new_dialog: DialogScreen = _DIALOG_SCREEN.instantiate() _new_dialog.data = _dialog_data # Asignar los datos del diálogo _hud.add_child(_new_dialog) # Agregar la pantalla de diálogo al HUD
@adrianh.59397 күн бұрын
Couple extra things, the limited dissolve on the text > mesh $ sign leaves a looooot of cleanup as a warning, also the boolean union leaves the internal faces and edges that you still need to delete. Great tutorial!
@yuktirajshirkande-b7v7 күн бұрын
HI 😊
@Atri48 күн бұрын
ty legend
@TheTyrori8 күн бұрын
shift+d to duplicate just straight up does not work this way in blender 4. the only way i could actually get it to duplicate the ramp and have it show up in the scene selection was to manually copy and paste the ramp in there.
@KungFu-x1j9 күн бұрын
Probably best Godot tutorial series on the internet
@YuZhang-k5j9 күн бұрын
谢谢!
@BornCG5 күн бұрын
😍 thank you!!
@theravenpirate474410 күн бұрын
still using this in 2025
@xSpexz10 күн бұрын
My character keeps falling trough the ramp top, what do i do?
@mauvelilac0810 күн бұрын
This is good if you'd only make a game about memory match but if its alongside other scenes of games inside one game it isn't because when i play other scenes other than the memory game it results into an error. I can't even play the menu scene.
@mauvelilac087 күн бұрын
Oh wait I fixed it. Guess I just need to integrate the part two in my modified script
@TheTyrori10 күн бұрын
Works like a charm! Glad to have these tutorials when others I've started just pre-suppose that I know all of these things.... That said, I couldn't get the anti-aliasing to work very well. The SCR actually looked worse even with SCR AA and regular AA at x8! I don't know what's up with that.
@GuyFunniGD11 күн бұрын
are you thinking of ever adding bosses / worlds to the game?
@BornCG11 күн бұрын
That's a good idea! ...But I'm sticking to level basics and how to publish, which is still a huge undertaking. This series/course I recorded in the summer of 2023, and I've been generally finished editing them as I go, and have been publishing them every 3-4 weeks, so I fear dragging out the series too long. 🫠🙃
@rremnar12 күн бұрын
@32:34, there is no bug in Godot with your enemy not turning. The bug in is in your code. direction is zero'd out. So it does nothing. To fix, direction.x = dir.x * -1.0. I think you were expecting direction to change during the await, but it can't change unless a value is added, or directly assigned. Anything multiplied by 0 is still 0. (I see you already caught your mistake, and you are right about checking the state during turning, using a boolean. I"ve had to do this for other things too.) I'm sorry for the all the posts; and I am no expert, but please stop coding like you're new. At least suggest to make GDScript typed, so you declare types for all your variables. This will execute code faster, and help prevent some user errors. Also, don't be lazy when typing out values. Vector3(1, 0, 0) Is lazy and slow; because Godot has to convert those integers to floats. We aren't using Vector3i, so type it out fully Vector3(1.0, 0.0, 0.0). Also you can use short cuts. For example, instead of what I typed, you could use Vector3.LEFT, which is a constant with the same values. Read the documentation. I've been told this so many times as well. lol Ugh, in your tween function, you don't have to fully type out the Vector3 if you are only changes one of its properties: turn_tween.tween_property(self, "rotation_degrees:y", 180.0, 0.6) To access a property within a property, such as x, y, z in a Vector3, you use a colon as shown above.
@jakubolszewski807912 күн бұрын
Oh my god, you are my saviour (not on time but still). I recently participated in a gamejam, where I had problem with modifying exported glb files. I was doing so many things to make them editable and here you are with copying and pasting them to another node. I'm really thankful for that video.
@rremnar12 күн бұрын
You didn't have to create a new scene. You could have moved the nodes below the 2nd Node3D object to the first one. Delete the 2nd Node3D, then change the type of the first to a character body 3D, then save it as a new scene. But I agree that it seems kind of silly having to create an aditional scene from the inherited scene, just to force the children to be editable. Maybe I missed something, but can't you make them local from the original inherited scene?
@adithyaaganapathy850612 күн бұрын
Need a help ? can you just teach us how to use procedural generation in 3d for endless runner game with models which are in blender. The pre-build modes should randomly generate
@rremnar12 күн бұрын
You always need to triangulate your meshes, before exporting to any game engine. I don't know what game engine allows "N" gons; I assume none do. You can triangulate by 2 means: The first one is to go into edit mode, press 3 for faces, then A for selecting all. Then right click the mesh, and there should be a triangulate function in the list. The other method is to add a generative modifier, called "Triangulate" which gives you a bit more control. Make sure to set "Apply Modifiers" to on, in the gltf export settings.
@Cr1cks013 күн бұрын
ЛЕГЕНДА ВЕРНУЛАСЬ
@jayrockkz0313 күн бұрын
Hey can you make a tutorial on how to code an enemy that follows the player?
@pennyblush9813 күн бұрын
I'm having an issue with the camera, whereby following your steps exactly in Godot 4.3, it will not translate nor rotate with the character model as you show in the 11th tutorial when you turn Steve around to have him face the level. Whether I might have gone wrong somewhere or if it's just an issue of the code between versions, some clarification on this issue would be nice. I'm aware a lot of the code, project templating, and modeling you do is for tutorialising and not strictly what we should follow when we make games, I just want to make sure I am doing this right. Thank you in advance.
@jynus13 күн бұрын
Small correction. await behaviour is the expected one. In order to "pause" the main loop excution, however, you would have to add await when *calling* the function, in addition to on the signal. It is not a Godot bug. However, your solution is not a bad one, handling async calls can become quite complicated, so a state-based design (using variables) can make thing clearer and easier to debug- specially if later more waits are needed.
@computervision55712 күн бұрын
Agree, state machine works very well for game, before I try to study game development, I never feel I need a state machine
@computervision55713 күн бұрын
Thanks a lot, learning a lot of things in order to create a HD-2D game
@ShadowRealmDrifter14 күн бұрын
Saving sanity and lives. I'm so new to this, it's not even funny. I came here to learn how to cut things in half and seperate them but learned how to set origin to geometry as well. I've wasted days fighting off center origins but had no idea even what to call them let alone how to fix them. Thank you so much.
@BornCG14 күн бұрын
Thanks for joining us! My apologies for making this video like one month before the next version of blender came out that changed all of the keyboard shortcuts you use once you’re using the knife tool. 😵💫
@ShadowRealmDrifter14 күн бұрын
@BornCG no worries, I had to give up on the knife tool for what I needed anyway. Complex geometry seems to give it a problem or I'm just not understanding it. I'm having to take 3d printer files and convert them to stl to work on them in a dimensional capacity. It's been rough.
@LereveurSVP14 күн бұрын
I haven't started the video yet, I'm already waiting for the next part.
@taragbbcy707114 күн бұрын
I am fucked
@akuma833414 күн бұрын
It's been so long bro 😭😭😭
@TonyIsCool4514 күн бұрын
HE'S BACK!!!!
@BornCG14 күн бұрын
I'm 25 minutes late, but here's the Enemy download link! (also in the description): borncg.itch.io/3d-platformer-gumdrop-enemy
@Duckz4bucks14 күн бұрын
THE GOAT HAS RETURNED
@TheTyrori14 күн бұрын
Something here just does not translate to blender 4 quite right. Following this verbatim short of the exact font (tested with multiple, same results) gets some really nasty results when you apply that boolean modifier. A whole lot of ugly triangular surfaces dig into the area around the dollar sign and some vertices are still visible on the sign itself.
@VansPebble14 күн бұрын
So far I have released my own game, added a custom playermodel, main menu screen with a level select and different songs for the different levels.
@anotherone40715 күн бұрын
At time 13:49 there is an expanded menu for the extrusion tool. I currently have blender 4.2.3 and dont have that expanded menu available. noob here. anyone know how to get that expanded menu?
@mehdiip15 күн бұрын
😅😅😅 nice . thank u so much
@TheEugevanz15 күн бұрын
Beautiful!! My "cup" model will never be the same again
@elitebutunspecial15 күн бұрын
I ran into a problem with the folder. Managed to complete the model but when I tried to export the file, my Godot project file would not show up. I'm a bit at a dead end here.