martes, 1 de julio de 2025

Instanciar en Godot 4.4 con botones del mouse izquierdo y derecho y con letra "R" usando accion PATADAMEDIA;GOLPES REPETITIVOS CONSTANTES ASTA SOLTAR TECLA Y O BOTONES DEL MOUSE;

 extends Area3D


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


func _input(event):

# Instanciar al presionar el botón izquierdo del ratón

if event is InputEventMouseButton:

if event.button_index == MOUSE_BUTTON_LEFT and event.pressed:

# Retrasar la instanciación del proyectil

await get_tree().create_timer(0.5).timeout

var bullet = Bullet.instantiate()

add_child(bullet)

# Instanciar al presionar el botón derecho del ratón

if event.button_index == MOUSE_BUTTON_RIGHT and event.pressed:

await get_tree().create_timer(0.5).timeout

var bullet = Bullet.instantiate()

add_child(bullet)

# Instanciar al presionar la tecla "R" (usando la acción "PATADAMEDIA")

# ¡Asegúrate de que "PATADAMEDIA" esté configurada **exactamente así** en Project Settings -> Input Map para la tecla R!

if event.is_action_pressed("PATADAMEDIA"): 

await get_tree().create_timer(1.15).timeout

var bullet = Bullet.instantiate()

add_child(bullet)


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

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

Explicacion: en mi nuevo videojuego e conseguido fluidez en animaciones y asignar al teclado varias acciones de golpear enemigos..........





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

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

MEJORA AMPLIACION DEL GDSCRIPT:

EXPLICACION: GOLPES REPETITIVOS CONSTANTES ASTA SOLTAR TECLA Y O BOTONES DEL MOUSE


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

extends Area3D


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


# --- Banderas de estado para los botones del ratón ---

var is_mouse_left_pressed: bool = false

var is_mouse_right_pressed: bool = false

# Para la tecla R, no necesitamos una bandera 'is_pressed' separada en _input,

# ya que su estado se maneja directamente con la acción en _process.


# --- Variables de control para los cooldowns (TIEMPOS DE RECARGA UNIFICADOS) ---

# Cooldown general para la acción de disparo / instanciación

var fire_cooldown: float = 0.5 # 0.5 segundos entre disparos para ratón y 'R'


# Banderas para controlar si cada acción puede disparar (está fuera de cooldown)

var can_fire_left_mouse: bool = true

var can_fire_right_mouse: bool = true

var can_fire_patadamedia: bool = true # Para la tecla 'R'



# --- Nodos Timer (creados y gestionados en _ready) ---

var left_mouse_timer: Timer

var right_mouse_timer: Timer

var patadamedia_timer: Timer



func _ready() -> void:

# --- Inicialización de temporizadores para los botones del ratón ---

# Temporizador para el botón izquierdo del ratón

left_mouse_timer = Timer.new()

add_child(left_mouse_timer)

left_mouse_timer.wait_time = fire_cooldown

left_mouse_timer.one_shot = true

left_mouse_timer.timeout.connect(func(): can_fire_left_mouse = true) # Resetea el cooldown


# Temporizador para el botón derecho del ratón

right_mouse_timer = Timer.new()

add_child(right_mouse_timer)

right_mouse_timer.wait_time = fire_cooldown

right_mouse_timer.one_shot = true

right_mouse_timer.timeout.connect(func(): can_fire_right_mouse = true) # Resetea el cooldown


# --- Inicialización del temporizador para la acción 'PATADAMEDIA' (Tecla R) ---

patadamedia_timer = Timer.new()

add_child(patadamedia_timer)

patadamedia_timer.wait_time = fire_cooldown # ¡Usa el mismo cooldown!

patadamedia_timer.one_shot = true

patadamedia_timer.timeout.connect(func(): can_fire_patadamedia = true) # Resetea el cooldown



func _input(event: InputEvent) -> void:

# --- Lógica para actualizar el estado de los botones del ratón (rápida y sin awaits) ---

if event is InputEventMouseButton:

# Botón Izquierdo

if event.button_index == MOUSE_BUTTON_LEFT:

is_mouse_left_pressed = event.pressed # True si se presiona, False si se suelta

# Botón Derecho

if event.button_index == MOUSE_BUTTON_RIGHT:

is_mouse_right_pressed = event.pressed # True si se presiona, False si se suelta

# --- La tecla "R" (PATADAMEDIA) ya no necesita await aquí.

# Su lógica de instanciación se moverá completamente a _process.

# Esto es para asegurar que todas las acciones de disparo continuo se gestionen de forma similar.



func _process(delta: float) -> void:

# --- Lógica de Disparo/Instanciación para el Botón Izquierdo del Ratón ---

if is_mouse_left_pressed and can_fire_left_mouse:

can_fire_left_mouse = false # Pone el cooldown

instantiate_bullet()        # Llama a la función unificada de instanciación

left_mouse_timer.start()    # Inicia el temporizador de cooldown

# --- Lógica de Disparo/Instanciación para el Botón Derecho del Ratón ---

if is_mouse_right_pressed and can_fire_right_mouse:

can_fire_right_mouse = false # Pone el cooldown

instantiate_bullet()         # Llama a la función unificada de instanciación

right_mouse_timer.start()    # Inicia el temporizador de cooldown


# --- Lógica de Disparo/Instanciación para la acción "PATADAMEDIA" (Tecla R) ---

# is_action_pressed se usa aquí para detectar si la tecla R está siendo MANTENIDA.

# Si la quieres solo al "golpe" inicial y luego cooldown, usarías is_action_just_pressed.

# Para "automático al mantener", is_action_pressed es correcto.

if Input.is_action_pressed("PATADAMEDIA") and can_fire_patadamedia:

can_fire_patadamedia = false # Pone el cooldown

instantiate_bullet()         # Llama a la función unificada de instanciación

patadamedia_timer.start()    # Inicia el temporizador de cooldown



# --- Función unificada para instanciar la bala ---

func instantiate_bullet() -> void:

var bullet = Bullet.instantiate()

# Aquí podrías ajustar la posición de la bala si es necesario,

# por ejemplo: bullet.global_transform.origin = global_transform.origin + Vector3(0, 0, -2)

add_child(bullet)




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

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

EXPLICACION; PERSONALIZA CADA TIEMPO DE CADA GOLPE DIFERENTE....

PATADA  PUÑETAZO IZQUIERDO PUÑETAZO DERECHO TODO PERSONALIZADO.......

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

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

extends Area3D


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


# --- Banderas de estado para los botones del ratón ---

var is_mouse_left_pressed: bool = false

var is_mouse_right_pressed: bool = false


# --- Variables de control para los cooldowns (TIEMPOS DE RECARGA PERSONALIZADOS) ---

# Cooldown para el botón izquierdo del ratón

var left_mouse_fire_cooldown: float = 1.9 

# Cooldown para el botón derecho del ratón

var right_mouse_fire_cooldown: float = 0.4 

# Cooldown para la acción "PATADAMEDIA" (Tecla R)

var patadamedia_fire_cooldown: float = 1.7


# Banderas para controlar si cada acción puede disparar (está fuera de cooldown)

var can_fire_left_mouse: bool = true

var can_fire_right_mouse: bool = true

var can_fire_patadamedia: bool = true # Para la tecla 'R'



# --- Nodos Timer (creados y gestionados en _ready) ---

var left_mouse_timer: Timer

var right_mouse_timer: Timer

var patadamedia_timer: Timer



func _ready() -> void:

# --- Inicialización de temporizadores para los botones del ratón ---

# Temporizador para el botón izquierdo del ratón

left_mouse_timer = Timer.new()

add_child(left_mouse_timer)

left_mouse_timer.wait_time = left_mouse_fire_cooldown # ¡Ahora usa su propio cooldown!

left_mouse_timer.one_shot = true

left_mouse_timer.timeout.connect(func(): can_fire_left_mouse = true) # Resetea el cooldown


# Temporizador para el botón derecho del ratón

right_mouse_timer = Timer.new()

add_child(right_mouse_timer)

right_mouse_timer.wait_time = right_mouse_fire_cooldown # ¡Ahora usa su propio cooldown!

right_mouse_timer.one_shot = true

right_mouse_timer.timeout.connect(func(): can_fire_right_mouse = true) # Resetea el cooldown


# --- Inicialización del temporizador para la acción 'PATADAMEDIA' (Tecla R) ---

patadamedia_timer = Timer.new()

add_child(patadamedia_timer)

patadamedia_timer.wait_time = patadamedia_fire_cooldown # ¡Ahora usa su propio cooldown!

patadamedia_timer.one_shot = true

patadamedia_timer.timeout.connect(func(): can_fire_patadamedia = true) # Resetea el cooldown



func _input(event: InputEvent) -> void:

# --- Lógica para actualizar el estado de los botones del ratón (rápida y sin awaits) ---

if event is InputEventMouseButton:

# Botón Izquierdo

if event.button_index == MOUSE_BUTTON_LEFT:

is_mouse_left_pressed = event.pressed # True si se presiona, False si se suelta

# Botón Derecho

if event.button_index == MOUSE_BUTTON_RIGHT:

is_mouse_right_pressed = event.pressed # True si se presiona, False si se suelta

# La tecla "R" (PATADAMEDIA) no necesita await aquí.

# Su lógica de instanciación se gestiona completamente en _process.



func _process(delta: float) -> void:

# --- Lógica de Disparo/Instanciación para el Botón Izquierdo del Ratón ---

if is_mouse_left_pressed and can_fire_left_mouse:

can_fire_left_mouse = false # Pone el cooldown

instantiate_bullet()        # Llama a la función unificada de instanciación

left_mouse_timer.start()    # Inicia el temporizador de cooldown

# --- Lógica de Disparo/Instanciación para el Botón Derecho del Ratón ---

if is_mouse_right_pressed and can_fire_right_mouse:

can_fire_right_mouse = false # Pone el cooldown

instantiate_bullet()         # Llama a la función unificada de instanciación

right_mouse_timer.start()    # Inicia el temporizador de cooldown


# --- Lógica de Disparo/Instanciación para la acción "PATADAMEDIA" (Tecla R) ---

if Input.is_action_pressed("PATADAMEDIA") and can_fire_patadamedia:

can_fire_patadamedia = false # Pone el cooldown

instantiate_bullet()         # Llama a la función unificada de instanciación

patadamedia_timer.start()    # Inicia el temporizador de cooldown



# --- Función unificada para instanciar la bala ---

func instantiate_bullet() -> void:

var bullet = Bullet.instantiate()

# Aquí podrías ajustar la posición de la bala si es necesario,

# por ejemplo: bullet.global_transform.origin = global_transform.origin + Vector3(0, 0, -2)

add_child(bullet)

No hay comentarios:

Publicar un comentario