一、PongScene继承自TestScene,这个类里面有3个方法,但是当前代码来看,MainMenuCallback这个虚继续类有点多余,因为他仅调用一下父类的MainmenuCallback。
在构造里面,添加一个PontLayer层到场景中,这里注意一下。
PongLayer *pongLayer = new PongLayer();//PongLayer::create(); addChild(pongLayer); pongLayer->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(); }
同时重载了这三个函数来处理响应触摸动作。
virtual bool ccTouchBegan(CCTouch* touch, CCEvent* event); virtual void ccTouchMoved(CCTouch* touch, CCEvent* event); virtual void ccTouchEnded(CCTouch* touch, CCEvent* event);
这个Paddle上面。鼠标点击拖动的时候会调用Moved。
四、Ball类记录着速度m_velocity。这个实质是一个点,数据越大,移动就越快,他设置位置的方式是
this->setPosition( ccpAdd(getPosition(), ccpMult(m_velocity, delta)) );
碰撞检查里面的collideWithPaddle仅是一些逻辑,花点时间就能看懂了。