【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:PackedVector2Array

func _ready():
	# 获取tile_map包含所有已绘制图块的矩形
	var rect = tile_map.get_used_rect()
	# 构建AStarGrid2D
	astar_grid.size = rect.size
	astar_grid.cell_size = tile_map.tile_set.tile_size
	astar_grid.offset = astar_grid.cell_size/2
	astar_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_speed
			player.move_and_slide()
		else:
			path.remove_at(0)
		queue_redraw()

# 绘制路径信息
func _draw():
	var grid_width = astar_grid.size.x * astar_grid.cell_size.x
	var cell_width = astar_grid.cell_size.x
	var 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
:::

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mfbz.cn/a/470099.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

②免费AI软件开发工具测评:通义灵码 VS 码上飞

前言 我又双叒叕来测评了!上次给大家带来的是iFlyCode和CodeFlying两款产品的测评,受到了大家的一致好评~ 今天咱就继续来聊聊,这次我们选的的对象是通义灵码和码上飞,从名字上也能看到出来这两款产品一定是跟软件开发有关系的&…

机器视觉系统选型-镜头基础知识

广角镜头:焦距小于标准焦距50mm的。例如:16mm 景深大,聚焦距离更近 远距照像镜头:焦距大于标准焦距50mm的。例如:75mm 景深浅,放大远距离物体 变焦镜头:镜头焦距可调节,焦距有范围&a…

web前端框架设计第二课-Vue.js简介

web前端框架设计第二课-Vue.js简介 一.预习笔记 1.Vue.js概述 Vue.js是一套用于构建用户界面的渐进式框架。本质上是一个用于开发Web前端界面的库,其本身具有响应式编程和组件化的特点。 Vue.js的特性: 轻量级 数据绑定 应用指令 插件化开发 2.V…

面试八-git使用

1. 初始化(git init 把这个目录变成git可以管理的仓库) git init 2. 添加到暂存区里面去 git add readme.txt 3. 查看文件状态 git status 4. 提交到本地仓库 git commit -m " 版本信息“ readme.txt 5. 查看readme.txt文件到底改了什么内容…

大模型面试题最全总结,没有一道是送分题。。。

节前,我们组织了一场算法岗技术&面试讨论会,邀请了一些互联网大厂同学、参加社招和校招面试的同学,针对算法岗技术趋势、大模型落地项目经验分享、新手如何入门算法岗、该如何准备、面试常考点分享等热门话题进行了深入的讨论。 今天分享…

视频素材免费下载素材库哪里有?推荐8个高清无水印素材网

在这个数字化时代,无论是专业的内容创作者还是日常的社交媒体使用者,我们都会寻找高质量的素材来丰富我们的作品或帖子。从令人震撼的摄影作品到高分辨率的视频素材,再到生动的GIF和必需的设计元素,素材的需求无处不在。 视频素材…

DZY-212中间继电器 DC 220V 板后接线 面板安装 JOSEF约瑟

系列型号: DZY-200系列中间继电器;DZY-201中间继电器; DZY-202中间继电器;DZY-203中间继电器; DZY-204中间继电器;DZY-205中间继电器; DZY-206中间继电器;DZY-207中间继电器; DZY-20…

Leetcode 70.爬楼梯

心路历程: 这道题是之前学院的一道复试题,大家都没怎么刷过算法题,只记得当年凭借几次试错自己把这道题做出来了,当时也不知道动态规划之类的。 正常来讲,这种找不到循环结构的题一般都是递归解决。 注意的点&#x…

js 中文乱码解决、乱码对照

1、js iso-8859-1转utf-8 在JavaScript中,可以使用内置的TextEncoder和TextDecoderAPI来实现ISO-8859-1编码和UTF-8编码之间的转换。以下是一个将ISO-8859-1编码的字符串转换为UTF-8编码的示例代码: function convertISO88591ToUTF8(isoString) {// 将…

上班族兼职宝典:五个副业赚钱项目助你财富增值

在快节奏的现代生活中,许多上班族已不再满足于固定的月薪,纷纷寻求额外收入来源以缓解生活压力。副业赚钱作为一种有效途径,正逐渐受到他们的青睐。为此,我们为上班族精心挑选了五种可行的副业赚钱方式,助力他们在工作…

蓝牙耳机连上电脑后播放音频一卡一卡的还有声音变形,电脑连接后总是容易断开蓝牙

蓝牙耳机连上电脑后播放音频一卡一卡的还有声音变形,电脑连接后总是容易断开蓝牙 问题描述问题排查可能6可能7电脑蓝牙驱动问题 结语: 问题描述 蓝牙耳机连上电脑后播放音频一卡一卡的还有声音变形,电脑连接后总是容易断开蓝牙。 关键之前我…

详细教---用Django封装写好的模型

本次我们要用自己写好的热销词条爬虫代码来演示如何用Django把我们写好的模型封装。 第一步:代码准备 热搜词条搜集代码: import requests from lxml import etreeurl "https://tophub.today/n/KqndgxeLl9" headers{User-Agent: Mozilla/5.…

【Godot4.2】 基于SurfaceTool的3D网格生成与体素网格探索

概述 说明:本文基础内容写于2023年6月,由三五篇文章汇总而成,因为当时写的比较潦草,过去时间也比较久了,我自己都得重新阅读和理解一番,才能知道自己说了什么,才有可能重新优化整理。 因为我对…

Redis数据结构对象之集合对象和有序集合对象

集合对象 集合对象的编码可以是intset或者hashtable. 概述 intset编码的集合对象使用整数集合作为底层实现,集合对象包含的所有元素都被保存在整数集合里面。 另一方面,hashtable编码的集合对象使用字典作为底层实现,字典的每个键都是一个…

H.整数删除【蓝桥杯】优先队列+双向链表

优先队列 在头文件 < q u e u e > <queue> <queue>中定义方法&#xff1a;priority_queue<储存的类型,vector<储存的类型>,顶堆的类型> 容器名less<储存的数据类型> 即使用大顶堆&#xff0c;即队首为最大元素greater<储存的数据类型&…

DSP课程学习

Some Problem warning #10210-D: creating “.stack” section with default size of 0x400; use the -stack option to change the default size warning #10210-D: creating “.sysmem” section with default size of 0x400; use the -heap option to change the default si…

153.乐理基础-和弦的织体

内容参考于&#xff1a;三分钟音乐社 上一个内容&#xff1a;152.广义的、实际的原位与转位、转位的意义 上一个内容里练习的答案&#xff1a;和弦的标记有很多种表示法不一定非要和下图中一样&#xff0c;具体参考150.和弦固定标记法&#xff08;一&#xff09;原位三和弦、…

布料放大100倍后是什么样子

说明 生活中绝大多数面料都是人造化学材料做成的。将纺织面料放大100X以上看到的样子都是那种塑料的感觉&#xff0c;和宏观的外观差别很大。我最近在做这方面的事情&#xff0c;这里分享几张布料的放大图片。 放大图片 这些布料看上去都很普通&#xff0c;但是放大后各有特…

【vue核心技术实战精讲】1.1 Vue开篇介绍 + 1.2 Vue的起步 和 插值表达式

文章目录 准备开始适应人群vue 框架学习路线一、vue 基础1、历史介绍2、前端框架与库的区别? 二、vue的起步 和 插值表达式Stage 1&#xff1a;下载包&#xff0c;并放入项目中Stage 2&#xff1a;编码 准备开始 适应人群 有一定的HTML/CSS/JavaScriptES6基础开发人员 vue …

RIPGeoo代码理解(一)preprocess.py(预处理数据集并为模型运行执行IP聚类)

代码链接:RIPGeo代码实现 一、导入各种模块和数据库 # Load data and IP clusteringimport math import random import pandas as pd import numpy as np import argparse from sklearn import preprocessing from lib.utils import MaxMinScaler 加载数据和IP聚类,这些导…
最新文章