我要实现的功能很简单,就是点击屏幕上的任意点,能够从屏幕中间发射出一颗子弹,子弹要能飞到屏幕外。
我使用了CCMoveTo这个action,它需要一个目的点,目的点应该是我点击的任一点与屏幕中间点连线上屏幕外的一点。我定义屏幕外20的距离为终点,就是说,子弹将飞到20之外,子弹在这个位置上,是看不到的。
根据直线的函数Y = kX + b,我们需要求出k和b的值,我们知道两个点,起点(屏幕中间点),直线上的一点(鼠标按下的那个点),这样我们就可以求出k和b,这样就确定了这条直线。然后,我们根据预先设定,只要到屏幕外20就应该停止运动了,这个20是指X坐标和Y坐标只要有一个到了20就应该马上停止,要不,就有可能跑到很远很远的地方去了。这样,我就可以用CCMoveTo实现发射子弹效果了。我将它写成一个函数,在以后的项目中,就能直接使用了,代码如下:
- 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