Manajemen swipe dalam proyek game di Godot Engine

Salam untuk semua! Hari ini saya ingin berbicara tentang bagaimana menerapkan manajemen swipe dalam proyek game untuk Android di Godot Engine.

gambar

Nama saya Peter, dan saya adalah salah satu pengguna aktif mesin game Godot Engine.
Di segmen bahasa Rusia, ada kekurangan besar bahan pada alat ini, yang sangat mengejutkan saya, karena ini adalah salah satu mesin game yang paling cepat berkembang.
Tentu saja, dalam banyak hal kalah dengan engine seperti Unity, UE, dan sejenisnya, dan Anda tidak akan membuat gim kelas AAA di dalamnya.

Namun! Ini gratis (penuh), lintas-platform (penuh), dan beratnya sekitar 60 megabita, berbeda dengan Unity yang sama.

Mesin bekerja pada sebagian besar perangkat, bahkan jika yang terakhir dari garis anggaran yang sangat. Juga, "out of the box", ini sudah Russified, memiliki semua alat yang diperlukan, tidak memerlukan perangkat lunak tambahan, dan tidak memakan semua RAM dalam bentuk yang sedang berjalan.

Saya sudah melihat beberapa artikel tentang Habré di atasnya, dan ini sangat kecil, karena sangat ramah bagi pengembang sehingga merupakan kelalaian besar untuk melewatinya dan tidak mencoba.

Topik postingan ini adalah implementasi swipe management (gestures) dalam proyek Android.
Secara umum, pengalaman saya menggunakan mesin cukup luas, dan jika topiknya mendapat respons, saya bisa mengatur seluruh kursus pelatihan. Dengan posting ini saya ingin setidaknya menarik perhatian Anda ke mesin.

Sebagai bahasa pemrograman, Anda dapat menggunakan, sekali lagi, di luar kotak, dua opsi: GDScript dan C #. Saya akan menggunakan yang pertama.

Antarmuka editor utama terlihat seperti ini:

gambar

Di dalamnya Anda dapat bekerja secara bersamaan dengan skrip 3D, 2D, dan secara umum semua yang diperlukan oleh pengembang.

Mesin menggunakan pendekatan di mana game Anda adalah satu set adegan yang saling bersarang. Dan mungkin ada beberapa kebingungan, karena saya menggunakan istilah "adegan" untuk node yang hanya adegan permainan (situasi, jendela, status permainan (menu, permainan, dll.)), Dan untuk kasus lain saya menggunakan istilah "Prefab" dipinjam dari Unity.

Karena dalam posting ini saya akan mempertimbangkan kasus khusus, saya tidak akan memperluas beberapa topik. Jika ada sesuatu yang tidak jelas, ada komentar.

Jadi, adegan utama untuk demonstrasi, kita akan memiliki permainan.

Strukturnya terlihat seperti ini:

gambar

Simpul root dari permainan menyimpan bersarang dalam dirinya sendiri:
- dunia, - menyimpan data level di dalamnya
- - level, - satu set objek lingkungan (blok, cincin, hambatan)
- - pemain, - objek pemain
- - InterpolatedCamera, - smooth kamera yang memantau pemutar
- gui, - antarmuka, tidak akan terlibat.

Nama ke objek dan struktur sewenang - wenang dan ini hanya kasus khusus.
Di dekat beberapa objek, Anda dapat melihat ikon yang mengatakan bahwa objek ini adalah prefab (adegan bersarang) dan skrip juga dapat ditambahkan.

Jadi, dengan mengklik ikon "skrip", kita masuk ke editor skrip, pada kenyataannya, mode operasi mesin hanya beralih.

gambar

Dalam mode operasi ini, Anda dapat mengedit perilaku objek. Sebenarnya, dalam hal ini adalah skrip objek dunia, yang, saat memuat objek ke dalam game, menetapkan objek kamera (InterpolatedCamera) menetapkan target untuk dilacak.

extends Spatial

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

Secara sintaksis, GDScript mirip dengan Python. Anda dapat mengikuti pelatihan singkat tentang GDScript dalam bahasa Rusia di sini: Buku GDScript

Dengan objek dunia, jelas, itu hanya menetapkan target kamera untuk pelacakan. Objek berikutnya (sudah menjadi anak dunia) adalah level. Strukturnya terlihat seperti ini:

gambar

Faktanya, ini hanyalah objek yang diatur dengan properti fisik yang tidak memiliki skrip atau perilaku. Selain benda "sel". Ini adalah cincin pemintalan yang menghilang saat bersentuhan dengan objek pemain.

Objek pemain paling menarik saat ini, yang berisi logika kontrol gesek untuk layar sentuh.

Pabrikan ini terlihat seperti ini:

gambar

Objek root memiliki skrip, yang akan kita bahas nanti.
Pertama, pertimbangkan objek bersarang.

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

Nah, sekarang perhatikan skrip itu sendiri di objek root. Ternyata menjadi yang paling banyak di seluruh "permainan".

gambar

Nah, uraian dan penguraiannya.


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

Saya menggambarkan setiap baris, saya harap, dengan skrip semuanya plus atau minus jelas.

Jika dalam bahasa Rusia, maka ketika kita menggerakkan jari kita melintasi layar, kita mendaftarkan arah gerakan dan kecepatan. Jika jari bergerak dengan kecepatan yang diinginkan, kami menghitung geseknya. Berdasarkan sumbu mana dan ke arah mana gerakan itu berjalan, kami memiliki tiga opsi: ATAS, KIRI, KANAN.
Kami menulis nilai yang diterima ke dalam variabel, yang segera diambil oleh peristiwa memperbarui keadaan objek, dan melakukan tindakan yang diperlukan dengannya, setelah itu menandai acara sebagai terpenuhi dan mengharapkan yang berikutnya.

Saya mengambil bukan cara termudah untuk menerapkan gesekan, tetapi cukup andal dan berfungsi di sebagian besar situasi. Tentu saja, itu tergantung pada genre dan jenis permainannya.

Sebagai hasil dari pekerjaan yang dilakukan, kami mendapatkan contoh betapa mudahnya menerapkan manajemen gesek dalam sepuluh menit.

Secara total, butuh sekitar 30 menit, ini memperhitungkan pembuatan model di Blender.

Menurut tradisi ...

Video Pengembangan


Kode sumber

All Articles