(6) cocos2d-x发射子d

(6) cocos2d-x发射子d,第1张

概述    我要实现的功能很简单,就是点击屏幕上的任意点,能够从屏幕中间发射出一颗子d,子d要能飞到屏幕外。     我使用了CCMoveTo这个action,它需要一个目的点,目的点应该是我点击的任一点与屏幕中间点连线上屏幕外的一点。我定义屏幕外20的距离为终点,就是说,子d将飞到20之外,子d在这个位置上,是看不到的。     根据直线的函数Y = kX + b,我们需要求出k和b的值,我们知道两

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

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

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

[cpp] view plain copy CCPointHelloWorld::GetTargetPointOutOfWorld(CCPointptStart,CCPointptEnd,intnXOutOfWorld,87); Font-weight:bold; background-color:inherit">intnYOutOfWorld) { //Y=kX+b floatfK=1.0; floatfb=0.0; if(ptStart.x!=ptEnd.x) { fK=(float)(ptStart.y-ptEnd.y)/(ptStart.x-ptEnd.x);//求出K } fb=ptStart.y-ptStart.x*fK;//求出b //求该直线在屏幕外的点 CCSizesize=CCDirector::sharedDirector()->getWinSize(); floatfY=ptStart.y>ptEnd.y?-nYOutOfWorld:size.height+nYOutOfWorld; floatfX=1.0; if(fK!=0) fX=(fY-fb)/fK;//这个fX可能非常大,或者非常小 if(ptStart.x==ptEnd.x)//应该沿Y轴运动 fX=ptStart.x; fY=ptStart.y>ptEnd.y?-nXOutOfWorld:size.height+nYOutOfWorld; elseif(ptEnd.y==ptStart.y)//应该沿X轴运动 fX=ptStart.x>ptEnd.x?-nXOutOfWorld:size.wIDth+nXOutOfWorld; fY=ptStart.y; } if(fX>size.wIDth+nXOutOfWorld)//重新计算fX和fY fX=size.wIDth+nXOutOfWorld; fY=fK*fX+fb; if(fX<-nXOutOfWorld)//重新计算fX和fY fX=-nXOutOfWorld; fY=fK*fX+fb; returnccp(fX,fY); }

使用是这样的:

copy boolHelloWorld::cctouchBegan(CCtouch*ptouch,CCEvent*pEvent) CCSprite*pSprite=CCSprite::create("bullet.png");//加载子d图片 CCSizesize=CCDirector::sharedDirector()->getWinSize(); this->addChild(pSprite); pSprite->setposition(ccp(size.wIDth/2,size.height/2));//设置子d的发射位置 constintOUT_OF_WORLD=20; CCPointptOutOfWorld=GetTargetPointOutOfWorld(ccp(size.wIDth/2,size.height/2),ptouch->getLocation(),OUT_OF_WORLD,OUT_OF_WORLD);//获取屏幕外的一个点 CCAction*pAction=CCMoveto::create(0.5f,ptOutOfWorld); pSprite->runAction(pAction);//发射子d returntrue; }
要实现屏幕触摸,你还需要在init函数中注册一下可触摸:

copy this->settouchEnabled(true); CCDirector::sharedDirector()->gettouchdispatcher()->addTargetedDelegate(this,false);

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

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

总结

以上是内存溢出为你收集整理的(6) cocos2d-x发射子d全部内容,希望文章能够帮你解决(6) cocos2d-x发射子d所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/web/1006416.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-05-22
下一篇 2022-05-22

发表评论

登录后才能评论

评论列表(0条)

保存