sábado, 3 de febrero de 2024

al presionar una tecla se anima la animacion de godot3d;

 extends Node3D


# Variable para controlar si la animación está activa

var is_animating = false


# Called when the node enters the scene tree for the first time.

func _ready():

pass


# Called every frame. 'delta' is the elapsed time since the previous frame.

func _process(delta):

# Reproduce la animación al presionar la tecla "M"

if Input.is_action_pressed("ui_right"):  # Reemplaza "ui_accept" con el código de acción real de la tecla "M"

if not is_animating:

$AnimationPlayer.play("Armature|zombietictocchica|default")

is_animating = true

# Evita repetir la animación mientras se mantiene presionada la tecla

elif is_animating and not Input.is_action_pressed("ui_right"):

is_animating = false

viernes, 2 de febrero de 2024

Video donde muestro y comento con mi voz en of lo mas importante aprendido con Godot asta la fecha; instanciar, lod, memoria;

el video en godot 4.2 comentado con mi voz en of.




En el video muestro como se instancia un cubo que hace de proyectil, todo esta en la version de Godot 4.2, en la version 3.5 el tema de instanciar tiene diferencias por que parte del nodo Spatial ,que ya no existe en la version 4.2 , me volvia loco intentandolo en la version 4.2 y claro no podia por que hay diferencias, como que para empezar Spatial ya no se utiliza, tambien empiezo a mostrar intentos de gestionar la memoria con Godot, los proyectiles por ejemplo cuando dejo de presionar la tecla de disparar el proyectil se borra del juego y de la memoria, si no se hace algo que los borre, el juego se pararia porque no dejaria de dibujar los proyectiles y de consumir los recursos de la ram o la rom o de la memoria que use la targeta grafica,

Creo que con estos minimos conocimientos, ya se puede empezar a hacer algun juego divertido, porque al saber instanciar, puedes matar enemigos, cambiarles las animaciones ,al cambiar una copia del enemigo con una animacion diferente, crear explosiones, que salgan rayos de edificios destruidos, fuego de bidones , agua de depositos, humo de fuegos apagados, y al saber borrar objetos por colisiones de objetos que entran en su area3d mas de lo mismo....poco a poco ya me podre centrar mas en la parte artistica modelando y pintando mejores personajes, tambien e aprendido a hacer puertas animadas que se pueden mover por todo el escenario haciendo todas las copias que me vengan en gana....¡¡¡¡¡.viva Godot!!!!!





aqui en la version godot3.5 el video, no comento nada solo echo captura en video del estudio



otro video del tema en la version de godot 4.2 no comento nada solo es captura de video

video de encima ahorra memoria en godot, menos poligonos menos gasto de recursos de tu maquina mas fluidez y es super sencillo...........








 scripts fundamentales----------------

AVANCES MUY BUENOS



extends CharacterBody3D


const SPEED = 5.0

const JUMP_VELOCITY = 4.5

const FRICTION = 25

const HORIZONTAL_ACCELERATION = 30

const MAX_SPEED=5

# Get the gravity from the project settings to be synced with RigidBody nodes.

var gravity = ProjectSettings.get_setting("physics/3d/default_gravity")


@onready var camera = $Camera3D




func _ready():

Input.mouse_mode=Input.MOUSE_MODE_CAPTURED


func _unhandled_input(event):

if event is InputEventMouseMotion and Input.mouse_mode==Input.MOUSE_MODE_CAPTURED:

rotate_y(-event.relative.x * .005)

camera.rotate_x(-event.relative.y * .005)

camera.rotation.x = clamp(camera.rotation.x, -PI/2, PI/2)


func _unhandled_key_input(event):

if Input.is_action_just_pressed("ui_cancel"):

if Input.mouse_mode==Input.MOUSE_MODE_CAPTURED: 

Input.mouse_mode=Input.MOUSE_MODE_VISIBLE

else:

Input.mouse_mode=Input.MOUSE_MODE_CAPTURED


func _physics_process(delta):

# Add the gravity.

if not is_on_floor():

velocity.y -= gravity * delta


# Handle Jump.

if Input.is_action_just_pressed("ui_accept") and is_on_floor() and Input.mouse_mode==Input.MOUSE_MODE_CAPTURED:

velocity.y += JUMP_VELOCITY


# Get the input direction and handle the movement/deceleration.

# As good practice, you should replace UI actions with custom gameplay actions.

var input_dir = Vector3.ZERO

var movetoward = Vector3.ZERO

input_dir.x = Input.get_vector("move_left", "move_right", "move_forward", "move_backward").x

input_dir.y = Input.get_vector("move_left", "move_right", "move_forward", "move_backward").y

input_dir=input_dir.normalized()

var direction = (transform.basis * Vector3(input_dir.x, 0, input_dir.y)).normalized()

direction *= SPEED

velocity.x = move_toward(velocity.x,direction.x, HORIZONTAL_ACCELERATION * delta)

velocity.z = move_toward(velocity.z,direction.z, HORIZONTAL_ACCELERATION * delta)


var angle=5

#rotation_degrees=Vector3(input_dir.normalized().y*angle,rotation_degrees.y,-input_dir.normalized().x*angle)

var t = delta * 6

if Input.mouse_mode==Input.MOUSE_MODE_CAPTURED: 

rotation_degrees=rotation_degrees.lerp(Vector3(input_dir.normalized().y*angle,rotation_degrees.y,-input_dir.normalized().x*angle),t)

move_and_slide()

force_update_transform()



------------------- 

ABANCES MUY BUENOS

-------------------


extends Area3D



# Called when the node enters the scene tree for the first time.

func _ready():

pass # Replace with function body.



# Called every frame. 'delta' is the elapsed time since the previous frame.

func _process(delta):

pass



func _on_area_entered(area):

queue_free()


pass # Replace with function body.



-----------------------

ABANCES MUY BUENOS

-------------------------

extends RigidBody3D



func _ready():


pass # Replace with function body.


func _process(delta):


pass


translate(Vector3(55,0,0) * get_process_delta_time())



-------------------------------

ABANCERS MUY BUENOS AQUI INSTANCIA

-------------------------------

extends Area3D


var Bullet = preload("res://cubo.tscn")


func _ready():


pass # Replace with function body.



func _input(event):


if event is InputEventMouseButton:


if event.button_index == 1:


var bullet = Bullet.instantiate()



add_child(bullet)

-------------------------------------------------------------------------------

-----------------------------------------------------------------------------

-------------------------------------------------------------------------------------

extends CharacterBody3D


# Adding Animations

# ------------------------------------------------

# 1. Define Animations: Create new animations in Godot's animation tools.

# 2. Add Animation Nodes: Ensure 'AnimationPlayer' nodes exist for animated objects.

# 3. Update Parts Dictionary: In `_ready`, add new nodes to 'parts' dict, e.g., `"anim_player": $AnimationPlayer`.

# 4. Create Animation Methods: Write methods for new animations, e.g., `func perform_attack() -> void`.

# 5. Implement Animation Logic: In the methods, use `parts["anim_player"].play("your_animation_name")` to play animations.

# 6. Integrate with Existing Code: Add logic to trigger these animations (e.g., in `_input` or `_process` functions).

# 7. Test Animations: Ensure animations work as expected and integrate smoothly.

# 8. Optimize and Refine: Adjust timings, transitions, or other elements for best results.

#

# Example for Adding an Attack Animation:

# @onready var parts: Dictionary = {"head": $head, "body": $body, "anim_player": $AnimationPlayer, ...}

# func perform_attack() -> void: parts["anim_player"].play("attack_animation")

# func _input(event: InputEvent) -> void: if event is InputEventKey and event.pressed: perform_attack()

#

# Adjust steps based on your specific game needs and scenarios.



# Exported Variables

@export var sprint_enabled: bool = true

@export var crouch_enabled: bool = true

@export var base_speed: float = 5.0

@export var sprint_speed: float = 8.0

@export var jump_velocity: float = 4.0#ORIGINAL

#@export var jump_velocity: float = 0.1#MANIPULADO

@export var sensitivity: float = 0.1

@export var accel: float = 10.0

@export var crouch_speed: float = 3.0


# Member Variables

var speed: float = base_speed

var state: String = "normal"  # normal, sprinting, crouching

var gravity: float = ProjectSettings.get_setting("physics/3d/default_gravity")

var camera_fov_extents: Array[float] = [75.0, 85.0]  # index 0 is normal, index 1 is sprinting

var base_player_y_scale: float = 1.0

var crouch_player_y_scale: float = 0.75


# Node References

@onready var parts: Dictionary = {

"head": $head,

"camera": $head/camera,

"camera_animation": $head/camera/camera_animation,

"body": $body,

"collision": $collision

}

@onready var world: SceneTree = get_tree()


func _ready() -> void:

parts["camera"].current = true


func _process(delta: float) -> void:

handle_movement_input(delta)

update_camera(delta)


func _physics_process(delta: float) -> void:

apply_gravity(delta)

handle_jump()

move_character(delta)


func _input(event: InputEvent) -> void:

if event is InputEventMouseMotion:

handle_mouse_movement(event)


# Movement Logic

func handle_movement_input(delta: float) -> void:

if Input.is_action_pressed("move_sprint") and !Input.is_action_pressed("move_crouch") and sprint_enabled:

if !$crouch_roof_detect.is_colliding(): #if the player is crouching and underneath a ceiling that is too low, don't let the player stand up

enter_sprint_state(delta)

elif Input.is_action_pressed("move_crouch") and !Input.is_action_pressed("move_sprint") and crouch_enabled:

enter_crouch_state(delta)

else:

if !$crouch_roof_detect.is_colliding(): #if the player is crouching and underneath a ceiling that is too low, don't let the player stand up

enter_normal_state(delta)


func enter_sprint_state(delta: float) -> void:

state = "sprinting"

speed = sprint_speed

parts["camera"].fov = lerp(parts["camera"].fov, camera_fov_extents[1], 10 * delta)


func enter_crouch_state(delta: float) -> void:

state = "crouching"

speed = crouch_speed

apply_crouch_transform(delta)


func enter_normal_state(delta: float) -> void:

state = "normal"

speed = base_speed

reset_transforms(delta)


# Camera Logic

func update_camera(delta: float) -> void:

match state:

"sprinting":

parts["camera"].fov = lerp(parts["camera"].fov, camera_fov_extents[1], 10 * delta)

"normal":

parts["camera"].fov = lerp(parts["camera"].fov, camera_fov_extents[0], 10 * delta)


# Animation Logic

func apply_crouch_transform(delta: float) -> void:

parts["body"].scale.y = lerp(parts["body"].scale.y, crouch_player_y_scale, 10 * delta)

parts["collision"].scale.y = lerp(parts["collision"].scale.y, crouch_player_y_scale, 10 * delta)


func reset_transforms(delta: float) -> void:

parts["body"].scale.y = lerp(parts["body"].scale.y, base_player_y_scale, 10 * delta)

parts["collision"].scale.y = lerp(parts["collision"].scale.y, base_player_y_scale, 10 * delta)


# Physics Logic

func apply_gravity(delta: float) -> void:

if not is_on_floor():

velocity.y -= gravity * delta


func handle_jump() -> void:

if Input.is_action_pressed("move_jump") and is_on_floor():

velocity.y += jump_velocity


func move_character(delta: float) -> void:

var input_dir: Vector2 = Input.get_vector("move_left", "move_right", "move_forward", "move_backward")

var direction: Vector2 = input_dir.normalized().rotated(-parts["head"].rotation.y)

if is_on_floor():

velocity.x = lerp(velocity.x, direction.x * speed, accel * delta)

velocity.z = lerp(velocity.z, direction.y * speed, accel * delta)

move_and_slide()


# Input Handling

func handle_mouse_movement(event: InputEventMouseMotion) -> void:

if !world.paused:

parts["head"].rotation_degrees.y -= event.relative.x * sensitivity

parts["head"].rotation_degrees.x -= event.relative.y * sensitivity

parts["head"].rotation.x = clamp(parts["head"].rotation.x, deg_to_rad(-90), deg_to_rad(90))


miércoles, 31 de enero de 2024

Script para Godot3d 4.2 sencillisimo para instanciar un personaje cuando algo entra en el Area3d;

 extends Area3D


var Calva = preload("res://calva.tscn")


func _ready():


pass # Replace with function body.


func _on_area_entered(area):

var calva = Calva.instantiate()

add_child(calva)

pass # Replace with function body.

---------------------------------------------------------------------------------------------------------------------------
-------------------------------------------------------------------------------------------------------------------------
EXPLICACION: Dos semanas asta conseguir esto increible.......en fin , por fin consegui instanciar de diversas formas en godot3d version 4.2 , esta es muy buena para abatir enemigos y que los cambie por una copia con otra animacion o una explosion o lo que se tercie, en un area3d vacia cuando por ejemplo pasa un proyectil se instancia en este caso un personaje que tiene una animacion, tengo que seguir estudiando y trabajando, a partir de estos conocimientos no me sera complicado cambiar un enemigo vivo por uno muerto al ser impactado por una bala, y tambien podre cambiar escenas enteras espero, y jugar con camaras.............bueno hay estoy¡¡¡¡¡ (si alguien usa el script que recuerde usar el tema de "señales" de godot que elija func _on_area_entered(area):     cuando sale la flechita verde ala izquierda de la linea del script sabreis que funcionara si o si y que lo mejor para que el personaje este en la ruta correcta es que lo arrastreis el ",tscn" en este caso res://calva.tscn desde el sistema de archivos al parentesis -----var Calva = preload("res://calva.tscn")---------asi lo tengais donde lo tengais funcionara.
Aunque todo es insistir probar insistir probar y trabajar, quizas ayude alguien mis anotaciones............).

martes, 30 de enero de 2024

Usar LOOD en Godot4.2 reducir poligonos y reducir memoria para fluidez de los juegos en Godot;

Una pelicula vale mas que 1000 palabras, el sistema de LOOD o LOD sirve para reducir los poligonos que dibujan los objetos del juego, personajes, edificios, vegetacion, vehiculos, lo que sea.....cuando estas lejos pocos poligonos poca memoria necesita gana fluidez cuando estas mas cerca mas nitidez y mas poligonos, si se save jugar con la memoria de los desarrollos, importa un pimiento la que tengas en tu pc , .....claro que si puedes tener un buen pc aprobecha , pero es mas saber utilizar la maquina de la que se dispone, yo personalmente estoy muy entusiasmado con Godot quizas no es tan perfeccionista con los resultados pero, si no bas a ser profesional y trabajar para otro.....creo que no tienes nada que perder teniendo en cuenta que godot es totalmente gratuito y que encima hay posibilidares de ganar algo haciendo juegos con el, 

y ahora que empiezo a comprender el tema de instanciar objetos en las escenas con Godot4.2, me boy a poner las botas haciendo virgerias con este estupendo motor de juegos gratuito........Godot.
 

lunes, 29 de enero de 2024

instancia muy simple en godot4.2;

 extends Area3D

var Bullet = preload("res://cubo.tscn")


# Called when the node enters the scene tree for the first time.

func _ready():

pass # Replace with function body.



# Called every frame. 'delta' is the elapsed time since the previous frame.

func _process(delta):


var bullet = Bullet.instantiate()

add_child(bullet)

pass



----------------------------------------------------------------------------------------------------------

----------------------------------------------------------------------------------------------------------

extends Area3D

var Bullet = preload("res://cubo.tscn")

func _ready():

pass # Replace with function body.

func _process(delta):

var bullet = Bullet.instantiate()

add_child(bullet)

pass


----------------------------------------------------------------------------------------------------------

------------------------------------------------------------------

otra manera que funciona de instanciar en godot4.2

-------------------------------------------------------------------------------------------------------------

extends Area3D


var Bullet = preload("res://cubo.tscn")


var time = 0

var interval = 1.0  # Time interval between bullet instantiation


func _ready():

pass # Replace with function body.


func _process(delta):

time += delta


if time > interval:

time = 0


var bullet = Bullet.instantiate()

add_child(bullet)

-------------------------------------------------------------------------------------------------------------

-----------------------------------------------------------------------------------------------------------

este de debajo me falla pero creo que es por mi configuracion personalizada de teclas en godot algo que e de solucionar

--------------------------------------------------------------------------------------------------------------

extends Area3D


var Bullet = preload("res://cubo.tscn")


var pressed = false


func _ready():

pass # Replace with function body.


func _input(event):

if event is InputEventKey:

if event.scancode == KEY_SPACE:

if not pressed:

pressed = true

var bullet = Bullet.instantiate()

add_child(bullet)

---------------------------------------------------------------------------------------------------------------

---------------------------------------------------------------------------------------------------------------

otro ejemplo, con el boton izquierdo del raton me funciona por que lo e configurado desde un principio asignandole esa bariacion de entradas de teclado desde Proyecto---configuracion de proyecto-----

------------------------------------------------------------------------------------------------------

-----------------------------------------------------------------------------------------------------------------------

extends Area3D


var Bullet = preload("res://cubo.tscn")


func _ready():

pass # Replace with function body.


func _input(event):

if event is InputEventMouseButton:

if event.button_index == 1:

var bullet = Bullet.instantiate()

add_child(bullet)

------------------------------------------------------------------------------------------------------
----------------------------------------------------------------------------------------------------------
otro ejemplo al tocar un trigger
------------------------------------------------------------------------------------------------------


extends Area3D


var Bullet = preload("res://cubo.tscn")


func _ready():

    pass # Replace with function body.


func _physics_process(delta):

    # Check if the player is touching the trigger

    if $Trigger.is_colliding():

        var bullet = Bullet.instantiate()

        add_child(bullet)


--------------------------------------------------------------------------------------------------------

----------------------------------------------------------------------------------------------

este script que funciona solo aplica una fuerza para lanzar un cubo 

-----------------------------------------------------------------------------------------------------


extends RigidBody3D



# Called when the node enters the scene tree for the first time.

func _ready():

pass # Replace with function body.



# Called every frame. 'delta' is the elapsed time since the previous frame.

func _process(delta):

pass

translate(Vector3(111,0,0) * get_process_delta_time())








extends CharacterBody3D-------para godot4.2 a de tener una camara y solo es para CharacterBody3D-;

 extends CharacterBody3D


const SPEED = 5.0

const JUMP_VELOCITY = 4.5

const FRICTION = 25

const HORIZONTAL_ACCELERATION = 30

const MAX_SPEED=5

# Get the gravity from the project settings to be synced with RigidBody nodes.

var gravity = ProjectSettings.get_setting("physics/3d/default_gravity")


@onready var camera = $Camera3D




func _ready():

Input.mouse_mode=Input.MOUSE_MODE_CAPTURED


func _unhandled_input(event):

if event is InputEventMouseMotion and Input.mouse_mode==Input.MOUSE_MODE_CAPTURED:

rotate_y(-event.relative.x * .005)

camera.rotate_x(-event.relative.y * .005)

camera.rotation.x = clamp(camera.rotation.x, -PI/2, PI/2)


func _unhandled_key_input(event):

if Input.is_action_just_pressed("ui_cancel"):

if Input.mouse_mode==Input.MOUSE_MODE_CAPTURED: 

Input.mouse_mode=Input.MOUSE_MODE_VISIBLE

else:

Input.mouse_mode=Input.MOUSE_MODE_CAPTURED


func _physics_process(delta):

# Add the gravity.

if not is_on_floor():

velocity.y -= gravity * delta


# Handle Jump.

if Input.is_action_just_pressed("ui_accept") and is_on_floor() and Input.mouse_mode==Input.MOUSE_MODE_CAPTURED:

velocity.y += JUMP_VELOCITY


# Get the input direction and handle the movement/deceleration.

# As good practice, you should replace UI actions with custom gameplay actions.

var input_dir = Vector3.ZERO

var movetoward = Vector3.ZERO

input_dir.x = Input.get_vector("move_left", "move_right", "move_forward", "move_backward").x

input_dir.y = Input.get_vector("move_left", "move_right", "move_forward", "move_backward").y

input_dir=input_dir.normalized()

var direction = (transform.basis * Vector3(input_dir.x, 0, input_dir.y)).normalized()

direction *= SPEED

velocity.x = move_toward(velocity.x,direction.x, HORIZONTAL_ACCELERATION * delta)

velocity.z = move_toward(velocity.z,direction.z, HORIZONTAL_ACCELERATION * delta)


var angle=5

#rotation_degrees=Vector3(input_dir.normalized().y*angle,rotation_degrees.y,-input_dir.normalized().x*angle)

var t = delta * 6

if Input.mouse_mode==Input.MOUSE_MODE_CAPTURED: 

rotation_degrees=rotation_degrees.lerp(Vector3(input_dir.normalized().y*angle,rotation_degrees.y,-input_dir.normalized().x*angle),t)

move_and_slide()

force_update_transform()


Script para Godot version3.5 mover un objeto con teclas;

 extends RigidBody


var velocity = Vector3()


func _physics_process(delta):

# Obtener la velocidad actual del RigidBody

velocity = get_linear_velocity()


# Ajustar la velocidad según las teclas presionadas

if Input.is_action_pressed("ui_left"):

velocity.x -= 1

if Input.is_action_pressed("ui_right"):

velocity.x += 1

if Input.is_action_pressed("ui_up"):

velocity.y += 1

if Input.is_action_pressed("ui_down"):

velocity.y -= 1


# Aplicar la nueva velocidad al RigidBody

set_linear_velocity(velocity)

-----------------------------------------------------------------------

otra forma

---------------------------------------------------------------------------------

extends RigidBody


var velocity = Vector2()


func _physics_process(delta):

# Obtener la velocidad actual del RigidBody

velocity = get_linear_velocity()


# Ajustar la velocidad según las teclas presionadas

if Input.is_action_pressed("ui_left"):

velocity.x -= 10 * delta

if Input.is_action_pressed("ui_right"):

velocity.x += 10 * delta

if Input.is_action_pressed("ui_up"):

velocity.y += 10 * delta

if Input.is_action_pressed("ui_down"):

velocity.y -= 10 * delta


# Aplicar la nueva velocidad al RigidBody

set_linear_velocity(velocity)

----------------------------------------------------------------------------------------------------------------------
otra combinacion

------------------------------------------------------------------------------------------------------------------

extends RigidBody




var velocity = Vector2()



func _physics_process(delta):

# Obtener la velocidad actual del RigidBody

velocity = get_linear_velocity()



# Ajustar la velocidad según las teclas presionadas

if Input.is_action_pressed("ui_left"):

velocity.x -= 10 * delta

if Input.is_action_pressed("ui_right"):

velocity.x += 10 * delta

if Input.is_action_pressed("ui_up"):

velocity.z -= 10 * delta

if Input.is_action_pressed("ui_down"):

velocity.z += 10 * delta



# Aplicar la nueva velocidad al RigidBody

set_linear_velocity(velocity)




------------------------------------------------------------------------------------------------------------
otra version alante atras izquierda derecha suve y baja
------------------------------------------------------------------------------------------------------
extends RigidBody




var velocity = Vector2()



func _physics_process(delta):

# Obtener la velocidad actual del RigidBody

velocity = get_linear_velocity()



# Ajustar la velocidad según las teclas presionadas

if Input.is_action_pressed("ui_left"):

velocity.x -= 10 * delta

if Input.is_action_pressed("ui_right"):

velocity.x += 10 * delta

if Input.is_action_pressed("ui_up"):

velocity.z -= 10 * delta

if Input.is_action_pressed("ui_down"):

velocity.z += 10 * delta



if Input.is_action_pressed("ui_accept"):
velocity.y += 10 * delta
if Input.is_action_just_pressed("ui_end"):
velocity.y -= 20 * delta






# Aplicar la nueva velocidad al RigidBody

set_linear_velocity(velocity)


-------------------------------------------------------------
otra girando sobre si mismo una parte
-------------------------------------------------------------------------------

extends RigidBody




var velocity = Vector2()



func _physics_process(delta):

# Obtener la velocidad actual del RigidBody

velocity = get_linear_velocity()



# Ajustar la velocidad según las teclas presionadas

if Input.is_action_pressed("ui_left"):
   rotate_y(-10 * delta)
#velocity.x -= 10 * delta

if Input.is_action_pressed("ui_right"):

velocity.x += 10 * delta

if Input.is_action_pressed("ui_up"):

velocity.z -= 10 * delta

if Input.is_action_pressed("ui_down"):

velocity.z += 10 * delta



if Input.is_action_pressed("ui_accept"):
velocity.y += 10 * delta
if Input.is_action_just_pressed("ui_end"):
velocity.y -= 20 * delta






# Aplicar la nueva velocidad al RigidBody

set_linear_velocity(velocity)