Gestión de deslizamiento en un proyecto de juego en Godot Engine

¡Saludos a todos! Hoy me gustaría hablar sobre cómo implementar la gestión de deslizamiento en un proyecto de juego para Android en Godot Engine.

imagen

Mi nombre es Peter y soy uno de los usuarios activos del motor de juegos Godot Engine.
En el segmento de idioma ruso, hay una gran escasez de materiales en esta herramienta, lo que me sorprende mucho, ya que es uno de los motores de juego de más rápido crecimiento.
Por supuesto, es en muchos sentidos inferior a motores como Unity, UE y similares, y no harás un juego de clase AAA en él.

¡Sin embargo! Es gratis (completo), multiplataforma (completo), y su peso es de aproximadamente 60 megabytes, a diferencia de la misma Unidad.

El motor funciona en la mayoría de los dispositivos, incluso si estos últimos son de una línea muy económica. Además, "listo para usar", ya está rusificado, tiene todas las herramientas necesarias a bordo, no requiere software adicional y no consume toda la RAM en forma de ejecución.

Ya vi un par de artículos sobre Habré en él, y esto es muy pequeño, ya que es tan amigable para el desarrollador que es una gran omisión pasar por alto y no intentarlo.

El tema de esta publicación es la implementación de la gestión de deslizamiento (gestos) en un proyecto de Android.
En general, la experiencia de mi uso del motor es bastante extensa, y si el tema recibe una respuesta, puedo organizar un curso de capacitación completo. En esta publicación quiero al menos llamar su atención sobre el motor.

Como lenguaje de programación, puede usar, de nuevo, dos opciones: GDScript y C #. Usaré el primero.

La interfaz del editor principal se ve así:

imagen

en ella puedes trabajar simultáneamente con 3D, 2D, scripts y, en general, todo lo que un desarrollador pueda requerir.

El motor utiliza un enfoque en el que su juego es un conjunto de escenas anidadas entre sí. Y puede haber cierta confusión, porque uso el término "escena" para los nodos que son solo escenas de juego (situaciones, ventanas, estados de juego (menús, juegos, etc.)), y para otros casos uso el término "Prefabricado" prestado de Unity.

Dado que en esta publicación consideraré un caso especial, no me ampliaré en algunos temas. Si algo no está claro, hay comentarios.

Entonces, la escena principal de la demostración, tendremos un juego.

Su estructura se ve así:

imagen

El nodo raíz del juego almacena anidado dentro de sí mismo:
- mundo, - almacena datos de nivel en él
- - nivel, - un conjunto de objetos de entorno (bloques, anillos, obstáculos)
- - jugador, - objeto jugador
- - Cámara interpolada, - suave la cámara que monitorea la
interfaz del jugador - gui, - no estará involucrada Los

nombres de los objetos y la estructura son arbitrarios y esto es solo un caso especial.
Cerca de algunos objetos, puede ver iconos que dicen que este objeto es prefabricado (escena anidada) y también se le puede agregar un script.

Entonces, al hacer clic en el ícono "script", ingresamos al editor de script, de hecho, el modo de funcionamiento del motor simplemente cambia.

imagen

En este modo operativo, puede editar el comportamiento de los objetos. En realidad, en este caso es un guión del objeto mundial, que, al cargar un objeto en el juego, establece el objeto de la cámara (InterpolatedCamera) establece el objetivo para el seguimiento.

extends Spatial

func _ready():
	$InterpolatedCamera.target = '../player/camera' #  , ,         (  ).   player  "camera"   pivot.   .         .

Sintácticamente, GDScript es similar a Python. Puede tomar una breve capacitación sobre GDScript en ruso aquí: Libro GDScript

Con el objeto mundial, está claro, solo establece el objetivo de la cámara para el seguimiento. El siguiente objeto (ya un hijo del mundo) es el nivel. Su estructura se ve así: de

imagen

hecho, estos son simplemente objetos organizados con propiedades físicas que no tienen secuencias de comandos o comportamiento. Además de los objetos de "celda". Estos son anillos giratorios que desaparecen en contacto con el objeto del jugador.

El objeto jugador es más interesante en este momento, que contiene la lógica de control de deslizamiento para pantallas táctiles.

Este prefabricado se ve así:

imagen

El objeto raíz tiene un script, al que llegaremos un poco más adelante.
Primero, considere los objetos anidados.

  • camera, — , , . player.
  • CollisionShape, — . «» . , , . .
  • MeshInstance, — . , . Blender 3D , .
  • Tween, . .

Bueno, ahora considere el script en sí mismo en el objeto raíz. Resulta ser el más voluminoso en todo el "juego".

imagen

Bueno, su descripción y decodificación.


extends KinematicBody #       

#  
const GRAV = 0.5 #   (      Y, ..       ,     )
const SPEED = 2 #  
const SWIPE_SPEED = 30 #       
const JUMP_SPEED = 10 #     

onready var ball = $MeshInstance #        
onready var tween = $Tween #      
var vel = Vector3() #     
var swipe = '' #       


func _ready():
	pass #        ;    


#       (60FPS)  
func _physics_process(delta): # delta -  Delta Time ,  ,    
	vel.y -= GRAV #      (  )
	vel.z = -SPEED #     .   
	ball.rotate_x(-delta * SPEED * 2) #     ,   ""

	if swipe && swipe != 'swiped': #         
		if swipe == 'up' && is_on_floor(): #        ()
			vel.y = JUMP_SPEED #     ,   -  
		elif swipe == 'left' || swipe == 'right': #     
			tween.interpolate_property(self, "translation", #      
				translation, translation+Vector3(-2 if swipe == 'left' else 2,0,0), 0.2, #    ,         X.      . -2  ,  2
				Tween.TRANS_CUBIC, Tween.EASE_IN_OUT) #     "" 
			tween.start() #   
		swipe = 'swiped' #   ,   

	vel = move_and_slide(vel, Vector3.UP) #       ,                  

#       
func _input(e):
	if e is InputEventScreenDrag: # ,       
		if !swipe: #       
			if e.relative.y < -SWIPE_SPEED: #       Y
				swipe = 'up' #     (     )    ( ,          ),     " (UP)"
			elif e.relative.x < -SWIPE_SPEED: #      ,     X.     -  
				swipe = 'left'
			elif e.relative.x > SWIPE_SPEED: #  ,
				swipe = 'right' #  

	elif e is InputEventScreenTouch: #     
		if !e.pressed: #      
			swipe = '' #   

Describí cada línea, espero, con los scripts, todo más o menos está claro.

Si está en ruso, cuando movemos nuestro dedo por la pantalla, registramos la dirección del movimiento y la velocidad. Si el dedo se mueve a la velocidad deseada, contamos el deslizamiento. Según el eje y en qué dirección iba el movimiento, tenemos tres opciones: ARRIBA, IZQUIERDA, DERECHA.
Escribimos el valor recibido en una variable, que es inmediatamente recogida por el evento de actualización del estado del objeto, y realiza las acciones necesarias con él, después de lo cual marca el evento como cumplido y espera lo siguiente.

No tomé la forma más fácil de implementar un deslizamiento, pero es bastante confiable y funciona en la mayoría de las situaciones. Por supuesto, depende del género y tipo de juego.

Como resultado del trabajo realizado, obtenemos un ejemplo de lo fácil que es implementar la administración de deslizamiento en literalmente diez minutos.

En total, me llevó unos 30 minutos, esto tiene en cuenta la creación de modelos en Blender.

Bueno, según la tradición ...

Video de desarrollo


Código fuente

All Articles