TouchTest 阅读学习笔记
来源:互联网 发布:69lbc数据 编辑:程序博客网 时间:2024/05/17 08:51
class Ball : public CCSprite{ CCPoint m_velocity;public: Ball(void); virtual ~Ball(void); float radius(); // 用来移动精灵对象 void move(float delta); // 对与paddle做碰撞处理 void collideWithPaddle(Paddle* paddle);public: void setVelocity(CCPoint velocity){m_velocity = velocity;} CCPoint getVelocity(){return m_velocity;}public:// 绑定一个2d纹理 static Ball* ballWithTexture(CCTexture2D* aTexture);};// 这里我们绑定给定的图片纹理,在不用时自动释放精灵对象Ball* Ball::ballWithTexture(CCTexture2D* aTexture){ Ball* pBall = new Ball(); pBall->initWithTexture(aTexture); pBall->autorelease(); return pBall;}void Ball::move(float delta){// 计算移动距离,并设置球的位置 this->setPosition( ccpAdd(getPosition(), ccpMult(m_velocity, delta)) ); // 若球的位置越过了左边、右边的可视区域边界,修正球的位置并把速度的x方向反向处理 if (getPosition().x > VisibleRect::right().x - radius()) { setPosition( ccp( VisibleRect::right().x - radius(), getPosition().y) ); m_velocity.x *= -1; } else if (getPosition().x < VisibleRect::left().x + radius()) { setPosition( ccp(VisibleRect::left().x + radius(), getPosition().y) ); m_velocity.x *= -1; }}// 设定板子的边界,CCRect Paddle::rect(){ CCSize s = getTexture()->getContentSize(); return CCRectMake(-s.width / 2, -s.height / 2, s.width, s.height);}void Ball::collideWithPaddle(Paddle* paddle){// 获取板子的边界,精灵的默认锚点为(0.5,0.5),position就是中心点,这里还原为原来的paddle边界,取得边界值 CCRect paddleRect = paddle->rect(); paddleRect.origin.x += paddle->getPosition().x; paddleRect.origin.y += paddle->getPosition().y; float lowY = paddleRect.getMinY(); float midY = paddleRect.getMidY(); float highY = paddleRect.getMaxY(); float leftX = paddleRect.getMinX(); float rightX = paddleRect.getMaxX(); // 球的x是否在碰撞范围内 if (getPosition().x > leftX && getPosition().x < rightX) { bool hit = false; float angleOffset = 0.0f; if (getPosition().y > midY && getPosition().y <= highY + radius()) { // 碰下面的板子,设定角度偏移 setPosition( ccp(getPosition().x, highY + radius()) ); hit = true; angleOffset = (float)M_PI / 2; } else if (getPosition().y < midY && getPosition().y >= lowY - radius()) { // 碰撞上面的板子,设定角度偏移 setPosition( ccp(getPosition().x, lowY - radius()) ); hit = true; angleOffset = -(float)M_PI / 2; } if (hit) { // 重定向速度方向和位置(下面怎么计算的不理解,物理知识弱爆了)CCPoint cp1 = ccpSub(paddle->getPosition(), getPosition());float angle1 = ccpToAngle(cp1); float hitAngle = angle1 + angleOffset; float scalarVelocity = ccpLength(m_velocity) * 1.05f;float angle2 = ccpToAngle(m_velocity); float velocityAngle = -angle2 + 0.5f * hitAngle; m_velocity = ccpMult(ccpForAngle(velocityAngle), scalarVelocity); } } } typedef enum tagPaddleState { kPaddleStateGrabbed, kPaddleStateUngrabbed} PaddleState; class Paddle : public CCSprite, public CCTargetedTouchDelegate{ PaddleState m_state;public: Paddle(void); virtual ~Paddle(void); CCRect rect(); bool initWithTexture(CCTexture2D* aTexture); virtual void onEnter(); virtual void onExit(); bool containsTouchLocation(CCTouch* touch); virtual bool ccTouchBegan(CCTouch* touch, CCEvent* event); virtual void ccTouchMoved(CCTouch* touch, CCEvent* event); virtual void ccTouchEnded(CCTouch* touch, CCEvent* event); virtual CCObject* copyWithZone(CCZone *pZone); virtual void touchDelegateRetain(); virtual void touchDelegateRelease(); static Paddle* paddleWithTexture(CCTexture2D* aTexture);};// 给paddle增加绑定纹理Paddle* Paddle::paddleWithTexture(CCTexture2D* aTexture){ Paddle* pPaddle = new Paddle(); pPaddle->initWithTexture( aTexture ); pPaddle->autorelease(); return pPaddle;}// 设定未捕获状态bool Paddle::initWithTexture(CCTexture2D* aTexture){ if( CCSprite::initWithTexture(aTexture) ) { m_state = kPaddleStateUngrabbed; } return true;}// 注册屏幕触摸处理事件onEnter :CCDirector::sharedDirector()->getTouchDispatcher()->addTargetedDelegate(this, 0, true);onExit :CCDirector::sharedDirector()->getTouchDispatcher()->removeDelegate(this);// 若paddle包含数目点,设置捕获状态bool Paddle::ccTouchBegan(CCTouch* touch, CCEvent* event){ if (m_state != kPaddleStateUngrabbed) return false; if ( !containsTouchLocation(touch) ) return false; m_state = kPaddleStateGrabbed; return true;}// 捕获paddle后,重新设置paddle位置void Paddle::ccTouchMoved(CCTouch* touch, CCEvent* event){ CCAssert(m_state == kPaddleStateGrabbed, "Paddle - Unexpected state!"); CCPoint touchPoint = touch->getLocation(); setPosition( ccp(touchPoint.x, getPosition().y) );}// 释放捕获,设置状态void Paddle::ccTouchEnded(CCTouch* touch, CCEvent* event){ CCAssert(m_state == kPaddleStateGrabbed, "Paddle - Unexpected state!"); m_state = kPaddleStateUngrabbed;} // 创建paddle的copy处理CCObject* Paddle::copyWithZone(CCZone *pZone){this->retain();return this;}void Paddle::touchDelegateRetain(){ this->retain();}void Paddle::touchDelegateRelease(){ this->release();}// 测试场景class PongScene : public TestScene{public: PongScene(); virtual void runThisTest(); virtual void MainMenuCallback(CCObject* pSender);};class Ball;class PongLayer : public CCLayer{private: Ball* m_ball; CCArray* m_paddles; CCPoint m_ballStartingVelocity; public: PongLayer(); ~PongLayer(); void resetAndScoreBallForPlayer(int player); void doStep(float delta);};PongLayer::PongLayer(){ m_ballStartingVelocity = ccp(20.0f, -100.0f); // 创建球精灵,并绑定纹理,设定速度值 m_ball = Ball::ballWithTexture( CCTextureCache::sharedTextureCache()->addImage(s_Ball) ); m_ball->setPosition( VisibleRect::center() ); m_ball->setVelocity( m_ballStartingVelocity ); addChild( m_ball ); m_ball->retain(); // 创建平板的纹理,绑定到精灵上 CCTexture2D* paddleTexture = CCTextureCache::sharedTextureCache()->addImage(s_Paddle); CCArray *paddlesM = CCArray::createWithCapacity(4); Paddle* paddle = Paddle::paddleWithTexture(paddleTexture); paddle->setPosition( ccp(VisibleRect::center().x, VisibleRect::bottom().y + 15) ); paddlesM->addObject( paddle ); paddle = Paddle::paddleWithTexture( paddleTexture ); paddle->setPosition( ccp(VisibleRect::center().x, VisibleRect::top().y - kStatusBarHeight - 15) ); paddlesM->addObject( paddle ); paddle = Paddle::paddleWithTexture( paddleTexture ); paddle->setPosition( ccp(VisibleRect::center().x, VisibleRect::bottom().y + 100) ); paddlesM->addObject( paddle ); paddle = Paddle::paddleWithTexture( paddleTexture ); paddle->setPosition( ccp(VisibleRect::center().x, VisibleRect::top().y - kStatusBarHeight - 100) ); paddlesM->addObject( paddle ); // 将创建的4个精灵平板加入到数组中 m_paddles = (CCArray*)paddlesM->copy(); // 将平板对象加入到场景层中 CCObject* pObj = NULL; CCARRAY_FOREACH(m_paddles, pObj) { paddle = (Paddle*)(pObj); if(!paddle) break; addChild(paddle); } // 每帧调度doStep方法 schedule( schedule_selector(PongLayer::doStep) );}// 重置球数据,包括位置和速度void PongLayer::resetAndScoreBallForPlayer(int player){ m_ballStartingVelocity = ccpMult(m_ballStartingVelocity, -1.0f); m_ball->setVelocity( m_ballStartingVelocity ); m_ball->setPosition( VisibleRect::center() );}void PongLayer::doStep(float delta){// 移动球 m_ball->move(delta); // 检测球与平板的碰撞与否,并作相应的处理 Paddle* paddle = NULL; CCObject* pObj = NULL; CCARRAY_FOREACH(m_paddles, pObj) { paddle = (Paddle*)(pObj); if(!paddle) break; m_ball->collideWithPaddle( paddle ); } // 球的y值超过了可视区域,重新球数据 if (m_ball->getPosition().y > VisibleRect::top().y - kStatusBarHeight + m_ball->radius()) resetAndScoreBallForPlayer( kLowPlayer ); else if (m_ball->getPosition().y < VisibleRect::bottom().y-m_ball->radius()) resetAndScoreBallForPlayer( kHighPlayer ); // 每帧绘制球 m_ball->draw();}
0 0
- TouchTest 阅读学习笔记
- cocos 2dx 3.12 学习笔记(三) TouchTest
- Linux学习笔记+拓展阅读
- 指针阅读技巧学习笔记
- git/github学习笔记-阅读笔记二
- gtk学习笔记 - vim + ctags 阅读源码
- opnstack学习笔记---源码阅读(一)
- 《python学习手册》阅读笔记5.1-5.14
- BT协议学习笔记1--阅读概览
- 深度学习文献阅读笔记(1)
- 深度学习文献阅读笔记(2)
- 深度学习文献阅读笔记(3)
- 深度学习文献阅读笔记(4)
- 深度学习文献阅读笔记(5)
- 深度学习文献阅读笔记(6)
- 深度学习文献阅读笔记(7)
- 《机器学习(周志华)》 阅读笔记
- api.js源码阅读学习笔记
- SQL2008清除数据库日志脚本
- 100 Things You Probably Didn't Know About Oracle Database
- [Leetcode] Scramble String (Java)
- 变分贝叶斯求解0.01范数稀疏编码问题
- 云计算的三种服务模式:IaaS,PaaS和SaaS
- TouchTest 阅读学习笔记
- rails中建立model 和 修改字段的方法
- 原理图技巧
- BlazeDS的架构和工作原理简介
- 归纳几种基于java应用的excel导出方案
- 中国手机网民规模达5亿 年增长率19%
- 突破Windows 自带VPN 拨号次数99次的限制
- Java用socket获得网页html
- Bitcoin