经过摸索, 终于实现了angry birds中的橡皮筋.
首先要知道它用Weld Joint(焊接关节), Mouse Joint(鼠标关节)和Distance Joint(距离关节).
Weld Joint: 把小鸟固定在弹弓上.
Mouse Joint: 用来拖拽小鸟.这个好理解.
Distance Joint: 用来保持小鸟和弹弓之间的距离. 但是用的时候得有技巧.
步骤:
1. init:先用weldJoing把小鸟固定在弹弓中间位置. 可以是地面, 固定点在弹弓上, 这样Box2D可以少处理弹弓这个Body.
2. TouchBegan: 把weldJoint摧毁, 创建一个MouseJoint, 让小鸟跟随手指移动.
3. TouchMove: 如果小鸟被拖出弹弓一定距离, 创建一个Distance Joint, 让小鸟跟弹弓保持一定距离不变. 相当于给了一个弹弓最大拉伸度. 同时画两条线模仿皮筋.
4. TouchEnd: 手放开, 小鸟要飞了.这时要摧毁Distance Joint 和 Weld Joint, 让小鸟不再受限制, 同时给小鸟一个直线速度朝着弹弓中间飞出去.
上代码:
#import "cocos2d.h"
#import "box2d.h"
#import "PauseLayer.h"
#import "LevelScene.h"
#import "EKSprite.h"
USING_NS_CC;
class Level1Layer : public LevelScene {
public:
Level1Layer();
~Level1Layer();
CC_SYNTHESIZE(PauseLayer*, _pauseLayer, PauseLayer);
CREATE_FUNC(Level1Layer);
virtual void levelInit();
virtual void ccTouchesBegan(cocos2d::CCSet *touches, cocos2d::CCEvent *event);
virtual void ccTouchesMoved(cocos2d::CCSet *touches, cocos2d::CCEvent *event);
virtual void ccTouchesEnded(cocos2d::CCSet *touches, cocos2d::CCEvent *event);
virtual void ccTouchesCancelled(cocos2d::CCSet *touches, cocos2d::CCEvent *event);
virtual void update(float dt);
private:
EKSprite *_currBird;
CCSprite *_slingshot;
CCSpriteBatchNode *_parent;
b2World *_world;
b2Body *_groundBody;
b2MouseJoint *_mouseJoint;
b2DistanceJoint *_disJoint;
b2WeldJoint *_weldJoint;
bool _isPulling;
};
#import "Level1Layer.h"
#include "EKShapeCache.h"
#include "EKHelper.h"
#include "LineLayer.h"