一、PongScene继承自TestScene,这个类里面有3个方法,但是当前代码来看,MainMenuCallback这个虚继续类有点多余,因为他仅调用一下父类的MainmenuCallback。
在构造里面,添加一个PontLayer层到场景中,这里注意一下。
PongLayer *pongLayer = new PongLayer();//PongLayer::create();
addChild(pongLayer);
pongLayer->release();
在cocos2dx里面,继承自object的类,new出来的数据,可以用release释放,这个层已经加进了场景里面,可以释放掉了。
runThisTest函数里面,仅是调用CCDirector::sharedDirector()->releaseScene(this);替换一下场景。
二、PongLayer继承自CCLayer,这个类有3个私有成员,Ball * m_ball; CCArray * m_paddles; CCPoint m_ballStringVelocity;分别记录着球,板的位置,开始的速度。
构造函数里面先利用CCTextureCache::sharedTextureCache()->addImage(s_Ball);读取到CCTexture2D里面,然后创建,设置位置,球的话设置一下速度setVolecity。
最后调用一下回调函数,schedule(schedule_selector(PongLayer::doStep));
doStep里面,每一帧调用小球调用move移动小球一点,然后用CCARRAY_FOREACH循环调用collideWithPaddle测试是否碰撞,假如球运动到屏幕上面或者下面,调用
resetAndScoreBallForPlayer(xxx)重新开始。然后调用draw重画界面。
resetAndScoreBallForPlayer里面重新设置了球的初速度,位置。速度的-的。
三、Paddle继承了CCTargetedTouchDelegate,因为Paddle要响应触摸,所以在OnEnter里面注册一下
void Paddle::onEnter()
{
CCDirector* pDirector = CCDirector::sharedDirector();
pDirector->getTouchDispatcher()->addTargetedDelegate(this, 0, true);
CCSprite::onEnter();
}
退出的时候再取消掉。
void Paddle::onExit()
{
CCDirector* pDirector = CCDirector::sharedDirector();
pDirector->getTouchDispatcher()->removeDelegate(this);
CCSprite::onExit();
}
这个类通过initWithTexture来构造,CCSprite::initWithTexture来构造,这个需要手动释放,如果是调用create之类的,会自动调用autorelease来释放内存。同时设置了当前状态为没有拖动状态,kPaddleStateUngrabbed。
同时重载了这三个函数来处理响应触摸动作。
virtual bool ccTouchBegan(CCTouch* touch, CCEvent* event);
virtual void ccTouchMoved(CCTouch* touch, CCEvent* event);
virtual void ccTouchEnded(CCTouch* touch, CCEvent* event);
他们利用CCLayer继续自CCNode的converTouchToNodeSpaceAR(touch)获取当前接触的点,然后用CCRect的containsPoint来判断是否点击在
这个Paddle上面。鼠标点击拖动的时候会调用Moved。
四、Ball类记录着速度m_velocity。这个实质是一个点,数据越大,移动就越快,他设置位置的方式是
this->setPosition( ccpAdd(getPosition(), ccpMult(m_velocity, delta)) );
如果碰到2边的话, m_velocity.x *= -1;一下就转换为相反的方向。
碰撞检查里面的collideWithPaddle仅是一些逻辑,花点时间就能看懂了。