上一篇博客写的是一个小球边界碰撞,这个博客是讲的是多个小球边界碰撞。
我们自己写一个class
class ball :public Sprite{// :warning ball后面有,public后面没有(这里千万不要看)
public:
virtual bool init();
CREATE_FUNC(ball);
virtual void update(float dt);//我们依然重写update函数达到我们自己需要的
private:
float speedX,speedY;
Size visibleSize;//这里是速度,和可视窗口的大小
};
我们重写的函数
void ball::update(float dt){
setPosition(getPositionX()+speedX,getPositionY()+speedY);//我们先让小球运动这一次,其实我觉得应该在运动前判断是否越界的
float sw = visibleSize.width,sh = visibleSize.height,bw = getContentSize().width/2,bh= getContentSize().height/2;
float bx = getPositionX(),by = getPositionY();//我们把参数先保存起来
//判断是否越界,越界之后我们只需要把速度取负
if (bx <= bw || bx >= (sw - bw)){
speedX = -(speedX);
}
else if (by<=bh || by>=(sh-bh)){
speedY = -(speedY);
}
还有我们创建的球
bool ball::init(){
Sprite::initWithFile("ball.png"); visibleSize = Director::getInstance()->getVisibleSize();//获得可视窗口的大小 speedX = CCRANDOM_0_1() * 10 - 5; speedY= CCRANDOM_0_1() * 20- 5;//随机生成小球的位置 scheduleUpdate();//更新 return true;
}
bool HelloWorld::init()
{
if (!LayerColor::initWithColor(Color4B(155,199,255,255)))
{
return false;
}
Size visibleSize = Director::getInstance()->getVisibleSize();
Vec2 origin = Director::getInstance()->getVisibleOrigin();
for (int i = 0; i < 15; i++){
auto b = ball::create();
b->setPosition(CCRANDOM_0_1() * 100 + 100 + CCRANDOM_0_1() * 100,CCRANDOM_0_1() * 200 + 100);
addChild(b);
}
return true;
}