Gerenciamento de furto em um projeto de jogo no Godot Engine

Saudações a todos! Hoje eu gostaria de falar sobre como implementar o gerenciamento de furto em um projeto de jogo para Android no Godot Engine.

imagem

Meu nome é Peter e sou um dos usuários ativos do mecanismo de jogo Godot Engine.
No segmento de língua russa, há uma enorme escassez de materiais nessa ferramenta, o que me surpreende muito, pois é um dos mecanismos de jogo que mais cresce.
Obviamente, é de muitas maneiras inferior a mecanismos como Unity, UE e similares, e você não fará um jogo de classe AAA nele.

Contudo! É gratuito (completo), multiplataforma (completo) e seu peso é de cerca de 60 megabytes, em oposição à mesma unidade.

O mecanismo funciona na maioria dos dispositivos, mesmo que este último seja de uma linha de orçamento bastante. Além disso, "pronto para uso", já está russo, possui todas as ferramentas necessárias a bordo, não requer software adicional e não consome toda a RAM na forma de execução.

Eu já vi alguns artigos sobre Habré, e isso é muito pequeno, pois é tão amigável para o desenvolvedor que é uma grande omissão ir além e não tentar.

O tópico desta postagem é a implementação do gerenciamento de furto (gestos) em um projeto Android.
Em geral, a experiência do uso do mecanismo é bastante extensa e, se o tópico receber uma resposta, posso organizar um curso de treinamento inteiro. Neste post, quero chamar a atenção pelo menos para o mecanismo.

Como linguagem de programação, você pode usar, novamente, fora da caixa, duas opções: GDScript e C #. Vou usar o primeiro.

A interface do editor principal tem a seguinte aparência:

imagem

nele você pode trabalhar simultaneamente com scripts 3D, 2D e, em geral, tudo o que um desenvolvedor pode exigir.

O mecanismo usa uma abordagem na qual seu jogo é um conjunto de cenas aninhadas uma na outra. E pode haver alguma confusão, porque eu uso o termo “cena” para nós que são apenas cenas de jogos (situações, janelas, estados de jogos (menus, jogos etc.)) e, para outros casos, eu uso o termo O "Prefab" foi emprestado da Unity.

Como neste post vou considerar um caso especial, não vou expandir alguns tópicos. Se algo não estiver claro, há comentários.

Então, a cena principal da demonstração, teremos um jogo.

Sua estrutura fica assim:

imagem

O nó raiz do jogo armazena aninhado dentro de si:
- mundo, - armazena dados de nível nele
- - nível, - um conjunto de objetos do ambiente (blocos, anéis, obstáculos)
- - jogador, - objeto de jogador
- - InterpolatedCamera, - suave a câmera que monitora a
interface do player - GUI - não estará envolvida.Nomes

de objetos e estrutura são arbitrários e esse é apenas um caso especial.
Perto de alguns objetos, você pode ver ícones dizendo que esse objeto é uma pré-fabricada (cena aninhada) e um script também pode ser adicionado a ele.

Então, clicando no ícone "script", entramos no editor de scripts; na verdade, o modo de operação do mecanismo simplesmente muda.

imagem

Nesse modo de operação, você pode editar o comportamento dos objetos. Na verdade, nesse caso, é um script do objeto mundial que, ao carregar um objeto no jogo, define o objeto da câmera (InterpolatedCamera) define o alvo para o rastreamento.

extends Spatial

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

Sintaticamente, o GDScript é semelhante ao Python. Você pode fazer um breve treinamento sobre o GDScript em russo aqui: Livro do GDScript

Com o objeto mundo, é claro, ele apenas define o alvo de rastreamento da câmera. O próximo objeto (já filho do mundo) é nivelado. Sua estrutura se parece com a seguinte:

imagem

De fato, esses são simplesmente objetos organizados com propriedades físicas que não possuem scripts ou comportamento. Além dos objetos "cell". Estes são anéis giratórios que desaparecem em contato com o objeto do jogador.

O objeto player é o mais interessante no momento, que contém a lógica de controle de furto para telas sensíveis ao toque.

Essa pré-fabricada é assim:

imagem

O objeto raiz possui um script, que veremos um pouco mais adiante.
Primeiro, considere objetos aninhados.

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

Bem, agora considere o próprio script no objeto raiz. Acontece ser o mais volumoso de todo o "jogo".

imagem

Bem, sua descrição e decodificação.


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 = '' #   

Descrevi cada linha, espero, com scripts, tudo mais ou menos é claro.

Se estiver em russo, quando movermos o dedo pela tela, registramos a direção do movimento e da velocidade. Se o dedo se mover na velocidade desejada, contamos o furto. Com base em qual eixo e em qual direção o movimento estava indo, temos três opções: CIMA, ESQUERDA, DIREITA.
Escrevemos o valor recebido em uma variável, que é imediatamente captada pelo evento de atualização do estado do objeto, e executamos as ações necessárias com ele, após o que ele marca o evento como cumprido e espera o próximo.

Não tomei a maneira mais fácil de implementar um furto, mas é bastante confiável e funciona na maioria das situações. Claro, isso depende do gênero e do tipo de jogo.

Como resultado do trabalho realizado, obtemos um exemplo de como é fácil implementar o gerenciamento de furto em literalmente dez minutos.

No total, levei cerca de 30 minutos, levando em consideração a criação de modelos no Blender.

Bem, de acordo com a tradição ...

Vídeo de desenvolvimento


Código fonte

All Articles