【Godot4.2】2D导航04 - TileMap导航的逻辑

2024-03-20 01:28

本文主要是介绍【Godot4.2】2D导航04 - TileMap导航的逻辑,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

基于NavigationRegion2D

我们基于NavigationRegion2D的逻辑一文的场景结构,但是将NavigationRegion2D删除,更改为TileMap节点。
image.png
为TileMap创建Tileset,并创建一个导航层。在TileSet面板中,为草地和黄色泥土地面图块绘制可通行区域(整个矩形)。这样做的含义是只有这连个图块允许通行,其余图块全是障碍物。
image.pngimage.png
切换至TileMap面板,利用矩形和直线绘制方式绘制一个简单的有出口的地图。
image.png
运行场景,会发现基于NavigationAgent2D的导航在TileMap上依旧是可行的。
TileMap导航.mp4 (25.9MB)## 基于AStarGrid2D
可以看出基于NavigationRegion2D的导航总还是有些不尽如人意的地方,偶尔就卡在了半路上。
AStarGrid2D本身基于网格,那么它与TileMap组合可以说是“天作之合”。
删除Player的NavigationRegion2D以及脚本。
image.pngimage.png
查看icon.svg可以发现其图片大小为128×128,而我们的tileset的cell_size为16×16,所以为了将玩家显示在一个网格里,我们需要将icon.svg缩放为16×16。
128/16=8,所以我们需要将其设为原来的1/8,也就是缩小到原来的0.125倍。相应调整碰撞形状的大小。
image.pngimage.png
移动玩家到某个单元格内。
image.png
将world2的脚本改成如下:

# world2.gd
extends Node2D@onready var player = $Player
@onready var tile_map = $TileMap
var astar_grid = AStarGrid2D.new()
var move_speed = 200.0
var path:PackedVector2Array
var solids:PackedVector2Arrayfunc _ready():# 获取tile_map包含所有已绘制图块的矩形var rect = tile_map.get_used_rect()# 构建AStarGrid2Dastar_grid.size = rect.sizeastar_grid.cell_size = tile_map.tile_set.tile_sizeastar_grid.offset = astar_grid.cell_size/2astar_grid.update()# 获取所有已经绘制的图块的数组var cells = tile_map.get_used_cells(0)for cell in cells:# TileData包含图块的信息var data:TileData = tile_map.get_cell_tile_data(0,cell)if !data.get_navigation_polygon(0): # 如果图块没有设置导航solids.append(cell)astar_grid.set_point_solid(cell,true) # 设为障碍物# 左键点击,获取导航目标位置
func _input(event):if event is InputEventMouseButton:if event.button_index == MOUSE_BUTTON_LEFT and event.is_pressed():# TileMaplocal_to_map()用于将屏幕坐标转化为TileMap的网格坐标var p1 = tile_map.local_to_map(player.position)var p2 = tile_map.local_to_map(get_global_mouse_position())path = astar_grid.get_point_path(p1,p2)queue_redraw()# 实现沿着路径行走
func _process(delta):if path.size() > 0:var target_pos = path[0]if target_pos.distance_to(player.position)>2:player.velocity = player.position.direction_to(target_pos) * move_speedplayer.move_and_slide()else:path.remove_at(0)queue_redraw()# 绘制路径信息
func _draw():var grid_width = astar_grid.size.x * astar_grid.cell_size.xvar cell_width = astar_grid.cell_size.xvar cell_height = astar_grid.cell_size.y# 绘制路径和其上的点if path.size() > 0:for pot in path:draw_circle(pot,5,Color.YELLOW)draw_polyline(path,Color.YELLOW,2)

开启显示碰撞区域和导航。
image.png
运行后的效果如下:
2023-06-11_22-40-24.mp4 (5.06MB)基本的导航还是可以的。
:::success
提示
默认由于TileMap是world2的子节点,所以world2上用_draw绘制的内容会被TileMap绘制的地图覆盖而无法显示。解决方法是将TileMap的z_index设为-1。
image.pngimage.png
:::

这篇关于【Godot4.2】2D导航04 - TileMap导航的逻辑的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/827863

相关文章

取得 Git 仓库 —— Git 学习笔记 04

取得 Git 仓库 —— Git 学习笔记 04 我认为, Git 的学习分为两大块:一是工作区、索引、本地版本库之间的交互;二是本地版本库和远程版本库之间的交互。第一块是基础,第二块是难点。 下面,我们就围绕着第一部分内容来学习,先不考虑远程仓库,只考虑本地仓库。 怎样取得项目的 Git 仓库? 有两种取得 Git 项目仓库的方法。第一种是在本地创建一个新的仓库,第二种是把其他地方的某个

浙大数据结构:04-树7 二叉搜索树的操作集

这道题答案都在PPT上,所以先学会再写的话并不难。 1、BinTree Insert( BinTree BST, ElementType X ) 递归实现,小就进左子树,大就进右子树。 为空就新建结点插入。 BinTree Insert( BinTree BST, ElementType X ){if(!BST){BST=(BinTree)malloc(sizeof(struct TNo

逻辑表达式,最小项

目录 得到此图的逻辑电路 1.画出它的真值表 2.根据真值表写出逻辑式 3.画逻辑图 逻辑函数的表示 逻辑表达式 最小项 定义 基本性质 最小项编号 最小项表达式   得到此图的逻辑电路 1.画出它的真值表 这是同或的逻辑式。 2.根据真值表写出逻辑式   3.画逻辑图   有两种画法,1是根据运算优先级非>与>或得到,第二种是采

UMI复现代码运行逻辑全流程(一)——eval_real.py(尚在更新)

一、文件夹功能解析 全文件夹如下 其中,核心文件作用为: diffusion_policy:扩散策略核心文件夹,包含了众多模型及基础库 example:标定及配置文件 scripts/scripts_real:测试脚本文件,区别在于前者倾向于单体运行,后者为整体运行 scripts_slam_pipeline:orb_slam3运行全部文件 umi:核心交互文件夹,作用在于构建真

读软件设计的要素04概念的关系

1. 概念的关系 1.1. 概念是独立的,彼此间无须相互依赖 1.1.1. 一个概念是应该独立地被理解、设计和实现的 1.1.2. 独立性是概念的简单性和可重用性的关键 1.2. 软件存在依赖性 1.2.1. 不是说一个概念需要依赖另一个概念才能正确运行 1.2.2. 只有当一个概念存在时,包含另一个概念才有意义 1.3. 概念依赖关系图简要概括了软件的概念和概念存在的理

Matter.js:Web开发者的2D物理引擎

Matter.js:Web开发者的2D物理引擎 前言 在现代网页开发中,交互性和动态效果是提升用户体验的关键因素。 Matter.js,一个专为网页设计的2D物理引擎,为开发者提供了一种简单而强大的方式,来实现复杂的物理交互效果。 无论是模拟重力、碰撞还是复杂的物体运动,Matter.js 都能轻松应对。 本文将带你深入了解 Matter.js ,并提供实际的代码示例,让你一窥其强大功能

[苍穹外卖]-04菜品管理接口开发

效果预览 新增菜品 需求分析 查看产品原型分析需求, 包括用到哪些接口, 业务的限制规则 业务规则 菜品名称必须是唯一的菜品必须属于某个分类下, 不能单独存在新增菜品时可以根据情况选择菜品的口味每个菜品必须对应一张图片 接口设计 根据类型查询分类接口 文件上传接口 新增菜品接口 数据表设计 设计dish菜品表 和 dish_fl

【动手学深度学习】04 数据操作 + 数据预处理(个人向笔记)

数据操作 N维数组是机器学习和神经网络的主要数据结构其中 2-d 矩阵中每一行表示每一行表示一个样本 当维度来到三维的时候则可以表示成一张图片,再加一维就可以变成多张图片,再加一维则可以变成一个视频 访问元素 冒号表示从冒号左边的元素到冒号右边的前一个元素(开区间),其中如果左边为空,那么表示从第一个开始,如果右边为空,那么表示访问到最后一个,如果两边都为空,则表示全部访问其中一行中我们指

Unity3D在2D游戏中获取触屏物体的方法

我们的需求是: 假如屏幕中一个棋盘,每个棋子是button构成的,我们希望手指或者鼠标在哪里,就显示那个位置的button信息。 网上有很多获取触屏物体信息的信息的方法如下面代码所示: Camera cam = Camera.main; // pre-defined...if (touch.phase == TouchPhase.Bagan)){ // 如果触控点状态为按下Ray

【SpringMVC学习04】SpringMVC中的参数绑定总结

众所周知,springmvc是用来处理页面的一些请求,然后将数据再通过视图返回给用户的,前面的几篇博文中使用的都是静态数据,为了能快速入门springmvc,在这一篇博文中,我将总结一下springmvc中如何接收前台页面的参数,即springmvc中的参数绑定问题。 1. 参数绑定的过程 我们可以回忆一下,在struts2中,是通过在Action中定义一个成员变量来接收前台传进来的参数,而在