雷神大战相信都知道这个游戏,本教程要实现游戏中,人的手指按着飞机,就能拖着飞机走动,也就是当你手指按在手机的图片上,手指一直按着屏幕,飞机就会跟着你走。同时,飞机会在你的视野内移动,实现的效果完全和我们手机上的飞机游戏一样。

效果:

1.gif

Cocos2d-x版本:3.4

工程环境:VS30213


一、代码编写

1、头文件GameMain.h

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
/** 
*@作者 林炳文(邮箱:ling20081005@126.com) 
*@时间 2015.3.8 
*@功能 游戏的主界面 
*/  
#ifndef __GameMain_H__  
#define __GameMain_H__  
#include "BackLayerDown.h"  
#include "BackLayerUp.h"  
#include "cocos2d.h"  
USING_NS_CC;  
class GameMain : public cocos2d::Layer  
{  
public:  
    static cocos2d::Scene* createScene();  
    virtual bool init();  
       
    virtual bool onTouchBegan(cocos2d::Touch *touch, cocos2d::Event *unused_event);  
    virtual void onTouchMoved(cocos2d::Touch *touch, cocos2d::Event *unused_event);  
    virtual void onTouchEened(cocos2d::Touch *touch, cocos2d::Event *unused_event);  
    virtual void onTouchCancelled(cocos2d::Touch *touch, cocos2d::Event *unused_even);  
      
    CREATE_FUNC(GameMain);  
private:  
    bool isHeroPlaneControl;//飞机是否被控制着  
    float mDeltaX;//英雄飞机随手指移动时的X偏移量  
    float mDeltaY;//英雄飞机随手指移动时的Y偏移量  
    Sprite *mHeroPlane;//英雄飞机  
};  
   
#endif // __GameMain_H__

然后在GameMain.cpp中增加:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
#include "GameMain.h"  
USING_NS_CC;  
Scene* GameMain::createScene()  
{  
    auto scene = Scene::create();  
    auto layer = GameMain::create();  
    scene->addChild(layer);  
    return scene;  
}  
   
bool GameMain::init()  
{  
    Size visibleSize = Director::getInstance()->getVisibleSize();  
    Point origin = 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);  
    auto listen = 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);  
   
    return true;  
}  
bool  GameMain::onTouchBegan(cocos2d::Touch *touch, cocos2d::Event *unused_event){  
       
    Point mHeroPos = mHeroPlane->getPosition();  
    Point mBeganPos = 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;  
   
    }  
   
    return true;  
}  
void  GameMain::onTouchMoved(cocos2d::Touch *touch, cocos2d::Event *unused_event){  
    if (isHeroPlaneControl){  
        Point mMovedPos = touch->getLocationInView();  
        mMovedPos = Director::getInstance()->convertToGL(mMovedPos);  
   
        Size visibleSize = Director::getInstance()->getVisibleSize();  
        Point origin = Director::getInstance()->getVisibleOrigin();  
        float x = mMovedPos.x - mDeltaX;//記得減去偏移量  
        float y = mMovedPos.y - mDeltaY;  
       
        if (x <= mHeroPlane->getContentSize().width / 2 + origin.x)//x到达屏幕左边界  
            x = mHeroPlane->getContentSize().width / 2 + origin.x;  
        else if (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;  
        else if (y >= visibleSize.height - mHeroPlane->getContentSize().height / 2)//x到达屏幕上边界  
            y = visibleSize.height - mHeroPlane->getContentSize().height/ 2;  
   
        //飞机跟随手指移动  
        mHeroPlane->setPosition(Vec2(x,y));  
    }  
}  
void  GameMain::onTouchEened(cocos2d::Touch *touch, cocos2d::Event *unused_event){  
    isHeroPlaneControl = false;  
}  
void  GameMain::onTouchCancelled(cocos2d::Touch *touch, cocos2d::Event *unused_even){  
    isHeroPlaneControl = false;  
0