碰到问题,发现碰撞体积有问题:
在战斗主场景调用bullet->getBoundingBox().intersectsRect(monster->getBoundingBox())后,有时怪物未触碰,任然出发死亡事件, 利用DrawNode的drawRect(Vec2(),Vec2(),Color4F())函数,描边出碰撞体积,发现图片素材问题,解决方式:1.更改触碰体积检测数据,缩小怪物的触碰体积检测 2,或者更改图片素材,去掉图片周围无效部分
自己准备两种方法都试试,明天做碰撞体积检测,并联系美术修改图片
其中涉及的技巧:
1.碰撞体积描边,利用cocos固有的DrawNode可以实现效果,也可以使用OpenGL ES 写一个描边函数,以像素点的方式描边(未来尝试)
auto draw = DrawNode::create();
draw->drawRect(Vec2(0,0),Vec2(sp->getBoundingBox().size),Color4F::GREEN);
sp->addChild(draw);
用精灵添加描边,因为DrawNode继承于Node ,精灵添加后,不用考虑单独处理drawnode的缩放和移动,等于和精灵绑定,注意点:NODE添加位置,在精灵缩放和移动前,因为精灵的AnchorPoint 在0.5, getBoudingBox()在缩放后,会改变,导致drawRect绘制大小不准确,缩放前绑定精灵即可
2.精灵处理缩放技巧,可以直接缩放精灵,也可以把精灵装进一个继承于NODE类的自定义类型,然后去缩放自定义类型,都可以达成效果,目前使用缩放精灵方法。
3.intersectsRect 函数处理一般碰撞够用,但是精确碰撞不太行,还是要自己写一个触碰函数,添加预处理效果,处理级别是COCOS帧循环级别,触碰提前 1/60秒,处理两个物体,在两个物体准备发生碰撞的前一帧,调用预处理碰撞函数,在下一帧,再次检测碰撞,确认后立即执行碰撞后的函数,而不是在碰撞后,再去做这个工作。cocos的intersectsRect,在源代码中 return !( getMaxX() < rect.getMinX() ||
rect.getMaxX() < getMinX() ||
getMaxY() < rect.getMinY() ||
rect.getMaxY() < getMinY()); 四个全为否时,返回真,否则返回假。效果就是已经发生碰撞了那么返回真。
4.明天准备做,bullet 的burst,预处理场景和消除模块,确定设计模式和数据存储结构.