当前位置: 首页 > news >正文

<Godot>工厂游戏练习笔记一<2D网格地图>

1、编写网格数据类,用于存储网格地图中的数据:

class_name Grid2D_Data## 单元格数据,传入一个场景
var data:Resource:set(val):if val != null:data = val
## 网格长宽
var grid_size:Vector2i = Vector2i(10,10):set(val):if val:grid_size = val
## 网格数据
var map_data = []
## 初始化
func _init(p_data:Resource,p_grid_size:Vector2i):data = p_datagrid_size = p_grid_sizepass
## 创建网格数组
func create(parent:Node2D):for x in grid_size.x:var array = []for y in grid_size.y:var grid_data = data.instantiate()grid_data.grid_position = Vector2i(x,y)grid_data.name = "grid%s_%s" % [x,y]parent.add_child(grid_data)array.append(grid_data)map_data.append(array)pass
## 获取指定网格坐标数组
func get_cell(pos:Vector2i):if pos <= grid_size and pos >= Vector2i(0,0):return map_data[pos.x][pos.y]else :return nullpass
## 获取指定列网格
func get_row(x:int):return map_data[x]pass
## 打印网格内容
func show():for x in map_data.size():print(get_row(x))pass## 更改指定网格内容
func set_cell(pos:Vector2i,p_data:Node2D):if pos <= grid_size and pos >= Vector2i(0,0):map_data[pos.x][pos.y] = p_datapass## 获取网格指定角度数据
func get_cell_direction(pos:Vector2i,degress:int):if degress == 0:return get_cell(pos+Vector2i(0,-1))elif degress == 90:return get_cell(pos+Vector2i(1,0))elif degress == 180:return get_cell(pos+Vector2i(0,1))elif degress == 270:return get_cell(pos+Vector2i(-1,0))	else:return nullpass

2、编写单元格数据类型基类,所有单元格场景需要继承该类

class_name Grid_Data ##网格数据基类
extends Node2Dvar grid_position:Vector2i ##网格坐标
var degress:int ##角度
var type:String ##网格类型var sprite:Sprite2D ##图片
## 修改图片大小
func _set_scale(target:Vector2i):var sh = sprite.texture.get_height()var sw = sprite.texture.get_width()var scale_x = target.x / (sh*1.0)var scale_y = target.y / (sw*1.0)self.scale = Vector2(scale_x,scale_y)pass

3、新建一个地图瓦块场景,用于初始化地图

4、添加脚本,继承基类,初始化地图数据

extends Grid_Datafunc _ready():type = "map"sprite = $spritepass

5、新建一个地图场景map,用于初始化地图,调整图片坐标等

6、在场景map下绑定脚本,初始化地图

extends Node2D@export var grid_size:Vector2i=Vector2i(10,10): ##网格大小set(val):if val:grid_size = val@export var cell_size:Vector2i=Vector2i(64,64): ##单元格大小set(val):if val:cell_size = valvar Grid_Map = preload("res://scenes/map/grid_map.tscn")var map_data:Grid2D_Data ##网格数据实例		func _ready():map_data = Grid2D_Data.new(Grid_Map,grid_size)map_data.create(self)for x in grid_size.x:for y in grid_size.y:var grid = map_data.get_cell(Vector2i(x,y))var sprite = grid.spritegrid._set_scale(cell_size)sprite.position = Vector2i((x+0.5)*cell_size.x,(y+0.5)*cell_size.y)pass

7、后续操作通过点击对应的网格,即可以获取到对应网格绑定的坐标,通过坐标获取上下左右的相对关系。


http://www.mrgr.cn/news/12070.html

相关文章:

  • sass样式穿透方式
  • NL2Sql
  • 【Hot100】LeetCode—994. 腐烂的橘子
  • Vue笔记总结(Xmind格式):第二天
  • 【编码解码】CyberChef v10.18.9
  • 《深入浅出WPF》读书笔记.8路由事件
  • 小程序wx:if 和hidden的区别
  • 内存管理篇-13slab、slob和slub分配器
  • 使用Python进行Mock测试详解(含Web API接口Mock)
  • 牛客小白月赛99(A,B,C,D,E,F,G)
  • ios去水印软件免费版,精选五大高效工具,告别水印烦恼!
  • 基于SSM+小程序民宿短租管理系统(民宿1)(源码+sql脚本+视频导入教程+文档)
  • 【STM32】MDK安装
  • 区块链(币圈)常用网址大全
  • Ubuntu下安装NVIDIA-SMI
  • C++:Github开源7.8Kstar的线程池介绍
  • 考研备考是选择电子学习工具无纸化学习?还是纸质版训练考感?
  • 学习笔记——后端项目中的相关技术 【随时更新】
  • x264 编码器 AArch64汇编系列:运动补偿之像素均值处理函数
  • 链表OJ题——使用栈实现单链表的逆序打印