第七季-制作一款塔防游戏

  • 01.塔防前言
    • 为什么是塔防?
    • 准备
  • 02.使用TileMap创建地图
    • 新建地图
    • 获取地图
    • 编辑地图
    • 代码操控
    • 运行
  • 03-16.实战中
  • 04.状态机
    • 代码
  • 08.事件分发器
  • 13.优化子弹-对象池
  • 1.9→2.0 Api
  • 技巧方法总结
  • 问题及解决方法

01.塔防前言

终于实战了,耶!

为什么是塔防?

1. 单机
2. 多元素
3. 与大型游戏架构设计类似
4. 与前面的知识结合

准备

  1. TileMap
    历史版本下载
  2. 前面的知识已经掌握

02.使用TileMap创建地图

新建地图

出现如图选项,点击"新建地图"

弹出

注意地图大小和块大小,已知我们需要的地图大小为2048x1536.所以要调整块大小和块数保证结果和需求一样.
(当然,如果想块大小改为32x32,块数也相应调整也是可以的,但duck不必)


点击"另存为",注意一定要将文件存在工程的asset目录下.
我的目录:C:\StudySpace\cocosCreator\KindomRush\assets\Levels命名为"level1"

获取地图

点击新建新图块
源:要选择工程目录下的地图图片,检查下块尺寸没有问题,同样另存为到工程目录Level下,命名为"level1"

将图块印到地图到上
按shift选择多个图块,左键印上,右键取消

编辑地图

右侧菜单栏新建对象层

对象层用于创建一些特殊的点

创建放塔点

代码操控

在creator里创建场景,并添加一个tileMap节点,将制作的地图资源放入.

将塔图片添加到场景下.

在代码里获取地图数据并操作图片位置
注意tileMap和creator坐标系不同

import Utils from "./Utils";const {ccclass, property} = cc._decorator;@ccclass
export default class SelectLevels extends cc.Component {@property(cc.TiledMap)map: cc.TiledMap = null;@property(cc.Sprite)sprite: cc.Sprite = null;onLoad () {this.setSpriteToMapPos();}//将sprite放到map中标记的位置setSpriteToMapPos() {/**tileMap里设置的对象层 */let towers = this.map.getObjectGroup("towers");/**对象层里设置的标记点 */let tower0 = towers.getObject("tower0");/**标记点的坐标 */let tower0Pos = tower0.offset;this.sprite.node.position = Utils.tileCoordForPositon(this.map,tower0Pos);}
}

将可重复利用的函数放到工具类里

/**工具类 */
export default class Utils {/**将tileMap坐标转换为cocos坐标* cocos锚点为(0.5,0.5)*/static tileCoordForPositon(map: cc.TiledMap,pos: cc.Vec2): cc.Vec2 {/**获取地图有多少个地图块(32x64) */let mapSize = map.getMapSize();/**获取地图块的大小 */let tileSize= map.getTileSize();let x = pos.x - (mapSize.width * tileSize.width) / 2;let y = (mapSize.height * tileSize.height) / 2 - pos.y;return cc.v2(x,y);}
}

运行

塔被放到了指定的位置了

03-16.实战中

实战写文档就太麻烦了,写完后贴源码吧~
有些新知识,遇到的问题会贴过来的

04.状态机

状态机会管理一些状态,状态之间可以互相转换

代码

/**
**Author: Cai QiuYa
**Describe: 状态机
*/export default class GameActorStatusMachine {currentStatus: GameActorStatusBase = null;/**状态切换 */onStatusChange(status: GameActorStatusBase) {if (this.currentStatus != status) {if (this.currentStatus) {this.currentStatus.onExitStatus();}this.currentStatus = status;status.onEnterStatus();}}
}/**状态基类 */
export class GameActorStatusBase {status: GameActorStatusType = GameActorStatusType.None;//进入状态时onEnterStatus() {}//退出状态时onExitStatus() {}}export class GameActorStatusIdle extends GameActorStatusBase {status = GameActorStatusType.Idle;
}export class GameActorStatusWalk extends GameActorStatusBase {status = GameActorStatusType.Walk;
}export class GameActorStatusAttack extends GameActorStatusBase {status = GameActorStatusType.Attack;
}export class GameActorStatusDie extends GameActorStatusBase {status = GameActorStatusType.Die;
}/**状态枚举 */
export enum GameActorStatusType {None,/**空闲状态 */Idle,/**走路 */Walk,/**攻击 */Attack,/**死亡 */Die,
}

08.事件分发器

和之前的监听者模式类似

13.优化子弹-对象池

1.9→2.0 Api

视频里老师用1.9和我的2.0的api有些不同

//1.9
this.moveDir = cc.pNormalize(cc.pSub(this.nextPathPoint,this.machine.actor.node.position));
//2.0
this.moveDir = (this.nextPathPoint.sub(this.machine.actor.node.position)).normalize();
//将弧度变成角度 2π=360
//1.9
cc.pToAngle();
//2.0
cc.misc.radiansToDegrees();
//根据起始结束两坐标点获取行进方向
//1.9
let angle = cc.radiansToDegress(cc.pToAngle(cc.pSub(to,from)));
//2.0
let angle = -cc.misc.radiansToDegrees((to.sub(from)).signAngle(cc.Vec2.RIGHT));
//获取两向量距离
//1.9
cc.pDistance(v1,v2);
//2.0
(v1.sub(v2)).mag();
//向量乘以系数 mult系数
//1.9
cc.pMult(v1,mult);
//2.0
v1.mul(mult);

技巧方法总结

  • 比如当我们需要获取tileMap里的多边形路径各坐标,但是不知道怎么调用,咋办?
    A:我们可以先获取到mileMap的对象,再在浏览器里预览,将对象打断点获取对象信息.这样就可以知道怎么获取坐标了.

问题及解决方法

  • TexturePacker合的图默认会将透明像素裁剪掉,但我并不希望裁剪掉?

A

  • 使用requireComponent报错没有这个字段
    A: 需要将文件引用一下

    const {ccclass, property, requireComponent} = cc._decorator;
    

    或者

    import requireComponent = cc._decorator.requireComponent;
    

零基础学CocosCreator·第七季-制作一款塔防游戏相关推荐

  1. 零基础学CocosCreator·第六季-常用编程框架和算法

    第六季-常用编程框架和算法 01.MVC架构 MVC的含义 02.单例模式 单例(instance)的特点 作用 实现 调用 结果 补充 03.观察者模式-订阅发布模式 流程 实现 结果 04.工厂模 ...

  2. unity制作一款塔防游戏

    文章目录 介绍 寻路系统 怪物生成器 制作3种初级炮台.3种升级炮台 设置炮台属性 选择炮台,添加监听事件 炮弹追踪攻击敌人 拖动鼠标实现相机视角转换 鼠标光标放在cube上变色 文字动画 介绍 关键 ...

  3. 零基础学Arcgis(七)|空间数据采集与管理(4)数据检查

    写在前面的话: B站搜索"中图地信"便可观看全套71章节详细操作视频(有操作数据获取,同步学习) (一)创建地理数据库拓扑 1.创建地理数据库拓扑 [1]设计拓扑: [2]启动Ar ...

  4. 零基础学Arcgis系列教程

    教程地址:点击查看 零基础学Arcgis(七)|空间数据采集与管理(4)数据检查 (一)创建地理数据库拓扑 1.创建地理数- 零基础学Arcgis(六)|空间数据采集与管理(3)数据编辑 (一)使用要 ...

  5. 微信塔防小游戏开发教程,唤境引擎制作塔防游戏分享

    今天带来的是塔防游戏制作攻略! 点击这里来下载工程文件, 点击这里可以下载工程中所用的素材哦~ 预览状态时敌人会从四个生成点随机生成,并且会自动寻路绕过黑色墙体走向红色终点.点击黑色墙体可以创建炮塔, ...

  6. 【零基础学Java】—类的定义(七)

    [零基础学Java]-类的定义(七) 一.事物与类的对比 现实世界的一类事物 属性:事物的状态信息 行为:事物能够做什么 Java中用class描述事物也是如此 成员变量:对应事物的属性 成员方法:对 ...

  7. 零基础学Python课后实战第七章

    零基础学Python课后实战第七章 tips 实战一:修改手机默认语言 实战二:给信用卡设置默认密码 实战三:打印每月销售明细 tips 对象:对象是事物存在的实体,如一个人. 通常将对象划分为两部分 ...

  8. 零基础学python全彩版实战答案-零基础学Python(全彩版)

    商品描述: 本店出售的图书均是正版二手书,有一些笔记划线,基本是六-九品新左右,基本都没有光盘.介意者请提前咨询客服.本店所有书籍,因买家导致退货退款的,发出运费参照不包邮运费模板由买家承担.如果签收 ...

  9. 零基础学python全彩版答案-零基础学Python(全彩版)

    商品描述: 本店出售的图书均是正版二手书,有一些笔记划线,基本是六-九品新左右,基本都没有光盘.介意者请提前咨询客服.本店所有书籍,因买家导致退货退款的,发出运费参照不包邮运费模板由买家承担.如果签收 ...

最新文章

  1. [leetcode]Search in Rotated Sorted Array @ Python
  2. sftp工具都有哪些_色彩校正的工具都有哪些?
  3. 【 MATLAB 】nextpow2 函数用法之 Optimize FFT with Padding
  4. Pair Programming 1 (Casual Game) 曹竹 杨牧 贪吃蛇游戏扩展 Blog Report
  5. mysql float 精度阶段_mysql下float类型使用一些误差详解
  6. android sdl,Android下SDL2实现五子棋游戏
  7. python实现文件共享_基于Python的分布式文件共享系统的实现
  8. [ACM_几何] F. 3D Triangles (三维三角行相交)
  9. sum problem
  10. 9、从命令行运行postman脚本及生成测试报告
  11. iOS开发UI篇—无限轮播(循环展示)
  12. SpringBoot的报错找不到Mapper(解决:required a bean of type com.xxx.mapper.UserMapper that could not be found)
  13. 试问甘心从年少轻狂到一事无成吗?
  14. APP产品经理(一)
  15. Excel 2010 VBA 入门 064 按照关键字批量创建超链接
  16. 王权富贵:使用pytorch复现Fater-RCNN
  17. Python(一)为什么要学习Python
  18. 什么软件支持什么格式
  19. 继续改进版臭事百科爬虫20160921
  20. 字典、元组、字符串习题

热门文章

  1. 问题 G: 小泉的难题
  2. 浅析电力大数据安全现状及防护思路
  3. 卡通动漫Mac动态壁纸5K
  4. 加盟店铺管理门道多,国内十大加盟店管理软件来帮你!
  5. 一次卸载所有python包(第三方库)
  6. 测试用例设计方法有哪些?举例说明
  7. 《Netty实战-写一个RPC应用》
  8. 视频中有水印怎么去掉 如何去水印
  9. 秋招春招,网申在线测评中的智力测试
  10. 渗透测试之红队项目日常渗透笔记