(6) cocos2d-x发射子弹
2014-10-29 14:35
295 查看
我要实现的功能很简单,就是点击屏幕上的任意点,能够从屏幕中间发射出一颗子弹,子弹要能飞到屏幕外。
我使用了CCMoveTo这个action,它需要一个目的点,目的点应该是我点击的任一点与屏幕中间点连线上屏幕外的一点。我定义屏幕外20的距离为终点,就是说,子弹将飞到20之外,子弹在这个位置上,是看不到的。
根据直线的函数Y = kX + b,我们需要求出k和b的值,我们知道两个点,起点(屏幕中间点),直线上的一点(鼠标按下的那个点),这样我们就可以求出k和b,这样就确定了这条直线。然后,我们根据预先设定,只要到屏幕外20就应该停止运动了,这个20是指X坐标和Y坐标只要有一个到了20就应该马上停止,要不,就有可能跑到很远很远的地方去了。这样,我就可以用CCMoveTo实现发射子弹效果了。我将它写成一个函数,在以后的项目中,就能直接使用了,代码如下:
[cpp] view
plaincopy
CCPoint HelloWorld::GetTargetPointOutOfWorld(CCPoint ptStart, CCPoint ptEnd, int nXOutOfWorld, int nYOutOfWorld)
{
// Y = kX + b
float fK = 1.0;
float fb = 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
// 求该直线在屏幕外的点
CCSize size = CCDirector::sharedDirector()->getWinSize();
float fY = ptStart.y > ptEnd.y ? -nYOutOfWorld : size.height + nYOutOfWorld;
float fX = 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;
}
else if (ptEnd.y == ptStart.y) // 应该沿X轴运动
{
fX = ptStart.x > ptEnd.x ? -nXOutOfWorld : size.width + nXOutOfWorld;
fY = ptStart.y;
}
else if (fX > size.width + nXOutOfWorld) // 重新计算fX和fY
{
fX = size.width + nXOutOfWorld;
fY = fK * fX + fb;
}
else if (fX < -nXOutOfWorld) // 重新计算fX和fY
{
fX = -nXOutOfWorld;
fY = fK * fX + fb;
}
return ccp(fX, fY);
}
使用是这样的:
[cpp] view
plaincopy
bool HelloWorld::ccTouchBegan(CCTouch *pTouch, CCEvent *pEvent)
{
CCSprite* pSprite = CCSprite::create("bullet.png"); // 加载子弹图片
CCSize size = CCDirector::sharedDirector()->getWinSize();
this->addChild(pSprite);
pSprite->setPosition(ccp(size.width / 2, size.height / 2)); // 设置子弹的发射位置
const int OUT_OF_WORLD = 20;
CCPoint ptOutOfWorld = 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); // 发射子弹
return true;
}
要实现屏幕触摸,你还需要在init函数中注册一下可触摸:
[cpp] view
plaincopy
this->setTouchEnabled(true);
CCDirector::sharedDirector()->getTouchDispatcher()->addTargetedDelegate(this, 0, false);
看了一些博文,很多都没有指出如何打斜线,有的就是打垂直线或者水平线,希望我的这篇能帮到有需要的童鞋~~~~
【转自 http://blog.csdn.net/dssdss123/article/details/12295475 】
我使用了CCMoveTo这个action,它需要一个目的点,目的点应该是我点击的任一点与屏幕中间点连线上屏幕外的一点。我定义屏幕外20的距离为终点,就是说,子弹将飞到20之外,子弹在这个位置上,是看不到的。
根据直线的函数Y = kX + b,我们需要求出k和b的值,我们知道两个点,起点(屏幕中间点),直线上的一点(鼠标按下的那个点),这样我们就可以求出k和b,这样就确定了这条直线。然后,我们根据预先设定,只要到屏幕外20就应该停止运动了,这个20是指X坐标和Y坐标只要有一个到了20就应该马上停止,要不,就有可能跑到很远很远的地方去了。这样,我就可以用CCMoveTo实现发射子弹效果了。我将它写成一个函数,在以后的项目中,就能直接使用了,代码如下:
[cpp] view
plaincopy
CCPoint HelloWorld::GetTargetPointOutOfWorld(CCPoint ptStart, CCPoint ptEnd, int nXOutOfWorld, int nYOutOfWorld)
{
// Y = kX + b
float fK = 1.0;
float fb = 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
// 求该直线在屏幕外的点
CCSize size = CCDirector::sharedDirector()->getWinSize();
float fY = ptStart.y > ptEnd.y ? -nYOutOfWorld : size.height + nYOutOfWorld;
float fX = 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;
}
else if (ptEnd.y == ptStart.y) // 应该沿X轴运动
{
fX = ptStart.x > ptEnd.x ? -nXOutOfWorld : size.width + nXOutOfWorld;
fY = ptStart.y;
}
else if (fX > size.width + nXOutOfWorld) // 重新计算fX和fY
{
fX = size.width + nXOutOfWorld;
fY = fK * fX + fb;
}
else if (fX < -nXOutOfWorld) // 重新计算fX和fY
{
fX = -nXOutOfWorld;
fY = fK * fX + fb;
}
return ccp(fX, fY);
}
使用是这样的:
[cpp] view
plaincopy
bool HelloWorld::ccTouchBegan(CCTouch *pTouch, CCEvent *pEvent)
{
CCSprite* pSprite = CCSprite::create("bullet.png"); // 加载子弹图片
CCSize size = CCDirector::sharedDirector()->getWinSize();
this->addChild(pSprite);
pSprite->setPosition(ccp(size.width / 2, size.height / 2)); // 设置子弹的发射位置
const int OUT_OF_WORLD = 20;
CCPoint ptOutOfWorld = 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); // 发射子弹
return true;
}
要实现屏幕触摸,你还需要在init函数中注册一下可触摸:
[cpp] view
plaincopy
this->setTouchEnabled(true);
CCDirector::sharedDirector()->getTouchDispatcher()->addTargetedDelegate(this, 0, false);
看了一些博文,很多都没有指出如何打斜线,有的就是打垂直线或者水平线,希望我的这篇能帮到有需要的童鞋~~~~
【转自 http://blog.csdn.net/dssdss123/article/details/12295475 】
相关文章推荐
- Cocos2d-x《雷电大战》(3)-子弹无限发射
- cocos2d-x学习笔记之发射子弹技能
- Cocos2d-x--发射多发子弹
- cocos2d-x入门(4)-英雄发射子弹和碰撞检测
- cocos2d-x 3.0游戏实例学习笔记《卡牌塔防》第十步---发射子弹&怪物受伤---所有源码和资源完结下载
- Cocos2d-x《雷电大战》(3)-子弹无限发射
- cocos2d-x发射子弹
- cocos2d-x SimpleGame(3)如何发射子弹
- Cocos2d-x《雷电大战》(3)-子弹无限发射
- 游戏开发之,发射子弹,中弹后退
- 如何用cocos2d-x来开发简单的Uphone游戏:(三) 射击子弹 & 碰撞检测
- unity3d处理子弹发射后坐标系混乱问题
- cocos2d-x游戏开发系列教程-坦克大战游戏之子弹和地图碰撞
- 09-html5游戏坦克大战第五战(自己的坦克可以发射单颗子弹)
- 飞机大战开发05按角度发射的子弹和拖尾子弹的实现
- [cocos2d-x][游戏开发]通过cocos2d-x实现简易飞机大战 06.游戏界面 主角飞机产生子弹
- 如何用cocos2d-x来开发简单的Uphone游戏:(三) 射击子弹 & 碰撞检测
- 项目飞机大战01:主要实现背景的移动,飞机的动画和触控,子弹的生成和发射
- 利用a、s、w、d来控制移动 按下空格会发射子弹 最简单的语法用心编写也会有好的程序
- Cocos2d-x 利用CCSpriteBatchNode建立子弹池