(6) cocos2d-x发射子弹

我要实现的功能很简单,就是点击屏幕上的任意点,能够从屏幕中间发射出一颗子弹,子弹要能飞到屏幕外。

我使用了CCMoveTo这个action,它需要一个目的点,目的点应该是我点击的任一点与屏幕中间点连线上屏幕外的一点。我定义屏幕外20的距离为终点,就是说,子弹将飞到20之外,子弹在这个位置上,是看不到的。

根据直线的函数Y = kX + b,我们需要求出k和b的值,我们知道两个点,起点(屏幕中间点),直线上的一点(鼠标按下的那个点),这样我们就可以求出k和b,这样就确定了这条直线。然后,我们根据预先设定,只要到屏幕外20就应该停止运动了,这个20是指X坐标和Y坐标只要有一个到了20就应该马上停止,要不,就有可能跑到很远很远的地方去了。这样,我就可以用CCMoveTo实现发射子弹效果了。我将它写成一个函数,在以后的项目中,就能直接使用了,代码如下:

  1. CCPointHelloWorld::GetTargetPointOutOfWorld(CCPointptStart,CCPointptEnd,intnXOutOfWorld,87); font-weight:bold; background-color:inherit">intnYOutOfWorld)
  2. {
  3. //Y=kX+b
  4. floatfK=1.0;
  5. floatfb=0.0;
  6. if(ptStart.x!=ptEnd.x)
  7. {
  8. fK=(float)(ptStart.y-ptEnd.y)/(ptStart.x-ptEnd.x);//求出K
  9. }
  10. fb=ptStart.y-ptStart.x*fK;//求出b
  11. //求该直线在屏幕外的点
  12. CCSizesize=CCDirector::sharedDirector()->getWinSize();
  13. floatfY=ptStart.y>ptEnd.y?-nYOutOfWorld:size.height+nYOutOfWorld;
  14. floatfX=1.0;
  15. if(fK!=0)
  16. fX=(fY-fb)/fK;//这个fX可能非常大,或者非常小
  17. if(ptStart.x==ptEnd.x)//应该沿Y轴运动
  18. fX=ptStart.x;
  19. fY=ptStart.y>ptEnd.y?-nXOutOfWorld:size.height+nYOutOfWorld;
  20. elseif(ptEnd.y==ptStart.y)//应该沿X轴运动
  21. fX=ptStart.x>ptEnd.x?-nXOutOfWorld:size.width+nXOutOfWorld;
  22. fY=ptStart.y;
  23. }
  24. if(fX>size.width+nXOutOfWorld)//重新计算fX和fY
  25. fX=size.width+nXOutOfWorld;
  26. fY=fK*fX+fb;
  27. if(fX<-nXOutOfWorld)//重新计算fX和fY
  28. fX=-nXOutOfWorld;
  29. fY=fK*fX+fb;
  30. returnccp(fX,fY);
  31. }

使用是这样的:

copy

    boolHelloWorld::ccTouchBegan(CCTouch*pTouch,CCEvent*pEvent)
  1. CCSprite*pSprite=CCSprite::create("bullet.png");//加载子弹图片
  2. CCSizesize=CCDirector::sharedDirector()->getWinSize();
  3. this->addChild(pSprite);
  4. pSprite->setPosition(ccp(size.width/2,size.height/2));//设置子弹的发射位置
  5. constintOUT_OF_WORLD=20;
  6. CCPointptOutOfWorld=GetTargetPointOutOfWorld(ccp(size.width/2,size.height/2),pTouch->getLocation(),OUT_OF_WORLD,OUT_OF_WORLD);//获取屏幕外的一个点
  7. CCAction*pAction=CCMoveTo::create(0.5f,ptOutOfWorld);
  8. pSprite->runAction(pAction);//发射子弹
  9. returntrue;
  10. }

要实现屏幕触摸,你还需要在init函数中注册一下可触摸:

copy

    this->setTouchEnabled(true);
  1. CCDirector::sharedDirector()->getTouchDispatcher()->addTargetedDelegate(this,false);

看了一些博文,很多都没有指出如何打斜线,有的就是打垂直线或者水平线,希望我的这篇能帮到有需要的童鞋~~~~

【转自http://www.jb51.cc/article/p-nkxombsk-r.html

相关文章

    本文实践自 RayWenderlich、Ali Hafizji 的文章《...
Cocos-code-ide使用入门学习地点:杭州滨江邮箱:appdevzw@1...
第一次開始用手游引擎挺激动!!!进入正题。下载资源1:从C...
    Cocos2d-x是一款强大的基于OpenGLES的跨平台游戏开发...
1.  来源 QuickV3sample项目中的2048样例游戏,以及最近《...
   Cocos2d-x3.x已经支持使用CMake来进行构建了,这里尝试...