200字范文,内容丰富有趣,生活中的好帮手!
200字范文 > 使用建造者模式做一个密室逃脱类游戏

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

时间:2019-04-12 18:33:43

相关推荐

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

最近连续做了两个密室逃脱类的游戏,分别使用了两种不同的代码构建思路。第一种就是像常规那样子去每一关写画一个单独的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);

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。