在这篇文章,将会学习到怎样制作一个塔防游戏。在这其中,学习怎样在设定的时间内出现一波波的敌人,使这些敌人沿着指定的路点前进。怎样在地图上指定的位置创建炮塔。怎样使炮塔射击敌人,怎样可视化调试路点和炮塔的攻击范围。

对于刚開始学习的人来说。这个样例是非常适合的。对于熟悉cocos2d有非常好的帮助,希望初学cocos的博友们细致搞搞, 本人刚開始做这个 咨询了原文作者好几次。祝大家成功!

1.新建Cocos2d-win32project,project名为"TowerDefense",去除"Box2D"选项,勾选"Simple Audio Engine in Cocos Denshion"选项;

2.下载本游戏所需的资源,将资源放置"Resources"文件夹下;

资源中包含源码:http://download.csdn.net/detail/yangshuo528/7426007



3.为场景加入背景图片。打开HelloWorldScene.cpp文件,改动init函数。例如以下:

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17
bool HelloWorld::init()

{

    bool bRet = false;

    do 

    {

        CC_BREAK_IF(! CCLayer::init());

        

        this->setTouchEnabled(true);

        CCSize wins = CCDirector::sharedDirector()->getWinSize();

        CCSprite *background = CCSprite::create("Bg.png");

        this->addChild(background);

        background->setPosition(ccp(wins.width / , wins.height / ));



        bRet = true;

    } );

    return bRet;

}

通过放置的背景图片。能够直观的看出哪些地方同意玩家放置炮塔。编译执行,例如以下图所看到的:



4.接着。须要沿路设置一些点,在这些点上能够让玩家触摸和建立炮塔。为了方便管理,使用.plist文件来存储炮塔的放置点。这样就能够非常easy的改变它们。TowersPosition.plist已经在资源目录中。当中已经有了一些炮塔的位置。查看这个文件,能够看到一个字典数组,字典仅仅包括两个键"x"和"y"。每一个字典条目代表一个炮塔位置的x和y坐标。

如今须要读取这个文件,而且放置塔基到地图上。打开HelloWorldScene.h文件,加入下面变量:

1
cocos2d::CCArray* towerBases;

打开HelloWorldScene.cpp文件,加入例如以下方法:

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17
void HelloWorld::loadTowerPositions()

{

    CCArray* towerPositions = CCArray::createWithContentsOfFile("TowersPosition.plist");

    towerBases = CCArray::createWithCapacity();

    towerBases->retain();



    CCObject *pObject = NULL;

    CCARRAY_FOREACH(towerPositions, pObject)

    {

        CCDictionary* towerPos = (CCDictionary*)pObject;

        CCSprite* towerBase = CCSprite::create("open_spot.png");

        this->addChild(towerBase);

        towerBase->setPosition(ccp(((CCString*)towerPos->objectForKey("x"))->intValue(),

            ((CCString*)towerPos->objectForKey("y"))->intValue()));

        towerBases->addObject(towerBase);

    }

}

init函数里面。加入背景图片代码之后,加入例如以下代码:

1
this->loadTowerPositions();

在析构函数里面。加入例如以下代码:

1
towerBases->release();

编译执行。就能够看到道路两側的方块,这些是做为玩家炮塔的基座。例如以下图所看到的:



5.開始建立炮塔。打开HelloWorldScene.h文件。加入例如以下代码:

1
CC_SYNTHESIZE_RETAIN(cocos2d::CCArray*, _towers, Towers);

加入Tower类,派生自CCNode类。Tower.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
#ifndef __TOWER_H__

#define __TOWER_H__



#include "cocos2d.h"

#include "HelloWorldScene.h"







class Tower : public cocos2d::CCNode

{

public:

    Tower(void);

    ~Tower(void);



    static Tower* nodeWithTheGame(HelloWorld* game, cocos2d::CCPoint location);

    bool initWithTheGame(HelloWorld* game, cocos2d::CCPoint location);



    void update(float dt);

    void draw(void);



    CC_SYNTHESIZE(HelloWorld*, _theGame, TheGame);

    CC_SYNTHESIZE(cocos2d::CCSprite*, _mySprite, MySprite);



private:

    int attackRange;

    int damage;

    float fireRate;

};



#endif  // __TOWER_H__

打开Tower.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
#include "Tower.h"

using namespace cocos2d;



Tower::Tower(void)

{

}



Tower::~Tower(void)

{

}



Tower* Tower::nodeWithTheGame(HelloWorld* game, CCPoint location)

{

    Tower *pRet = new Tower();

    if (pRet && pRet->initWithTheGame(game, location))

    {

        return pRet;

    }

    else

    {

        delete pRet;

        pRet = NULL;

        return NULL;

    }

}



bool Tower::initWithTheGame(HelloWorld* game, CCPoint location)

{

    bool bRet = false;

    do 

    {

        attackRange = ;

        damage = ;

        fireRate = ;

        

        _mySprite = CCSprite::create("tower.png");

        this->addChild(_mySprite);

        _mySprite->setPosition(location);

        _theGame = game;

        _theGame->addChild(this);



        this->scheduleUpdate();



        bRet = true;

    } );



    return bRet;

}



void Tower::update(float dt)

{



}



void Tower::draw(void)

{

#ifdef COCOS2D_DEBUG

    ccDrawColor4F(, , , );

    ccDrawCircle(_mySprite->getPosition(), attackRange, , , false);

#endif

    CCNode::draw();

}

这个Tower类包括几个属性:一个精灵对象,这是炮塔的可视化表现;一个父层的引用,方便訪问父层。还有三个变量:

  • attackRange: 炮塔能够攻击敌人的距离。
  • damage: 炮塔对敌人造成的伤害值。

  • fireRate: 炮塔再次攻击敌人的时间间隔。

有了这三个变量。就能够创建各种不同攻击属性的炮塔,比方须要非常长时间来又一次载入的远程重击,或者范围有限的高速攻击。最后。代码中的draw方法,用于在炮塔周围绘制一个圆。以显示出它的攻击范围,这将方便调试。

6.让玩家加入炮塔。打开HelloWorldScene.cpp文件,加入下面头文件声明:

1
#include "Tower.h"

在析构函数中加入例如以下代码:

1
_towers->release();

在init函数,加入例如以下代码:

1

2
_towers = CCArray::create();

_towers->retain();

加入例如以下两个方法。代码例如以下(在 HelloWorldScene.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
bool HelloWorld::canBuyTower()

{

    return true;

}



void HelloWorld::ccTouchesBegan(CCSet *pTouches, CCEvent *pEvent)

{

    CCSetIterator iter = pTouches->begin();

    for (; iter != pTouches->end(); iter++)

    {

        CCTouch* pTouch = (CCTouch*)(*iter);

        CCPoint location = pTouch->getLocation();



        CCObject *pObject = NULL;

        CCARRAY_FOREACH(towerBases, pObject)

        {

            CCSprite *tb = (CCSprite*)pObject;

            if (this->canBuyTower() && tb->boundingBox().containsPoint(location) && !tb->getUserData())

            {

                //We will spend our gold later.



                Tower* tower = Tower::nodeWithTheGame(this, tb->getPosition());

                _towers->addObject(tower);

                tb->setUserData(tower);

            }           

        }

    }

}

方法ccTouchesBegan检測当用户触摸屏幕上不论什么点时,遍历towerBases数组,检查触摸点是否包括在不论什么一个塔基上。

只是在创建炮塔前。还有两件事须要检查:

①玩家是否买得起炮塔?canBuyTower方法用来检查玩家是否有足够的金币来购买炮塔。

在这里先如果玩家有非常多金币。方法返回true。

②玩家是否违法了建筑规则?假设tb的UserData已经设置了。那么这个塔基已经有了炮塔,不能再加入一个新的了。

假设一切检查都通过,那么就创建一个新的炮塔。放置在塔基上,并将它加入到炮塔数组中。编译执行,触摸塔基,就能够看到炮塔放置上去了,而且它的周围还有白色的圆圈显示攻击范围,例如以下图所看到的:

參考资料:1.How To Make a Tower Defense Game  http://www.raywenderlich.com/15730/how-to-make-a-tower-defense-game

怎样制作一个塔防游戏:http://blog.csdn.net/akof1314/article/details/8674186

制作一个塔防游戏 Cocos2d-x 2.1.4 (一)的更多相关文章

  1. [译]终极塔防——运用HTML5从头创建一个塔防游戏

    翻译共享一篇CodeProject的高星力作,原文地址:http://www.codeproject.com/Articles/737238/Ultimate-Tower-Defense 下载演示项目 ...

  2. 从零开始手把手教你使用javascript+canvas开发一个塔防游戏01地图创建

    项目演示 项目演示地址: 体验一下 项目源码: 项目源码 代码结构 本节做完效果 游戏主页面 index.html <!DOCTYPE html PUBLIC "-//W3C//DTD ...

  3. 使用Unity创建塔防游戏(Part1)

    How to Create a Tower Defense Game in Unity - Part1 原文作者:Barbara Reichart 文章原译:http://www.cnblogs.co ...

  4. 使用unity创建塔防游戏(原译)(part1)

    塔防游戏非常地受欢迎,木有什么能比看着自己的防御毁灭邪恶的入侵者更爽的事了. 在这个包含两部分的教程中,你将使用Unity创建一个塔防游戏. 你将会学到如何: 创建一波一波的敌人 使敌人随着路标移动 ...

  5. Cocos2D:塔防游戏制作之旅(十八)

    在Enemy.m的getDamaged:方法只给你添加如下1行(在if条件内): [theGame awardGold:200]; 现在运行游戏你将注意到你不能放置超出你资源金币的炮塔了.当然杀死敌人 ...

  6. Cocos2D:塔防游戏制作之旅(一)

    原文地址:http://www.raywenderlich.com/37701/how-to-make-a-tower-defense-game-tutorial 由Pablo Ruiz写的入门教程, ...

  7. Cocos2D:塔防游戏制作之旅(十六)

    编译运行你的app,放置一些炮塔在你的地图上吧!你将看到炮塔在敌人移动如攻击范围时如何立即开始攻击,并且敌人的血条将随着攻击不断减少知道它们被人道毁灭!胜利即将来临了! 哦!Okay,这里只有少数细节 ...

  8. Cocos2D:塔防游戏制作之旅(二)

    一个象牙塔的视图 如果你并不熟悉此类型的游戏,塔防游戏是一个战略游戏,你需要购买和将武装塔放置在战略位置,去阻止一波又一波的敌人到达并摧毁你的基地 每一波敌人都更强,这些更强的对手有着更快的速度和对于 ...

  9. Cocos2d-x3.x塔防游戏(保卫萝卜)从零开始(二)

    一.前提: 完成前一篇的内容. 具体参考:Cocos2d-x3.x塔防游戏(保卫萝卜)从零开始(一)篇 二.本篇目标: l  说说关于cocos2dx手机分辨率适配 l  对前一篇完成的塔防游戏原型进 ...

随机推荐

  1. bzoj 1038 瞭望塔 半平面交+分段函数

    题目大意 给你一座山,山的形状在二维平面上为折线 给出\((x_1,y_1),(x_2,y_2)...(x_n,y_n)\)表示山的边界点或转折点 现在要在\([x_1,x_n]\)(闭区间)中选择一 ...

  2. Java-堆排序

    public class Main { public static void main(String[] args) { int a[] = {8, 2, 5, 6, 4, 8, 9, 7, 14, ...

  3. 使用gcc的-finstrument-functions选项进行函数跟踪【转】

    转自:http://blog.csdn.net/jasonchen_gbd/article/details/44044899 版权声明:本文为博主原创文章,转载请附上原博链接. GCC Functio ...

  4. 标准C程序设计七---50

    Linux应用             编程深入            语言编程 标准C程序设计七---经典C11程序设计    以下内容为阅读:    <标准C程序设计>(第7版) 作者 ...

  5. 洛谷——P2386 放苹果

    P2386 放苹果 题目背景 (poj1664) 题目描述 把M个同样的苹果放在N个同样的盘子里,允许有的盘子空着不放,问共有多少种不同的分发(5,1,1和1,1,5是同一种方法) 输入输出格式 输入 ...

  6. springboot多环境配置

    springboot多环境(dev.test.prod)配置 2017-07-17 10:33 1290人阅读 评论(0) 收藏 举报  分类: spring boot(6)  版权声明:本文为博主原 ...

  7. Interface Builder中的技巧

    在我工作中经常会遇到有人吐槽Xcode中的interface builder(以下简称IB)不好用的开发者.在我看来,IB是一个非常棒的可视化开发工具,可以非常快捷的设置UI控件的大部分常用属性.下面 ...

  8. Android开发者选项——Gpu呈现模式分析

    对于Android用户来说,无论你用的什么品牌的手机,在开发者选项中都能发现“玄学曲线”的开关,之所以称其为玄学曲线,还是因为它被很多网友用于测试一个说不清道不明的东西——流畅度.到底多流畅才叫流畅, ...

  9. DEDECMS5.5怎样调用{dede:field.content/}做简介之类的单独页面?

    很多时候,如果用dede来做一些企业公司网站,或者一些部门网站的时候.需要某些栏目是一个单页的文章,用于公司简介或者企业文化之类的.那么就要用到栏目功能的栏目内容,也就是dede的content标签. ...

  10. httplib 和 httplib2区别之 gzip解压

    HTTP请求头Accept-encoding: gzip信息告诉服务器,如果它有任何新数据要发送给时,请以压缩的格式发送.如果服务器支持压缩,它将返回由 gzip 压缩的数据并且使用Content-e ...