最近连续做了两个密室逃脱类的游戏,分别使用了两种不同的代码构建思路。第一种就是像常规那样子去每一关写画一个单独的UI,然后再配上对应的脚本,再添加上点击动画,效果。第二种使用的是建造者模式,将游戏中每一个控件,比如说桌子啊,沙发什么的单独写出来。然后在构建游戏的时候创建一个通用的场景,根据关卡和配置的参数加载进本关的一些控件。

一开始公司考虑的是要上微信小程序,微信小程序限制包体只能在4M,服务器可以放4M资源,但是我们又没有服务器。所以就要把所有的资源限制在4M以内。再这样的前提下我选择了建造者模式,至少它不需要构建那么多不同的场景层。不过这样做的话就要布一个很大的框架,代码冗余显得很重,但是好处也是显而易见的,随着关卡的增加,你会越做越快,因为这种密室逃亡类的游戏一般资源的复用率很高,并且在代码上的改动什么的也可以很快的定位到。你需要的只是每一关的关卡配置信息,然后加载相应的控件。不幸的是我这个游戏,只让我做了15关,费尽心力终于到了可以轻松做下去的时候,却要停下来。资源代码也控制在了4M以下。然后还突然说不上微信了,换做另一款游戏。不同的风格,不同的布局,又要再搭一遍框架。这一次我没有选择建造者,而是用了最原始的,反正又是十五关,布那么大个局浪费。写个关卡基类,继承 ,拓展,仅仅用了五天就完成了新游戏并接入了广告和SDK。虽然也存在这种游戏做起来难度不大的原因。

在游戏中我们会得到相应的物品,然后使用物品去做一些操作。物品栏是必须的。

物品栏我是使用的创建几个固定大小的空的父节点,然后得到物品的时候把得到物品的名字通过事件冒过去,然后遍历这几个父节点,找到第一个没有子节点的父节点,动态生成一个并添加上去,加载相应的图片。创建一个图片,需要首先创建一个节点,然后在这个节点上增加组件,cc.Sprite,写好的脚本等等。碰撞的脚本是挂在父节点上的,移动什么的也是挂在父节点上。图片只负责展示这是什么东西。

getGameItem(event){

var self = this;

var childrenList = self.itemList.children;

var str = "itemRes/" + event.detail.msg;

cc.loader.loadRes(str,cc.SpriteFrame,function(err,spriteFrame){

for(var i = 0; i < childrenList.length; i ++){

if( childrenList[i].children.length == 0){

var newNode = new cc.Node();

newNode.addComponent(cc.Sprite);

newNode.getComponent(cc.Sprite).spriteFrame = spriteFrame;

newNode.addComponent("Common_shakeForever");

childrenList[i].addChild(newNode);

//如过加载的尺寸大于 父节点尺寸 缩放      要跟美术沟通  不能做的太大 如果都是一样的尺寸 这里是不需要的

//但是这里等比缩小是不会失真的,而且尺寸也没有大很多,就没有麻烦美术了。

if(newNode.width > childrenList[i].width || newNode.height > childrenList[i].height){

newNode.scale = 0.7;

} if(newNode.width > childrenList[i].width || newNode.height > childrenList[i].height){

newNode.scale = 0.7;

}

break;

}

}

});

MusicManager.instance.playEffect("getItem");

},

另外要提的一个点就是关于坐标转换的了,一开始我是用了creator中的layout控件,横向排列。然后拖动物品move的时候触发函数跟随移动。

onClickItemMove(event){

var self = this;

if(event.target.children.length != 0){   //这里是一个容错处理,如果父节点没有子节点的话就不处理

var pos = self.itemList.convertToNodeSpace(event.getLocation());

event.target.setPosition(pos);

}

},

但是首先第一个问题就出现了,你会发现物品只能上下移动,左右却不能移动,这里要把layout控件的布局去掉。你也可以选择不使用layout自动布局。不过我一般都是用layout布局好,然后删掉layout自动布局属性。

第二个问题就是坐标系的问题了,点击屏幕的event.getLocation()是基于屏幕左下角的,所以我们物品的父节点的锚点要尽量改成在左下角。当然不改也可以的,只是多加一层计算,把得到的转换到物品栏父节点的坐标在加上一个父节点尺寸的宽度和高度的一半就可以了。

这都是细节问题,如果没有注意到,问题也不是很大,无非就是浪费点时间找到原因罢了。

另外关卡切换或者退出的时候,要移除本关卡的节点。所以尽量一开始的时候创建一个只放控件的空节点,动态生成的都挂在这个上边,移除的时候移除改节点的所有子节点,注意使用removeAllChildren接口时传入一个false。不然这个节点上绑定的一些action会被移除,再次加载进来就不会有action了。

.

this.gameItemParent.removeAllChildren(false);

使用建造者模式做一个密室逃脱类游戏相关推荐

  1. 使用策略模式设计一个动作冒险类游戏

    使用策略模式设计一个动作冒险类游戏 背景 ClassDiagram图 部分代码展示 Client运行展示 背景 动作冒险游戏: 游戏中有一系列角色(Character),包括国王(King).皇后(Q ...

  2. 如果要对传统的互联网模式做一个总结,它依然属于粗放式发展范畴

    如果说资本的退潮,流量的见顶,仅仅只是掐断了传统互联网模式的外在生存环境,那么,以大厂裁员为代表的洗牌,则正在告诉我们,传统意义上的互联网模式正在走向终结.以往,提及互联网,人们首先想到的是「人傻」. ...

  3. 做一个新闻阅读类的app(1): 概要设计

    学习做一个新闻阅读类的app,最简单的,只两个界面 1 列表页,简单列出文章标题,发表时间等列表.列表页内容通过一个http服务,拉取json格式的数据. 2 内容页,展示文章的详细内容. 列表页用L ...

  4. 用 typescript 做一个贪吃蛇小游戏

    typescript 做一个贪吃蛇小游戏 搭建环境 创建 tscofig.json 文件 配置如下 {"compilerOptions": {"target": ...

  5. 利用pgzero做一个接球的小游戏

    利用pgzero做一个接球的小游戏 说明 pgzero为python的一个用于游戏制作的库,它基于pygame模块 可用如下命令去安装 pip install pygame pip install p ...

  6. Easyx图形库+C++做一个贪吃蛇小游戏 数据结构课程设计

    Easyx图形库+C++做一个贪吃蛇小游戏 数据结构课程设计 程序界面 ① 游戏开始界面(如下图): 显示游戏标题,提供"开始游戏"."游戏模式"和" ...

  7. pygame做一个简单的打字游戏

    pygame做一个简单的打字游戏 1.基本代码 下面的代码完成了每一秒在界面的顶部随机生成一个新的字母 # -*- coding=utf-8 -*- import pygame from pygame ...

  8. 用Python代码做一个简单数字小游戏

    #作者是一个十三岁的小男孩. 编辑工具 电脑Python 需要模块 random #今日用代码做一个猜数小游戏 #话不多说,上代码!!! import random number = random.r ...

  9. java建造者模式--给一个你一看就懂的建造者模式

    在开始写这个建造者模式的文章前,我也确实看了挺多次其他介绍这个模式的文章.感觉看了很多次才有一点对建造者模式明白透彻的感觉.细心想来,可能是接口的理解不好,平时工作比较少用到过建造者模式,所以理解的比 ...

最新文章

  1. 涂抹mysql 完整_涂抹mysql笔记-管理mysql服务
  2. 运维的基本知识点及分类工作
  3. 新手引导动画的4种实现方式
  4. mysql8中文排序_mysql中utf8编码的中文字段按拼音排序
  5. MySQL与oracle报错显示_Oracle中判断表是否存在再删除表避免报错与MySql和SqlServer的不同...
  6. 关于AJAX跨域调用ASP.NET MVC或者WebAPI服务的问题及解决方案
  7. js 的prototype 属性和用法,外加__proto__
  8. CSS/HTML/JS实现图片轮播
  9. iOS 知名公司资讯汇集~招聘内推
  10. 【WIN10更改鼠标指针默认图标】
  11. 进击的巨人有趣表情包
  12. 完全卸载 OneDrive / 重装 OneDrive / 解决“已经安装了 OneDrive”
  13. I/O复用 —— select
  14. 数字VR虚拟博物馆的功能介绍
  15. python猜大小游戏,Python实现的摇骰子猜大小功能小游戏示例
  16. JT/T808模拟器、企业压测工具使用
  17. 后厂村折叠:月薪追赶五万,生活低于五千
  18. 力扣 面试题 17.14. 最小K个数
  19. Windows下Java下载与安装,Java第一个程序
  20. Chisel教程——07.详解ChiselTest

热门文章

  1. 龙泉寺贤超法师:用AI为古籍经书识别、断句、翻译
  2. 测试人生 | 为了娃的奶粉钱,测试媛妈妈拿出考研的拼劲,半年终圆大厂梦
  3. GitHub免费开放所有核心功能;告别纸币-央行牵头数字货币
  4. 给零基础初学者推荐的10个Python免费学习网站,赶快收藏
  5. c# 指定打开某个路径下的CMD_Windows小技巧 批处理文件实现目录下文件批量打包压缩...
  6. 京东淘宝,拼多多三大电商平台竞品分析
  7. 容器三把斧之 | namespace原理与实现
  8. python人工智能面试题爱奇艺面试题_经典算法题:爱奇艺研发工程师算法笔试题...
  9. 公积金单位账号和个人账号
  10. SB_5_瑞吉外卖_4_文件上传下载_菜品新增_菜品分页查询_菜品修改