创建了两个对象池的问题。

新手求教。我创建了两个对象池,一个负责管理子弹,一个负责管理怪物。
现在我想通过cc.pDistance判断子弹实例和怪物实例的距离,如果小于一定数值,就将怪物和子弹put重新put到对象池中。应该怎么样拿到实例?求给个思路。

:joy:木有人啊

个人认为你描述的不够清楚明白,比如

你要拿到谁的实例?

你是自己写的对象池还是creator的对象池?

就是creator的对象池,NodePool。我在一个挂在Canvas主逻辑的脚本中创建了两个NodePool,一个是子弹的,一个是怪物的。然后创建了两个Prefab,也是一个子弹,一个怪物。一开始,我想在其中一个,比如说我在子弹的脚本中,通过获取节点位置和怪物位置坐对比,但是不知道怎样获取怪物的,因为应该是有很多实例在同时生成。如果是在主逻辑里,应该是有很多实例同时生成,又没法判断。
其实我就是想知道,就是类似飞机大战那种,应该也是有两个对象池吧,一个子弹,一个怪物,这种碰撞应该是什么样的实现思路?

我只能想到两种办法:joy:

1.在子弹和怪物的prefab上添加碰撞框

http://cocos.com/docs/creator/physics/index.html

2.每个子弹(怪物)遍历一次所有怪物(子弹),不过我觉得这个可能比较慢

所以如果是我我就用碰撞框

肯定还有其他更好的办法,不过我比较笨:joy:

对象缓冲池是用来回收不需要的对象的,不是用来管理场景中对象的。下面提供一个可行的使用方式:

  1. 使用两个数组来分别管理你的子弹和怪物
  2. 每帧遍历两个数组来比较适否发生碰撞(使用碰撞组件性能是类似的)
  3. 当 怪物/子弹 死亡或者从屏幕消失后,使用 NodePool 的 put 分别 put 到相应的缓冲池中,表示你不再需要这个对象
  4. 当你需要生成新的 怪物/子弹(比如触发射击事件,或者生成怪物逻辑)的时候,从缓冲池中获取一个对象(如果缓冲池返回空,表示池子空了,需要 instantiate 一个新的)

谢谢。以前没接触过开发,做着玩的,说的不太明白。
刚才忘了说了,我之前试了一下碰撞框,不过理解能力太差了,文档没太看懂:joy:。出现了问题。
我的步骤是给子弹和怪物的Prefab都加上了多边形的碰撞框,然后在两个各自的组件开启碰撞系统。然后在其中添加了
onCollisionEnter: function (other, self) {}这个方法。
然后我的主逻辑是Game.js。在Game中,我写了一个各自将子弹或怪物put进对象池的方法。我将这个Game组件实例分别传入了子弹组件和怪物组件了,在这个onCollisionEnter: function (other, self) {}碰撞开始时调用,发现碰撞时确实可以消失。但是出现了突然有一个生成的怪物加快了,或者是生成的子弹加快了的问题。不知道是为什么:joy:

看楼上panda大大的回复:grin:

:grin:

谢谢指导,我写一下试试。

搞定了:grin:。而且也知道刚才的问题所在了。将不用的对象进行put操作时,不会调用cleanup(),导致了他的动作还在操作,出现了问题。

cleanup 不仅会删除动作,还会做很多清理工作,所以默认没有去处理,需要用户手动清理一下需要回收的对象