Hola Visitante

Godot 2D, Giro por desliz

  • 0 Respuestas
  • 70 Vistas
*

bizarman

  • *
  • 15
  • +3/-0
    • Ver Perfil
Godot 2D, Giro por desliz
« en: 30 de Mayo del 2019, 19:56 »

Un personaje que al contacto con inclinaciones gira con estas.
No es un RigidBody es un KinematicBody2D, por rendimiento.
La forma de la colisión (CollisionShape) no gira, gira el la imagen
(el nodo Sprite), puedes modificarlo para que gire todo, pero los
resultados son un poco inestables.
Probado en Godot 3.1



Aqui su programación.
Código: [Seleccionar]

extends KinematicBody2D


var velocidad_caminar = 300
var velocidad_salto = -400
var gravedad = 980
var direccion = Vector2()
var saltando = false


var velocidad_giro = 10
onready var posicion_rampa = get_node("Sprite").get_position() + Vector2(0, 12)
onready var posicion_suelo = get_node("Sprite").get_position()


func _physics_process(delta):
direccion.x = 0

if Input.is_action_just_pressed('ui_select') and is_on_floor():
saltando = true
direccion.y = velocidad_salto

if Input.is_action_pressed('ui_right'):
direccion.x += velocidad_caminar

if Input.is_action_pressed('ui_left'):
direccion.x -= velocidad_caminar

direccion.y += gravedad * delta

if saltando and is_on_floor():
saltando = false

direccion = move_and_slide(direccion, Vector2(0, -1), true)

if get_slide_count() > 0:
var choque = get_slide_collision(0)
var normal = choque.get_normal()
var angulo_inicial = normal.angle() + deg2rad(90)
var angulo_final = angulo_inicial - get_node("Sprite").get_rotation()
get_node("Sprite").rotate(angulo_final * delta * velocidad_giro)

if angulo_inicial != 0:
var posicion_final = posicion_rampa - get_node("Sprite").get_position()
get_node("Sprite").translate(posicion_final * delta * velocidad_giro)
if angulo_inicial == 0:
var posicion_final = posicion_suelo - get_node("Sprite").get_position()
get_node("Sprite").translate(posicion_final * delta * velocidad_giro)


Nota:
El personaje tiene una colisión (CollisionShape) en forma de rectángulo (RectangleShape)