祝福大家!今天,我想谈一谈如何在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'
从语法上讲,GDScript与Python类似。您可以在此处用俄语对GDScript进行简短的培训:GDScript Book显然,有了世界对象,它只是设置了摄像机的跟踪目标。下一个对象(已经是世界的孩子了)是关卡。其结构如下所示:
实际上,这些对象是具有物理特性的简单排列的对象,没有脚本或行为。除了“单元格”对象。这些旋转的环在与玩家的物体接触时消失了。播放器对象目前最有趣,它包含触摸屏的滑动控制逻辑。这个预制件看起来像这样:
根对象有一个脚本,稍后我们将介绍它。首先,考虑嵌套对象。- camera, — , , . player.
- CollisionShape, — . «» . , , . .
- MeshInstance, — . , . Blender 3D , .
- Tween, . .
好吧,现在考虑在根对象中的脚本本身。事实证明,它是整个“游戏”中最庞大的。
好吧,它的描述和解码。
extends KinematicBody
const GRAV = 0.5
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
func _physics_process(delta):
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,
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:
swipe = 'up'
elif e.relative.x < -SWIPE_SPEED:
swipe = 'left'
elif e.relative.x > SWIPE_SPEED:
swipe = 'right'
elif e is InputEventScreenTouch:
if !e.pressed:
swipe = ''
我希望我用脚本描述了每一行,正负都清楚。如果使用俄语,那么当我们在屏幕上移动手指时,我们会记录移动方向和速度。如果手指以期望的速度移动,我们将进行滑动计数。根据运动的方向和方向,我们有三个选择:上,左,右。我们将接收到的值写入一个变量,该变量将在更新对象状态时立即被拾取,并执行必要的操作,然后将事件标记为已完成并期待下一个事件。我并不是采用最简单的方法来执行滑动操作,但是它相当可靠,并且在大多数情况下都可以使用。当然,这取决于游戏的类型和类型。作为完成工作的结果,我们得到了一个示例,说明在十分钟内实施轻扫管理有多么容易。总共花了我大约30分钟,这是考虑到在Blender中创建模型的时间。好吧,根据传统...