Появившиеся пули в Годо ориентированы неправильно - PullRequest
0 голосов
/ 07 марта 2020

Я пытаюсь заставить игрока стрелять пулями

Дело в том, что они не указывают в том же направлении, что и игрок

Они также не следуют за игроком как они перемещаются вокруг

кода для пули

Я храню объект, который выстрелил в пулю, чтобы пуля могла дать ответный сигнал, если она попала в что-то

extends KinematicBody

var time = 0
var speed = 1800
var velocity = Vector3()
var collision = NAN
# stores the object that shot it
var shooter = NAN


func start(own):
    shooter = own
    # TODO Finish
    global_transform.basis = own.global_transform.basis
    velocity = own.global_transform.basis.z * speed + own.velocity

func _process(delta):
    collision = move_and_collide(velocity * delta)
    if collision:
        # get parent of the StaticBody or RigidBody
        print(collision.collider.get_parent())
        queue_free()

    time += delta
    if time > 3:
        queue_free()

Код для Игрок

extends KinematicBody

var velocity = Vector3()
var acceleration = 1
var retrograde = false

var mouse_sensitivity = 0.008
var rot_x_target = 0
var rot_y_target = 0
var rot_x_speed = 0
var rot_y_speed = 0
var rot_acceleration = 7
var max_rot_x_speed = 0
var max_rot_y_speed = 0

var move_camera = false     # if true, the 3rd person camera will move arnd freely

var bullet = preload("res://18 3 red round.tscn")
var reload_time = 0.2
var reload_timer = 0
var fire_gun = false

func shoot():
    var bullet_node = bullet.instance()
    bullet_node.start(self)
    get_parent().add_child(bullet_node)

# to keep track of what buttons are pressed
var pressed = {}

func is_action_just_pressed(action):

    if Input.is_action_pressed(action):
        if not pressed.has(action) or not pressed[action]:
            pressed[action] = true
            return true
    else:
        pressed[action] = false
    return false


func _physics_process(delta):
    # check if the deccelerate command is active
    # if so, wait for the current rotation to finish
    if retrograde and abs(rot_x_speed) < rot_acceleration * delta and abs(rot_y_speed) < rot_acceleration * delta:
        # orders the ship to flip
        rot_x_target = PI
        retrograde = false

    # IMPULSOR below
    # constantly calculates the maximum rotational speed to reach the target orientation
    if rot_x_target != 0:
        max_rot_x_speed = sqrt(2 * abs(rot_x_target) * rot_acceleration) * abs(rot_x_target) / rot_x_target

    if rot_y_target != 0:
        max_rot_y_speed = sqrt(2 * abs(rot_y_target) * rot_acceleration) * abs(rot_y_target) / rot_y_target

    # controls the speed in each axes to be equal to the max rotational speed
    # if the difference is greater than the acceleration, a correction is made
    if abs(max_rot_x_speed - rot_x_speed) > rot_acceleration * delta:
        if rot_x_speed < max_rot_x_speed:
            rot_x_speed += rot_acceleration * delta
        elif rot_x_speed > max_rot_x_speed:
            rot_x_speed -= rot_acceleration * delta

    if abs(max_rot_y_speed - rot_y_speed) > rot_acceleration * delta:
        if rot_y_speed < max_rot_y_speed:
            rot_y_speed += rot_acceleration * delta
        elif rot_y_speed > max_rot_y_speed:
            rot_y_speed -= rot_acceleration * delta

    rotate_object_local(Vector3(1, 0, 0), - rot_x_speed * delta)
    rotate_object_local(Vector3(0, 1, 0), rot_y_speed * delta)
    rot_x_target -= rot_x_speed * delta
    rot_y_target -= rot_y_speed * delta

    reload_timer += delta   # for incrementing the reload timer
    if reload_timer >= reload_time and fire_gun:
        shoot()
        reload_timer = 0

    move_and_slide(velocity)


func _input(event):
    if event.is_action("midmouse"):
        move_camera = not move_camera

    if event.is_action_pressed("retrograde"):
        retrograde = true

    if event.is_action("shoot"):
        fire_gun = not fire_gun

    if event is InputEventMouseMotion and not move_camera and not retrograde:
        rot_x_target -= event.relative.y * mouse_sensitivity
        rot_y_target -= event.relative.x * mouse_sensitivity

    elif event.is_action("move_forward"):
        velocity += get_global_transform().basis.z * acceleration

https://youtu.be/29ynaoqyM1k - это видео игры, не работающей

1 Ответ

0 голосов
/ 11 марта 2020

Хорошо, я узнал, что сцена была повернута на 90 градусов по оси X по какой-то причине

И что вы можете скопировать global_transform напрямую

...