En el video podeis ver un cañon que muevo por el escenario para godot 4.2 en 3d.
Se trata de moverlo con las teclas flechas , de girarlo con -A- y con -D- que salte al presionar espacio. Y que apunte girando en eje X presionando teclas -z- y tecla -x-.
Tenia un fallo que e conseguido corregir y era que al girar el cañon a izquierda o a derecha y presionar a la vez teclas -z- o -x- el cañon se torcia de una forma muy extraña y terminaba arrastrandose por el suelo o girando al reves.
Entoces y tras muchas pruebas y consultas tambien a una IA, e dividido el cañon en dos partes, una base que es la que lo mueve hacia adelante hacia atrás hacia izquierda y hacia derecha, que contiene un script propio que solo hace eso,
Y sobre la base esta el cañon que tiene un script para el solo que no interviene en la base principal que sirve solo para girar de izquierda a derecha y para inclinar y apuntar arriba y abajo.
En el padre (la base) que es un Characterbody3d esta este script:
extends CharacterBody3D
var rotate_speed = 10.1 # Rotation speed
const SPEED = 5.0 # Movement speed
const JUMP_VELOCITY = 14.5 # Jump velocity
var gravity = ProjectSettings.get_setting("physics/3d/default_gravity")
func _ready():
# Replace with function body
pass
func _physics_process(delta):
if not is_on_floor():
velocity.y -= gravity * delta # Apply gravity
if Input.is_action_just_pressed("ui_accept") and is_on_floor():
velocity.y = JUMP_VELOCITY # Jump
var input_dir = Input.get_vector("ui_left", "ui_right", "ui_up", "ui_down") # Get input direction
var direction = (transform.basis * Vector3(input_dir.x, 0, input_dir.y)).normalized()
if direction:
velocity.x = direction.x * SPEED # Move in X direction
velocity.z = direction.z * SPEED # Move in Z direction
else:
velocity.x = move_toward(velocity.x, 0, SPEED) # Stop horizontal movement
velocity.z = move_toward(velocity.z, 0, SPEED) # Stop vertical movement
move_and_slide() # Apply movement and collisions
var movimiento_vector = Vector3.ZERO # Initialize movement vector
if Input.is_action_pressed("A"): # Move forward
rotate_x(0.01) # Rotate on X axis (negative for down)
elif Input.is_action_pressed("B"): # Move backward
rotate_x(-0.01) # Rotate on X axis (positive for up)
elif Input.is_action_pressed("move_left"):
rotate_y(0.01) # Rotate on Z axis (positive for left)
elif Input.is_action_pressed("move_right"):
rotate_y(-0.01) # Rotate on Z axis (negative for right)
func _unhandled_input(event):
if event is InputEventKey and event.pressed:
if event.keycode == KEY_W:
translate(Vector3(0, 100, 0) * get_process_delta_time()) # Temporary movement (consider physics)
Ahora sobre esa base como hijo en el Area3D esta el siguiente script:
extends Area3D
var Bullet = preload("res://PROYECTIL.tscn")
func _ready():
pass # Replace with function body.
func _input(event):
if event is InputEventMouseButton:
if event.button_index == 1 and event.pressed :
#event.button_index == MOUSE_BUTTON_LEFT and event.pressed:
var bullet = Bullet.instantiate()
add_child(bullet)
func _unhandled_input(event):
if event is InputEventKey and event.pressed:
if event.keycode == KEY_W:
translate(Vector3(0, 0, 0) * get_process_delta_time()) # Temporary movement (consider physics)
#if event.keycode == KEY_
#apply_impulse(Vector3(0,40,4))#ORIGINAL
if event.keycode == KEY_Z:
rotate_x(0.02)
#pass
if event.keycode == KEY_X:
rotate_x(-0.02)
#pass
---------------------------------------------------------------------------------------------------------------------
---------------------------------------------------------------------------------------------------------------------
notas aclaratorias: este script contiene tambien la instaciacion de los proyectiles.
En resumen mirar el video y obserbar la disposicion de los elementos que componen el cañon la camara etc, etc, y la situacion de cada script en cada elemento, y creo que puede serle util a alguien.