cocos creator主程入门教程(九)—— 瓦片地图

2023-11-18

这一篇介绍瓦片地图,在开发模拟经营类游戏、SLG类游戏、RPG游戏,都会使用到瓦片地图。瓦片地图地面是通过一个个地砖拼起来的,又分为45度角和90度角两种。45度角俗称2.5D,每个格子都是菱形,而90度角每个格子都是正方形。

瓦片地图一般包括以下图层(不一定同时存在,例如一般RPG游戏没有背景和自由装饰层):

1.背景层(大图拼接的背景)

2.地形层(瓦片格子拼接的地形)

3.建筑层(按瓦片格子摆放的建筑、地面物品、角色)

4.自由装饰层(云朵、烟雾)

除此以外,还需要提供隐藏的层用于编辑数据,控制游戏逻辑,例如阻挡、摆放区域等,称为数据层。其中需要瓦片布局的有3种图层:地形层、建筑层、数据层。

 

先来说说背景层BgLayer,背景层在美术设计里是张完整的大图,为了避免连续内存太大导致加载失败,把大图打碎成等大小的小图拼接。一般出于性能考虑,小图长宽选择为1024、512、256、128。

设置背景需要提供背景的小图数组,列数,每张小图的宽高

public setPieces(fileArr: Array<string>, colCount: number, pieceW: number, pieceH: number, loadAtOnce: boolean = true): void {}

如果是在H5平台,要考虑资源的逐步加载。所以在H5平台该方法最好只是做占位,提供方法进行资源加载

public loadPiece(file: string) {}

除了加载外,由于玩家在移动地图时只看到背景的一部分,不在视窗内的应该裁剪掉,所以还要提供方法对背景进行裁剪

public setViewPort(x: number, y: number, w: number, h: number): void {}

完全不在视窗的小图,通过removeFromParent从渲染列表移除。

 

接下来说说基于瓦片布局的图层。基于瓦片的图片我们会摆放一些物品,例如地形层的地形块、建筑层的建筑、地面物品、角色。所以在介绍瓦片布局的图层前,先介绍下地图里的物品。一般包括:

1.地形块

2.建筑、地面物品

3.角色

4.编辑数据

 

先设计一个基类MapItem,定义物品的基本属性:格子位置、宽高占格子数、是否可穿越、可否编辑

export class MapItem extends cc.Component {
    protected mGridX: number = 0;
    protected mGridY: number = 0;
    protected mRow: number = 1;
    protected mCol: number = 1;
    protected mCanPass: boolean = true;
    private mEditable: boolean = true;
    private mIsLock: boolean = false;
}

地形块主要是显示一张一格大小的图片,一般会先把这些地形图片合成一张大图,按照格子大小等分。设计一个TileSet类定义这张合图的结构

export class TileSet {
    private mId: number = -1;
    private resPath: string = null;
    private tex: cc.Texture2D = null;
 
    private gridW: number = 0;
    private gridH: number = 0;
    private row: number = 0;
    private col: number = 0;
}

每个地形块Tile引用TileSet里的资源

export class Tile extends MapItem {
    private mSpr: cc.Sprite = null;
    private mId: number = 0;
    private mTileSetId: number = 0;
    private mIdx: number = 0;
}

当然,如果希望地面有帧动画,也可以让Tile保存一个帧系列,按顺序切换mSpr的spriteFrame属性。

 

建筑要考虑建筑、地面物品的方向和操作

export class MapBuilding extends MapItem {
    protected mId: number = 0;
    protected mType: number = 0;
    protected mResType: number = 0; // 0 image, 1 spine
    protected mResPath: string = null;
    protected mDir: number = 0;
    protected mReverse: boolean = false;
}

为了区分摆放和旋转点,我会给MapBuilding添加两个子节点,因为在45角地图摆放建筑时,一般以右下角格子做摆放参考点,但是旋转是以左上角格子为参考。

需要注意,在H5平台,建筑的图片资源应该是动态加载的,在地图移动时逐渐加载显示。所以要提供接口对资源进行加载。

public loadRes(): void {}

还有点击范围,图片是矩形的,点击的时候可能是点到了图片的空白区域,这时后玩家看到的是点击了后面的建筑,如果没有处理透明区域剔除,实际判断却是点击了前面的建筑。对于图片资源的建筑在H5平台,可以通过使用该图片相同位置,截取点击区的一个像素,模拟画在屏幕该地方,如果getImageData获取的data[3]不是0,说明点击到了该建筑,否则是点击了空白区。

 

角色都是spine动画,是可以运动的物体,需要路径、速度相关的属性

export class MapActor extends cc.Component {
    protected mActorId: number = 0;
    protected mResPath: string = null;
 
    protected mRoadGrids: Array<cc.Vec2> = []; // 路径
    protected mCurRoadIdx: number = 0;
 
    protected mSpeed: number = 0; // 设置的行走速度, 跟x方向速度绝对值一样
    protected mSpeedX: number = 0; // 实时行走X速度
    protected mSpeedY: number = 0; // 实时行走Y速度
 
    protected mTestActor: boolean = false;
    protected mIsKeepRoad: boolean = false;
    protected mIsPauseWalk: boolean = false;
}

编辑数据是不可见的,只有基本的位置信息和相应数据

export class MapDataItem extends MapItem {
    private data: any = null;
}

瓦片布局的图层有一个基类,负责物品MapItem的添加、删除、查询等操作

/**
 * 基于地砖的图层基类
 * 定义基于地砖图层基本数据和接口
 */
export abstract class TileBaseLayer extends cc.Component implements GestureListener {
    protected mRow: number = 0;
    protected mCol: number = 0;
    protected mGridW: number = 0;
    protected mGridH: number = 0;
    protected mMapItems: Array<MapItem> = [];
 
    protected mOriX: number = 0;
    protected mOriY: number = 0;
}

对于90度角的地图,没有太多复杂的地方需要处理。点击点到格子的映射是简单除以宽、高。遮挡是从左往右,从上到下设定zorder。

对于45度角的地图,点击点到格子的映射需要用到解析几何

 

每个点击点,按照格子宽高比的斜率经过该点作直线,到经过点(oriX,oriY)平行于x轴的直线都有交点,而且交点的距离等于格子的宽度。所以,交点相对于点(oriX,oriY)的距离(x - oriX)可以判断该点属于哪行或哪列。对于行,交点可以通过(oriY - touchY)* (gridW / gridH) - (touchX - oriX)。对于列,交点可以通过(touchX -  oriX) + (oriY - touchY)* (gridW / gridH)。(平行、三角形中同样大小的角的对边比邻边比例一样)

角色起始在格子中心点,行走的时候,按照格子的宽高比,把速度分解为x、y两个方向,这样角色就能沿着格子走下去。每次走到格子中心时才做站立、继续行走的处理。

 

遮挡方面,45度角依然是从上到下遮挡

 

要注意的是,建筑占多格,而设置遮挡时只能设置zorder,所以采用的是中心位置方式,把建筑中心格子作为zorder的参照。角色在地图中行走的时候,按上图的规则修改角色的zorder,建筑的zorder一直不变。

自由装饰层没有摆放限制,可以放置云朵、雾等动画,增加层次感。

 

瓦片地图先说到这里,下一篇我们将介绍A*寻路算法。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

cocos creator主程入门教程(九)—— 瓦片地图 的相关文章

  • CocosCreator学习1-按钮点击

    Cocos Creator小白学习 实现button点击事件 关于cocos creator 本人就是小白一个 xff0c 什么都不会 xff0c 只能慢慢从头开始摸索着来 xff0c 自己也希望能够在写自己的学习过程中 xff0c 能够给
  • cocosCreator 节点坐标和世界坐标的转换

    问题描述 同一个层上的不同节点下的元素移动 在C这个层上面有两个节点A和B 现在我想把A下的一个临时创建的节点移动到B下 这个时候 第一想到的是 获取两个创建的节点的坐标 然后cc Move 但是实际的效果不是这样的 元素都不知道移动到那里
  • CocosCreator Java传参数到JS

    最近正在接GooglePlay内购 在传参数回CocosCreator的环境的时候 没有调用到JS的方法 其中错误的写法是 app runOnGLThread new Runnable Override public void run Co
  • 【Cocos谁学谁会】定制属于自己的脚本模板

    版权申明 本文原创首发于以下网站 您可以自由转载 但必须加入完整的版权声明 博客园 https www cnblogs com MogooStudio csdn博客 https blog csdn net nmjkl001 知乎 https
  • cocos cretor shader effect-the book of shader前言

    前言 说来惭愧 半年前开始接触cocso creator shader的时候 看了官方教程 看了大神写的例子 搞懂了一些语法概念 可是当时看一遍有种似懂非懂的感觉 那种感觉就是听过很多道理 任然过不好一生 在cocos论坛里有大神也分享过自
  • CocosCreator3.8研究笔记(十四)CocosCreator 资源管理Asset Manager

    在游戏的开发过程中 需要使用到大量的图片 音频等资源来 从而带来管理上的困难 Asset Manager 资源管理模块具备加载资源 查找资源 销毁资源 缓存资源 Asset Bundle 等功能 帮助开发者管理其资源的使用 一 资源的加载
  • CocosCreator中的Prefab文件格式总结

    CocosCreator所有的Prefab都是以下类似的格式 我们学会用文本编辑器查看Prefab文件 可以帮助我们更轻松的查找节点 查看节点和组件信息 批量修改节点和组件信息等等 因为在文本编辑器中的Prefab文件才是原始的 而且Coc
  • CocosCreator3.8研究笔记(十五)CocosCreator 资源管理Asset Bundle

    在资源管理模块中有一个很重要的功能 Asset Bundle 那什么是Asset Bundle 有什么作用 怎么使用 Asset Bundle呢 一 什么是Asset Bundle 有什么作用 在日常游戏开发过程中 为了减少游戏启动时 资源
  • CocosCreator中TiledMap简单使用

    在开发游戏过程中 有时候会用到TiledMap 瓦片地图 我这边使用的是1 4 3版本的tiledmap 2 3 4版本的CocosCreator 其他版本的tiledmap会有做不了动画的问题 后面会说到 视频参考 B站UP主 阿信OL
  • Rot.js 随机地牢,迷宫地图生成

    js 插件随机地牢 迷宫地图生成 插件git https github com ondras rot js tree master dist 使用 1 我们的游戏是在网页内进行的 一个基本的 HTML 文件就足够了
  • 【CocosCreator入门】CocosCreator组件

    Cocos Creator 是一款流行的游戏开发引擎 具有丰富的组件和工具 其中Spine 是一个基于骨骼系统的 2D 动画工具 它可以让开发者通过对骨架和关键帧的调整来制作出更加自然 流畅的动画效果 Cocos Creator 支持使用
  • CocosCreator ios 使用sdl库找不到arm64指令集

    关于sdl如何打包成ios库 android库的问题 之后会有相关文章介绍 现在先说一下CocosCreator在使用xcode运行过程中 会报的一个错 Undefined symbols for architecture arm64的错误
  • mvvm设计模式总结

    要了解mvvm 首先要了解mvc和mvp 我们也先简单说一下mvc和mvp MVC MVC全名是Model View Controller 是模型 model 视图 view 控制器 controller 的缩写 一种软件设计典范 用一种业
  • CocosCreator3.0加载远程图片资源

    在微信小游戏平台 需要获取了微信头像 对于这个需求 需要这样来做 获取微信用户信息 得到微信小游戏头像的http地址 在Cocos引擎使用loadRemote来加载 这其中的问题在于 使用loadRemote加载时获得的对象和2 x的版本不
  • 解决window平台下cocos creator 构建发布面板打开后无法显示问题

    项目场景 creator构建发布界面 问题描述 window平台下cocos creator 构建发布面板打开后无法显示 原因分析 项目的配置文件目录setting和local目录内容混乱可能会导致该问题 这时候后重装creator也是没用
  • CocosCreator JS追踪堆栈信息

    在开发过程中 可能有这样的需求 即使在没有报错的情况 也需要查看该函数的堆栈调用信息 对于这样的需求 我们可以使用JS原生的console trace来实现 具体代码 export let TraceArr console trace fu
  • cocos creator v3.6版本使用Intersection2D模块的circleCircle方法

    在cocos creator v3版本中Intersection2D模块的circleCircle方法可以用来检测两个圆形是否相交 该方法可以实现的功能有 cocos creator吸铁石实现 cocos creator物体在固定位置吸附
  • Cocos Creator 如何处理物理和碰撞检测?

    Cocos Creator 如何处理物理和碰撞检测 cocos creator 版本 v3 6 1 Cocos Creator 3 x 实现碰撞检测 Cocos Creator 通过使用物理引擎来处理物理和碰撞检测 Cocos Creato
  • CocosCreator波浪Shader

    waveEffect effect Copyright c 2017 2020 Xiamen Yaji Software Co Ltd CCEffect techniques passes vert sprite vs vert frag
  • CocosCreator列表scrollview滑动速度的修改,鼠标滚动速度修改

    由于cocos creator 在pc端 使用scrollview 鼠标滚动速度太慢 原文地址 CocosCreator列表滑动速度的修改 简书CocosCreator列表滑动速度的修改 简书引擎版本 2 2 2 之后升级的2 4 0直接可

随机推荐

  • Matlab中实现图像处理的工作流程

    一 识别流程 Receipt Identification Workflow Working with Images in MATLAB Import display and manipulate color and grayscale i
  • Angular4.0_完善在线竞拍应用路由

    路由实战思路 一 创建商品详情组件 显示商品的图片和标题 使用Angular命令行工具生成一个新的组件 ng g component productDetail product detail component ts import Comp
  • latex Elsevier 模板给作者加脚注

    Elsevier 模板给作者加脚注 thanks 无效 网上有说使用 corref cor1 cortext cor1 Corresponding author 但是实测发现不行 只能加一个标注 再加一个就是两个 还有说使用 authorn
  • SVM算法(Support Vector Machine)

    一 SVM 支持向量机 support vector machines SVM 是一种二分类模型 将实例的特征向量映射为空间中的一些点 SVM 的目的就是想要画出一条线 以 最好地 区分这两类点 以至如果以后有了新的点 这条线也能做出很好的
  • GIT reset

    Git Reset 转载Git Reset reset 用于回退commit 主要有三个参数 hard mixed soft working工作区 cache暂存区 repository本地库 hard 清空 清空 清空 mixed 保留
  • window系统启动redis和清除缓存

    一 启动redis dos命令行方式 c user john gt d 进入所在盘 D gt cd D Redis x64 3 2 100 进入安装目录 D gt cd D Redis x64 3 2 100 gt redis server
  • git提交新项目操作笔记

    git提交新项目操作笔记 1 本地安装git环境 下载安装包安装即可 2 初始化git项目 生成 git 配置目录 进入项目根目录 右键 git bash here打开控制台 输入git init即可完成 3 将项目加入本地git仓库 gi
  • fork()函数详解

    一个进程 包括代码 数据和分配给进程的资源 fork 函数通过系统调用创建一个与原来进程几乎完全相同的进程 也就是两个进程可以做完全相同的事 但如果初始参数或者传入的变量不同 两个进程也可以做不同的事 一个进程调用fork 函数后 系统先给
  • 'gbk' codec can't decode byte 0xae 解决方法

    gbk codec can t decode byte 0xae 解决方法 今天使用python 读取txt的时候出现了如下报错 Message gbk codec can t decode byte 0xae in position 32
  • python一球从100米高度自由落下,一球从100米高度自由落下,每次落地后反跳回原高度的一半;再落下,求它在 第10次落地时,......

    首先一开始想到的就是用循环来计算的 所以就写了以下代码 include include include define H 100 define N 10 int main void int i 1 float weiyi distance
  • SVN安装及使用教程图文详解

    一 SVN简介 1 什么是SVN SVN全名Subversion 即版本控制系统 SVN与CVS一样 是一个跨平台的软件 支持大多数常见的操作系统 作为一个开源的版本控制系统 Subversion管理着随时间改变的数据 这些数据放置在一个中
  • 树莓派安装TensorFlow并使用[一步到位]

    树莓派安装TensorFlow并使用 一步到位 安装TensorFlow并使用 树莓派3B 树莓派安装TensorFlow并使用 一步到位 换源并更新 安装TensorFlow依赖包 安装TensorFlow并使用 各种问题 换源并更新 安
  • 帮我使用pytorch和opencv实现根据双目视差图生成点云

    可以使用OpenCV库读取双目图像 并使用SGBM算法或BM算法计算视差图 然后 可以使用OpenCV的reprojectImageTo3D函数将视差图映射到三维空间中 生成点云 以下是代码示例 import cv2 import nump
  • 基于libtorch的LeNet-5卷积神经网络实现(2)--Cifar-10数据分类

    上篇文章中我们使用libtorch实现了LeNet 5卷积神经网络 并对Minst数据集进行训练与分类 本文我们尝试使用该实现的网络对更加复杂的Cifar 10数据集进行训练 分类 基于libtorch的LeNet 5卷积神经网络实现 Le
  • OpenCV(五)——运动目标识别

    课程一览 目录 1 摄像头调用 2 视频的读取与保存 3 帧差法 4 光流法 5 背景减除法
  • ERROR: FPM initialization failed

    出错的原因主要是 usr local php5 sbin php fpm配置错误 仔细检查下 我的错误就是group www这里少了 号 所以出错了 root localhost usr local php5 sbin php fpm PH
  • 服务器系统巡查登记表,信息设备巡检记录表

    信息设备巡检记录表 由会员分享 可在线阅读 更多相关 信息设备巡检记录表 2页珍藏版 请在人人文库网上搜索 1 信息设备巡检记录表 检査人 检査时间 年月日 一 机房环境尺周边设缶 枪杏顶 结论 情况摘要 枪杏顶 结论 情况摘要 溫度 正常
  • MCS-51 汇编指令集(J开头的指令)

    MCS 51系列单片机指令以J开头的指令有8条 分别为 JB bit rel JBC bit rel JC rel JMP A DPTR JNB bit rel JNC rel JNZ rel JZ rel 1 JB bit rel 指令名
  • 计算机设置桌面文件夹,win10电脑怎么更改桌面文件夹路径

    win10电脑怎么更改桌面文件夹路径 我们在使用电脑的时候 在桌面上保存的文件一般都默认在C盘 今天小编跟大家分享下win10电脑怎么更改桌面文件夹路径 具体如下 1 首先我们打开电脑 找到 我的电脑 双击打开 2 进入主界面之后我们选中
  • cocos creator主程入门教程(九)—— 瓦片地图

    这一篇介绍瓦片地图 在开发模拟经营类游戏 SLG类游戏 RPG游戏 都会使用到瓦片地图 瓦片地图地面是通过一个个地砖拼起来的 又分为45度角和90度角两种 45度角俗称2 5D 每个格子都是菱形 而90度角每个格子都是正方形 瓦片地图一般包