在Godot Engine上的游戏项目中进行滑动管理

祝福大家!今天,我想谈一谈如何在Godot Engine上的Android游戏项目中实施滑动管理。

图片

我叫Peter,我是Godot Engine游戏引擎的活跃用户之一。
在俄语部分,该工具的材料严重短缺,这使我感到非常惊讶,因为它是增长最快的游戏引擎之一。
当然,它在许多方面都不如Unity,UE等引擎,并且您不会在上面制作AAA级游戏。

然而!它是免费的(完整),跨平台的(完整),其重量约为60兆字节,与同一个Unity相对。

该引擎可在大多数设备上运行,即使后者来自非常昂贵的预算。另外,“开箱即用”的产品已经被俄罗斯化,拥有所有必需的工具,不需要额外的软件,并且不会消耗所有运行形式的RAM。

我已经在Habré上看到了几篇文章,而且篇幅很小,因为它对开发人员非常友好,以至于忽略不去尝试是一个很大的疏漏。

这篇文章的主题是Android项目中滑动管理(手势)的实现。
总的来说,我使用引擎的经验非常丰富,如果您的主题得到回应,我可以安排整个培训课程。通过这篇文章,我至少希望引起您对引擎的关注。

作为一种编程语言,您可以再次使用开箱即用的两个选项:GDScript和C#。我将使用第一个。

主编辑器的界面如下所示:

图片

在其中,您可以同时使用3D,2D,脚本以及开发人员可能需要的所有内容。

该引擎使用一种方法,其中您的游戏是一组相互嵌套的场景。可能会有一些混淆,因为我将术语“场景”用于仅仅是游戏场景(场景,窗口,游戏状态(菜单,游戏等)的节点),而在其他情况下,我使用术语“场景”从Unity借来的“预制件”。

由于在本文中,我将考虑一种特殊情况,因此我将不涉及某些主题。如果不清楚,则有评论。

因此,在演示的主要场景中,我们将有一个游戏。

其结构如下所示:

图片

游戏的根节点嵌套在其内部:
-世界,-在其中存储关卡数据
--关卡,-一组环境对象(块,环,障碍物)
--玩家,-玩家对象
--InterpolatedCamera,-平滑监视播放器的摄像机
-gui-接口将不会涉及

,对象和结构的名称是任意的,这只是一种特殊情况。
在某些对象附近,您会看到图标,表明该对象是预制件(嵌套场景),并且还可以向其中添加脚本。

因此,单击“脚本”图标,我们进入脚本编辑器,实际上,引擎的运行模式只是切换。

图片

在此操作模式下,您可以编辑对象的行为。实际上,在这种情况下,它是世界对象的脚本,当将对象加载到游戏中时,该脚本会设置相机对象(InterpolatedCamera)来设置跟踪目标。

extends Spatial

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

从语法上讲,GDScript与Python类似。您可以在此处用俄语对GDScript进行简短的培训:GDScript Book

显然,有了世界对象,它只是设置了摄像机的跟踪目标。下一个对象(已经是世界的孩子了)是关卡。其结构如下所示:

图片

实际上,这些对象是具有物理特性的简单排列的对象,没有脚本或行为。除了“单元格”对象。这些旋转的环在与玩家的物体接触时消失了。

播放器对象目前最有趣,它包含触摸屏的滑动控制逻辑。

这个预制件看起来像这样:

图片

根对象有一个脚本,稍后我们将介绍它。
首先,考虑嵌套对象。

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

好吧,现在考虑在根对象中的脚本本身。事实证明,它是整个“游戏”中最庞大的。

图片

好吧,它的描述和解码。


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

我希望我用脚本描述了每一行,正负都清楚。

如果使用俄语,那么当我们在屏幕上移动手指时,我们会记录移动方向和速度。如果手指以期望的速度移动,我们将进行滑动计数。根据运动的方向和方向,我们有三个选择:上,左,右。
我们将接收到的值写入一个变量,该变量将在更新对象状态时立即被拾取,并执行必要的操作,然后将事件标记为已完成并期待下一个事件。

我并不是采用最简单的方法来执行滑动操作,但是它相当可靠,并且在大多数情况下都可以使用。当然,这取决于游戏的类型和类型。

作为完成工作的结果,我们得到了一个示例,说明在十分钟内实施轻扫管理有多么容易。

总共花了我大约30分钟,这是考虑到在Blender中创建模型的时间。

好吧,根据传统...

开发视频


源代码

All Articles