Cocos2d-x 《雷电大战》-精灵随手指移动,你点哪我走哪!

本文要实现飞机游戏中,人的手指按着飞机,就能拖着飞机走动,这里实现了当你手指按在手机的图片上,手指一直按着屏幕,飞机就会跟着你走。同时,还加入了边界判断条件,让飞机在你的视野内移动,实现的效果完全和我们手机上的飞机游戏一样。

效果

wKiom1T8QyfjnzlgABqxNLHvPJQ526.gif

Cocos2d-x版本:3.4

工程环境:VS30213

一、代码编写

1、头文件GameMain.h

/**
*@作者林炳文(邮箱:ling20081005@126.com)
*@博客http://linbingwen.blog.51cto.com/
*@时间2015.3.8
*@功能游戏的主界面
*/
#ifndef__GameMain_H__
#define__GameMain_H__
#include"BackLayerDown.h"
#include"BackLayerUp.h"
#include"cocos2d.h"
USING_NS_CC;
classGameMain:publiccocos2d::Layer
{
public:
staticcocos2d::Scene*createScene();
virtualboolinit();

virtualboolonTouchBegan(cocos2d::Touch*touch,cocos2d::Event*unused_event);
virtualvoidonTouchMoved(cocos2d::Touch*touch,cocos2d::Event*unused_event);
virtualvoidonTouchEened(cocos2d::Touch*touch,cocos2d::Event*unused_event);
virtualvoidonTouchCancelled(cocos2d::Touch*touch,cocos2d::Event*unused_even);

CREATE_FUNC(GameMain);
private:
boolisHeroPlaneControl;//飞机是否被控制着
floatmDeltaX;//英雄飞机随手指移动时的X偏移量
floatmDeltaY;//英雄飞机随手指移动时的Y偏移量
Sprite*mHeroPlane;//英雄飞机
};

#endif//__GameMain_H__
#include"GameMain.h"
USING_NS_CC;
Scene*GameMain::createScene()
{
autoscene=Scene::create();
autolayer=GameMain::create();
scene->addChild(layer);
returnscene;
}

boolGameMain::init()
{
SizevisibleSize=Director::getInstance()->getVisibleSize();
Pointorigin=Director::getInstance()->getVisibleOrigin();
//这是地面图层
this->addChild(BackLayerUp::create());
//这是白云图层
this->addChild(BackLayerDown::create());

//加个飞机
mHeroPlane=Sprite::create("air1.png");
mHeroPlane->setPosition(Vec2(visibleSize.width/2,visibleSize.height/5));
this->addChild(mHeroPlane,1,100);
isHeroPlaneControl=false;

//打开触摸,增加触摸监听事件
this->setTouchEnabled(true);
autolisten=EventListenerTouchOneByOne::create();
listen->onTouchBegan=CC_CALLBACK_2(GameMain::onTouchBegan,this);
listen->onTouchMoved=CC_CALLBACK_2(GameMain::onTouchMoved,this);
listen->onTouchEnded=CC_CALLBACK_2(GameMain::onTouchEened,this);
listen->onTouchCancelled=CC_CALLBACK_2(GameMain::onTouchCancelled,this);
listen->setSwallowtouches(false);
Director::getInstance()->getEventdispatcher()->addEventListenerWithSceneGraPHPriority(listen,this);

returntrue;
}
boolGameMain::onTouchBegan(cocos2d::Touch*touch,cocos2d::Event*unused_event){

PointmHeroPos=mHeroPlane->getPosition();
PointmBeganPos=touch->getLocationInView();
mBeganPos=Director::getInstance()->convertToGL(mBeganPos);

//判断当前手指按下区域是否是英雄飞机的区域,并且计算飞机要移动时的偏移量
if(mBeganPos.x>mHeroPos.x-mHeroPlane->getContentSize().width/2&&mBeganPos.x<mHeroPos.x+mHeroPlane->getContentSize().width/2&&
mBeganPos.y>mHeroPos.y-mHeroPlane->getContentSize().height/2&&mBeganPos.y<mHeroPos.y+mHeroPlane->getContentSize().height/2){
isHeroPlaneControl=true;
//�算偏移量
mDeltaX=mBeganPos.x-mHeroPos.x;
mDeltaY=mBeganPos.y-mHeroPos.y;

}

returntrue;
}
voidGameMain::onTouchMoved(cocos2d::Touch*touch,cocos2d::Event*unused_event){
if(isHeroPlaneControl){
PointmMovedPos=touch->getLocationInView();
mMovedPos=Director::getInstance()->convertToGL(mMovedPos);

SizevisibleSize=Director::getInstance()->getVisibleSize();
Pointorigin=Director::getInstance()->getVisibleOrigin();
floatx=mMovedPos.x-mDeltaX;//�得�去偏移量
floaty=mMovedPos.y-mDeltaY;

if(x<=mHeroPlane->getContentSize().width/2+origin.x)//x到达屏幕左边界
x=mHeroPlane->getContentSize().width/2+origin.x;
elseif(x>=visibleSize.width-mHeroPlane->getContentSize().width/2)//x到达屏幕右边界
x=visibleSize.width-mHeroPlane->getContentSize().width/2;

if(y<=mHeroPlane->getContentSize().height/2+origin.y)//y到达屏幕下边界
y=mHeroPlane->getContentSize().height/2+origin.y;
elseif(y>=visibleSize.height-mHeroPlane->getContentSize().height/2)//x到达屏幕上边界
y=visibleSize.height-mHeroPlane->getContentSize().height/2;

//飞机跟随手指移动
mHeroPlane->setPosition(Vec2(x,y));
}
}
voidGameMain::onTouchEened(cocos2d::Touch*touch,cocos2d::Event*unused_event){
isHeroPlaneControl=false;
}
voidGameMain::onTouchCancelled(cocos2d::Touch*touch,cocos2d::Event*unused_even){
isHeroPlaneControl=false;
}

这里再说一写主要函数

文件增加触摸事件:

virtualboolonTouchBegan(cocos2d::Touch*touch,cocos2d::Event*unused_even);

实现文件开启触摸事件监听:

//打开触摸,增加触摸监听事件
this->setTouchEnabled(true);
autolisten=EventListenerTouchOneByOne::create();
listen->onTouchBegan=CC_CALLBACK_2(GameMain::onTouchBegan,this);

然后就是触摸事件 的处理了:

boolGameMain::onTouchBegan(cocos2d::Touch*touch,cocos2d::Event*unused_even){
isHeroPlaneControl=false;
}

方法很简单,代码量也很少,有需要的把上面的自己拿过去,把图片改改,把类名改改就可以了。

其实这里应该把英雄和移动事件单独写一个类,然后在GameMain里头来调用,因为英雄这个类我还构思好,所以先这样写,后头会把英雄飞机单独提取出来成为一个类,就不会在GameMain里头写这么多了;

wKiom1T8QyfjnzlgABqxNLHvPJQ526.gif

wKioL1T8REXTT8-WAA275rBxn4o876.gif

wKiom1T8Qy3jgfhpABuBZi5igXk095.gif



效果很好,飞机能跟随移动并且不会跑出屏幕范围

二、思路说明

1、首先在onTouchBegan判断触摸点是否在英雄飞机的图片矩形内,若在这个范围内,刚将布尔型的mHeroPlaneControl设置为true,并且计算触摸点的横纵坐标与英雄飞机的锚点坐标的差值。

2、因为要让英雄飞机移动,要修改锚点位置,必须知道锚点位置与触摸位置的偏移量,之后才可以通过这个偏移量设置主角的位置。

3、判断英雄飞机是否跑出屏幕范围了,如果是,就将它设置在边界处,详看上面的两个if判断。

4、在onTouchMoved中,若mHeroPlaneControl为true,说明可以移动英雄飞机。


若你觉得此文对你有用,那就帮我赞一下~~谢谢啦

相关文章

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