游戏开发引擎cocos引擎 《雷电大战》开发教程.docx

上传人:b****6 文档编号:8441556 上传时间:2023-01-31 格式:DOCX 页数:53 大小:31.96KB
下载 相关 举报
游戏开发引擎cocos引擎 《雷电大战》开发教程.docx_第1页
第1页 / 共53页
游戏开发引擎cocos引擎 《雷电大战》开发教程.docx_第2页
第2页 / 共53页
游戏开发引擎cocos引擎 《雷电大战》开发教程.docx_第3页
第3页 / 共53页
游戏开发引擎cocos引擎 《雷电大战》开发教程.docx_第4页
第4页 / 共53页
游戏开发引擎cocos引擎 《雷电大战》开发教程.docx_第5页
第5页 / 共53页
点击查看更多>>
下载资源
资源描述

游戏开发引擎cocos引擎 《雷电大战》开发教程.docx

《游戏开发引擎cocos引擎 《雷电大战》开发教程.docx》由会员分享,可在线阅读,更多相关《游戏开发引擎cocos引擎 《雷电大战》开发教程.docx(53页珍藏版)》请在冰豆网上搜索。

游戏开发引擎cocos引擎 《雷电大战》开发教程.docx

游戏开发引擎cocos引擎《雷电大战》开发教程

目录

第1节:

游戏开发引擎—Cocos2d-x3.4《雷电大战》01:

双层地图无限滚动

第2节:

游戏开发引擎Cocos2d-x3.4《雷电大战》02:

精灵随手指移动,你点哪我走哪!

第3节:

游戏开发引擎—Cocos2d-x3.4《雷电大战》03:

子弹无限发射

第四节:

游戏开发引擎Cocos2d-x3.4《雷电大战》04:

策略模式实现不同子弹切换

游戏开发引擎—Cocos2d-x3.4《雷电大战》01:

双层地图无限滚动

本文检索关键词:

游戏引擎,游戏开发引擎,cocos引擎html5游戏开发

本文要实现飞机射击游戏中的地图无限滚动的功能,这里分为两个层,一个层无限向下滚动,一个层无限向上滚动,这样子结合起来效果就非常有层次感,也非常逼真,这里我把地图层都写成一个类,自己把地图改下,就可以成为你自己的了!

下面,我们开始吧。

先来看看效果:

开发环境:

Cocos2d-x3.4版本

工程环境:

VS30213

一、游戏开发引擎—实现思路

其实就是两张图片,然后同时一起向下(向上)滚动,当一张图片完全出视野后,就把它调到最上面。

形成两个图片交替出现,不过,一般为游戏中我们都感觉像是一张图片,那是因为两张图片的头尾连接处是连起来的。

原理我画了些图:

 

二、游戏开发引擎—代码

1、无限向下滚动BackLayerDown类

头文件:

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

#ifndef __BackLayerDown_H__  

#define __BackLayerDown_H__  

/** 

*功能 實現無限地圖向下滾動 

*作者 林炳文 

*時間 2015.2.27 

*/  

#include "cocos2d.h"  

#define MAP_1_Tag   1       // 宏定义两个Map的Tag    

#define MAP_2_Tag   2   

class BackLayerDown :

 public cocos2d:

:

Layer  

{  

public:

  

    virtual bool init();  

    CREATE_FUNC(BackLayerDown);  

private:

  

    void update(float time);  

    virtual void onExit();  

};  

   

#endif // __BackLayerDown_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

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

#include "BackLayerDown.h"  

   

USING_NS_CC;  

   

   

bool BackLayerDown:

:

init()  

{  

     

    if ( !

Layer:

:

init() )  

    {  

        return false;  

    }  

       

    Size visibleSize = Director:

:

getInstance()->getVisibleSize();  

    Point origin = Director:

:

getInstance()->getVisibleOrigin();  

   

    Sprite* map1 = Sprite:

:

create("back3_1.png");  

    Sprite* map2 = Sprite:

:

create("back3_2.png");  

    map1->setPosition(Vec2(visibleSize.width / 2 + origin.x, visibleSize.height / 2 + origin.y));  

    map2->setPosition(Vec2(visibleSize.width / 2 + origin.x, visibleSize.height + origin.y + map2->getContentSize().height / 2));  

    this->addChild(map1, 0, MAP_1_Tag);  

    this->addChild(map2, 0, MAP_2_Tag);  

    this->scheduleUpdate();  

   

       

    return true;  

}  

   

//移動并判斷背景  

void BackLayerDown:

:

update(float time)  

{  

    Size visibleSize = Director:

:

getInstance()->getVisibleSize();  

    Point origin = Director:

:

getInstance()->getVisibleOrigin();  

   

    Sprite* temMap1 = (Sprite*)this->getChildByTag(MAP_1_Tag);  

    Sprite* temMap2 = (Sprite*)this->getChildByTag(MAP_2_Tag);  

   

    temMap1->setPositionY(temMap1->getPositionY() - 1);  

    temMap2->setPositionY(temMap2->getPositionY() - 1);  

   

    if (temMap1->getPositionY() + temMap1->getContentSize().height / 2 <= origin.y)  

    {  

        float offset = temMap1->getPositionY() + temMap1->getContentSize().height / 2 - origin.y;  

        temMap1->setPosition(Vec2(visibleSize.width / 2 + origin.x, temMap1->getContentSize().height / 2 + origin.y + visibleSize.height + offset));  

    }  

   

    if (temMap2->getPositionY() + temMap2->getContentSize().height / 2 <= origin.x)  

    {  

        float offset = temMap2->getPositionY() + temMap2->getContentSize().height / 2 - origin.y;  

        temMap2->setPosition(Vec2(visibleSize.width / 2 + origin.x, temMap2->getContentSize().height / 2 + origin.y + visibleSize.height + offset));  

    }  

}  

   

void BackLayerDown:

:

onExit()  

{  

    this->unscheduleUpdate();  

    Layer:

:

onExit();  

}

2、无限向上滚动BackLayerUp类

头文件:

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

#ifndef __BackLayerUp_H__  

#define __BackLayerUp_H__  

/** 

*功能 實現無限地圖向上滾動 

*作者 林炳文 

*時間 2015.2.27 

*/  

#include "cocos2d.h"  

#define MAP_1_Tag   1       // 宏定义两个Map的Tag    

#define MAP_2_Tag   2   

class BackLayerUp :

 public cocos2d:

:

Layer  

{  

public:

  

    virtual bool init();  

    CREATE_FUNC(BackLayerUp);  

private:

  

    void update(float time);  

    virtual void onExit();  

};  

   

#endif // __BackLayerUp_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

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

#include "BackLayerUp.h"  

   

USING_NS_CC;  

   

   

bool BackLayerUp:

:

init()  

{  

     

    if ( !

Layer:

:

init() )  

    {  

        return false;  

    }  

       

    Size visibleSize = Director:

:

getInstance()->getVisibleSize();  

    Point origin = Director:

:

getInstance()->getVisibleOrigin();  

   

    Sprite* map1 = Sprite:

:

create("back4_2.png");  

    Sprite* map2 = Sprite:

:

create("back4_1.png");  

    map1->setPosition(Vec2(visibleSize.width / 2 + origin.x, visibleSize.height / 2 + origin.y));  

    map2->setPosition(Vec2(visibleSize.width / 2 + origin.x, origin.y - map2->getContentSize().height / 2));  

    this->addChild(map1, 0, MAP_1_Tag);  

    this->addChild(map2, 0, MAP_2_Tag);  

    this->scheduleUpdate();  

   

       

    return true;  

}  

   

//移動并判斷背景  

void BackLayerUp:

:

update(float time)  

{  

    Size visibleSize = Director:

:

getInstance()->getVisibleSize();  

    Point origin = Director:

:

getInstance()->getVisibleOrigin();  

   

    Sprite* temMap1 = (Sprite*)this->getChildByTag(MAP_1_Tag);  

    Sprite* temMap2 = (Sprite*)this->getChildByTag(MAP_2_Tag);  

   

    temMap1->setPositionY(temMap1->getPositionY() + 1);  

    temMap2->setPositionY(temMap2->getPositionY() + 1);  

   

    if (temMap1->getPositionY() - temMap1->getContentSize().height / 2 >= visibleSize.height)  

    {  

    float offset = temMap1->getPositionY() - temMap1->getContentSize().height / 2 - visibleSize.height;  

    temMap1->setPosition(Vec2(visibleSize.width / 2 + origin.x, -temMap1->getContentSize().height / 2 - origin.y - offset));  

    }  

   

    if (temMap2->getPositionY() - temMap2->getContentSize().height / 2 >= visibleSize.height)  

    {  

    float offset = temMap2->getPositionY() - temMap2->getContentSize().height / 2 - visibleSize.height;  

    temMap2->setPosition(Vec2(visibleSize.width / 2 + origin.x, -temMap2->getContentSize().height / 2 - origin.y  - offset));  

    }  

}  

   

void BackLayerUp:

:

onExit()  

{  

    this->unscheduleUpdate();  

    Layer:

:

onExit();  

}

3、说明

其实这两个类可以写在一起的,但是这里我为了能让不同的需要分开,把它们分别写开了,要注意上面判断的方法,无限向下和无限向上判断方法是不样的,而且,这里为了防止出现黑边,要记得设置位置时要加上一定的偏移量,如上面函数中的offset,这里非常重要,如果没边上这个东东,有可能两张图片在切换时,有出现黑边。

三、游戏开发引擎—使用方法

在要用到的地方,把头文件加上:

1

2

#include "BackLayerDown.h"

#include "BackLayerUp.h"

然后在工程的init()函数添加:

1

2

3

4

5

6

7

8

9

10

11

Size visibleSize = Director:

:

getInstance()->getVisibleSize();

Point origin = Director:

:

getInstance()->getVisibleOrigin();

//这是地面图层

this->addChild(BackLayerUp:

:

create());

//这是白云图层

this->addChild(BackLayerDown:

:

create());

 

//加个飞机

Sprite *airplane_sprite = Sprite:

:

create("air1.png");

airplane_sprite->setPosition(Vec2(visibleSize.width / 2, visibleSize.height/ 5));

this->addChild(airplane_sprite);

游戏开发引擎Cocos2d-x3.4《雷电大战》02:

精灵随手指移动,你点哪我走哪!

本文要实现飞机游戏中,人的手指按着飞机,就能拖着飞机走动,这里实现了当你手指按在手机的图片上,手指一直按着屏幕,飞机就会跟着你走。

同时,还加入了边界判断条件,让飞机在你的视野内移动,实现的效果完全和我们手机上的飞机游戏一样。

效果:

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

*/  

#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,

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 成人教育 > 专升本

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1