《Cocos2d-x3.x游戏开发之旅》已出版~!(附源码下载地址)

笨木头  2014-10-8 18:29   Cocos2d-x   阅读(25,382)   187条评论

 

实书早就印好了,只是因为遇上国庆,物流不发图书,只能等国庆之后才能陆续上架各大网店了~预计下周就能看到了。

由于之前2.0版本一书的光盘损坏的概率不够小,所以这次就不提供随书光盘了,而是采取官网下载的方式。

 

里可能提示得不够清楚,这里给各位读者提示一下,源码下载地址:http://www.phei.com.cn/module/zygl/zxzyindex.jsp

找到我这本书的两个文件,下载就可以了~

 

另外,我自己也传了一些资料到云盘,都是些旧版本的东西,现在不好找到(2017.05.11更新):

书籍项目:http://pan.baidu.com/s/1bRUWlK
NDK R9B :http://pan.baidu.com/s/1i5hVILn
cocostudio1.2.0:http://pan.baidu.com/s/1pLF92JL
Cocos2d-x3.0:http://pan.baidu.com/s/1hsPrhGw
Android-SDK离线包:http://pan.baidu.com/s/1o7MMOrS

 

后,感谢各位喜欢这本书的读者,所谓酒逢知己千杯少,知音难寻。

我能遇到这么多知音,实在是足够了。(小若:别傻了,他根本就不会喝酒,更不会弹琴~!)

 

于那些不喜欢我这本书的朋友,你们放心,我不会恨你们的。

只不过以后你们走路小心点,别让我在美国看见你。

 

 

确定

 

 

部分购买地址如下:

china-pub购买

当当网购买

亚马逊购买

 

 

 

187 评论

  1. 木头,你代码我已经全部跑了一遍,全部可测, 但是代码基本上没有defensive check,移植的时候稍稍修改就是一堆问题。

    我最近在用你的塔防移植成一个自己设计的游戏(非塔防),所以移植的时候遇到很多问题,不继续在你网站上灌水啦,开个博客来填坑,大神你没事儿上去看看指导指导哈,谢谢谢谢。

    比如今天的问题。本来我打算有一个story的时间去根据坐标动态实现八方向角色的跑动动画。本来很简单的事情,但是还是有问题。绕来绕去又跑回C++的基础了。所以,当我觉得当把自己的游戏写完的时候,不仅cocos2d-x掌握了,c++也能学到一个。
    http://blog.163.com/leek_w/blog/#m=0&t=1&c=fks_085065093087081064087086082095085095081075084083083074085

  2. 又发现塔防移植过程中bug一枚,mark
    hero的atk speed是从csv文件里读出来的,子弹的速度是hardcode为0.5.
    默认csv的atk speed是1s,子弹的atk speed是0.5s,那么子弹在0.5攻击完之后,hero需要额外等0.5s发射下一颗子弹。
    子弹中包含了aim的地址,在子弹arrive之后,会调用aim的hert函数减hp。

    那么问题来了,下面的一个scenaro会出现segv:
    1. 设置子弹的speed为1.5s,设置hero的speed为1s。
    2. 英雄会在第一颗子弹没有arrive时发射下一颗子弹,这样英雄会同时发射多颗子弹。
    3. 在aim死掉之后,还有子弹没有arrive。
    4. SegV。

    Root Cause:
    子弹存了aim的地址,这个地址会在aim死掉是被erase。当aim erease时,还有子弹正在飞,arrive之后,aim已经被free,继续调用会出现非法访问地址。作者已经加了defensive check,判断指针是否为null,然并卵。

    Solution:
    Option1: 只要子弹的速度不大于英雄一次攻击的速度,没问题。
    Option2: 子弹到达后,遍历一遍aim list,判断当前aim是否存活。

    用Option1吧先,mark mark,先这样吧,先这样吧,穷举各种rainy case没完没了,没完没了

    1. 哈哈哈,好喜欢你的专研精神,实话说,在创业公司待久了,连个像样的开发者都没有(没钱招),我现在真是求贤若渴啊(但是不招人不招人…)

  3. 又发现作者bug一枚,fix花了两个小时, 啦啦啦。
    基于作者塔防逻辑的移植实现一个新的逻辑,英雄检测到小怪之后,移动到小怪的点,进行攻击,攻击之后,接着按指定的路径接着走到终点。

    Tollgate->heroMgr->checkAtkMonster->m_atkMonster->isDead->monsterList.eraseObject(m_atkMonster).

    之后发现英雄打死小怪之后,卡在那里不动。
    各种加log,发现monsterList在erase the monster of the died之后,在chooseAim里,monsterList的个数还是不变。

    也就是删除没有起作用。
    在checkAtkMonster的声明, checkAtkMonster(float ft, Vector monsterList), monsterList是copy的一个副本,应该声明成& monseterList).
    之后调试还是不起作用。后来发现monsterList至少被嵌套了4层,从顶层一路路改成引用,终于work啦。

            1. 如果是运行3.0的引擎,还是建议和书上一样的版本的vs(有点麻烦,抱歉),新版本的vs,对旧版本的引擎似乎不太友好,总是有点错误。

    1. 这,由于书籍对应的引擎版本比较老了,学习书上内容的话,建议用书上一致的版本(包括UI编辑器什么的),不然可能会有很多问题。
      但是HelloWorld也运行不了,我就有点尴尬了…

  4. 14章,上篇,没有白色线框,加断点调试,反现应该是没有调用darw,反复对照你的源码,发现好多错漏的地方。希望作者调整。

    1. 是啊,我的版本是3.12, draw也没有被invoke

      我在PosBase.c PosBase::init(Point pos)里自己绘制,同样的效果喽

      bool PosBase::init(Point pos) {
      log(“Enter PosBase init 1 parameter”);
      bool bRet = false;

      do {
      setPos(pos);

      auto rect = DrawNode::create();
      rect->drawRect(Vec2(pos.x – 32, pos.y + 32), Vec2(pos.x + 32, pos.y – 32), Color4F(1.0, 0, 0, 1.0));
      this->addChild(rect);

      bRet = true;
      } while (0);

      return bRet;
      }

      测试works

      1. 14章接着边读边调试,还是有问题,就是monster也会调用PosBase类,需要区分rect和circle。所以把图draw在tos和monster就可以了。
        画线也有问题,测试DrawPrimitives类已经不再支持,workaround是在TowerPosEditorLayer::loadConfigFile()通过DrawNode来划线。

        最后感谢一下作者:)

  5. 我想问一下书里第四章的按钮监听事件,怎么我的代码在运行时总会出现写入某某某位置时发生访问冲突,而且左下方的窗口里this的值显示为null,是怎么回事?而且我运行书籍源码,游戏程序能打开,但是一点按钮就游戏卡死会跳到vs的窗口,左下角也是显示this。

              1. 刚才从书里的网站重新下了一个cocostudio重新弄了一个helloui,结果没错了,重新用之前百度的cocostudiov1.4.0.1就会出错,晕…..

  6. 木头兄,我现在使用新版的cocostudio,改动比较大,发现没有专门的UI编辑器,应该是全部整合到一起了吧然后发现不知道在哪里可以导出书中的.Exporttjson文件?只看到有.csb文件,在VS里面直接编译也看到用的是这个文件,担不知道如何才能调用UI呢?麻烦告知一下啊,谢谢

      1. 请问下官方demo的具体下载位置是哪里啊?哎,找了官网一圈都找不到,特来求助,谢谢啊

  7. 木头,你在这本书中第14章 “因为偷懒儿诞生的《卡牌塔防》游戏(上篇)”里(P331页),代码清单14-1中案例中,TowerPosEditorScene.cpp文件中的 Scene * TowerPosEditorScene::scene() { … }这个应该是Scene * TowerPosEditorScene::createScene()吧,我在TowerPosEditorScene.h文件中类的定义中只发现了state Scene* createScene()函数,没有scene()函数。

      1. 还有啊,在P331页中bool posBase::init(Point pos){ do { setPos(pos); … }}那个setPos(pos)函数名称中,只大写P后编译器就无法识别,如果全小写setpos(pos)或者 S和P大写 SetPos(pos)则可以识别出来,这个setpos就是PosBase.h中定义的CC_SYNTHESIZE(Point, m_pos, pos);函数。

            1. 你骗我,我看了,头文件里定义的就是:CC_SYNTHESIZE(Point, m_pos, Pos);所以使用的时候当然是setPos了。你看看这个宏的实现:#define CC_SYNTHESIZE(varType, varName, funName)protected: varType varName;public: virtual varType get##funName(void) const { return varName; }public: virtual void set##funName(varType var){ varName = var; }最终生成的set函数是get+funName,也就是getPos,所以不可能出现你说的SetPos或者setpos。否则….你会毁了我的三观

              1. 对不起,是我错了,我又仔细查看了一下,我把PoseBase.h中的CC_SYNTHESIZE(Point, m_pos, Pos);第三个参数写成了小写的pos,然后出现了这种奇怪的问题。

  8. 木头哥,我想问一下,解决方案资源管理器里cocos2d-win32.vc2012‘的所有项目都不可用,是哪里出了问题(我q:2498833877,我加你了,不过你没接受申请,能不能先接受我的申请,我发图给你看)

  9. 木头哥,请问一下第一次运行你的项目文件就遇到编译错误:2>项目文件包含 ToolsVersion=”12.0″ 设置,但此工具集未知或缺失。您可以通过为此工具集安装相应的 .NET Framework 来解决此问题。将项目视为具有 ToolsVersion=”4.0″ 设置。2>C:Program Files (x86)MSBuildMicrosoft.Cppv4.0V110Microsoft.Cpp.Platform.targets(44,5): error MSB8020: The builds tools for v120 (Platform Toolset = ‘v120’) cannot be found. To build using the v120 build tools, either click the Project menu or right-click the solution, and then select “Update VC++ Projects…”. Install v120 to build using the v120 build tools.3>项目文件包含 ToolsVersion=”12.0″ 设置,但此工具集未知或缺失。您可以通过为此工具集安装相应的 .NET Framework 来解决此问题。将项目视为具有 ToolsVersion=”4.0″ 设置。1>项目文件包含 ToolsVersion=”12.0″ 设置,但此工具集未知或缺失。您可以通过为此工具集安装相应的 .NET Framework 来解决此问题。将项目视为具有 ToolsVersion=”4.0″ 设置。我是不是应该修改什么设置啊,我的是win764位系统,和vs2012,希望解答

      1. 木头,你好,在你的cocos2dx 2.x开发之旅中第五章102页中,判断怪物是否碰撞玩家语句里else if(monster->isCollideWithPlayer(m_player))中m_player一直提示“未定义标识符”,我也看了你的源码都没问题,引用都没错,怎么还一直报这个错啊?求教

  10. 木头哥,第八章的代码里有个Layer* parent = (Layer*)getParent(); 这段代码,我运行以后说parent值为空,为什么呢,不知道什么原因

      1. Layer* parent = (Layer*)getParent(); 这段代码在Player类里的void Player::setViewPointByPlayer()这里,TollgateScene继承了Layer,也在这里添加了addChild(player),如下 void TollgateScene::addPlayer(TMXTiledMap* map){ auto sprite = Spirte::create(“”); auto player = Player::create(); player->bindSprite(sprite); player->run(); TMXObjectGroup* objGroup = map->getObjectGroup(“”); ValueMap playerPointMap = objGroup->getObject(“”); Float pointx = playerPointMap.at(“x”).asFloat(); Float pointy = playerPointMap.at(“y”).asFloat(); player->setPosition(Point(pointx,pointy)); this->addChild(player); auto simplemovecontroller = SimpleMoveController::create(); simplemovecontroller->setSleep(2); this->addChild(simplemovecontroller); player->setController(simplemovecontroller); player->setTMXTiledMap(tmap); }通过木头哥的书在学做游戏,在mac上,应该是我在有些地方出问题,新手,求告知

          1. 这我也看不出来了,建议用“注释法”确认问题代码在哪里,也就是把大部分逻辑注释掉,看还有没有问题,有问题,就继续注释,没问题,就慢慢放开注释,直到出现问题为止。

            1. 好的,谢谢木有哥。Allocating an object of abstract class type 是不是这个类里有虚函数没有实现?virtual定义的对吗,都实现了啊?

                1. 嗯,找到了,谢谢,就是主角类继承了实体类,实体又继承了监听控制器的接口类,需要重写并实现这个接口里的方法。还有个地方不是很懂,我发现木头哥你的代码里,实体类重写了接口类里的2个方法,但是在主角类里只重写了一个,另一个并没有重写。也没有报错。可在我的代码里,我如果不把2个全重写,就会报Allocating an object of abstract class type这个错。

                  1. 你的父类有实现接口的方法吗?实体类实现的是接口的方法,而主角类是继承了实体类的,它只是重写父类的方法,与接口无关了。我是这么理解的。

    1. 差不多2年前,我去一家游戏公司面试,拿着自己用Cocos2d-x做的第一个游戏(那时候我也刚研究这引擎不久)去面试。技术主管只说了一句:“哈哈,我最恨这类型的游戏了”,然后他只是随便点了几下,而我最用心制作的剧情却一眼都没有看。笔试题是C++,我做得很烂,因为那时候我对C++还很生疏,我全用Java的思维去回答。最后,我进了这家公司(虽然后来因为某些原因我还是离开了)。说了这么多,我只是想表达一个意思:我回答不了你的这个问题…因为,这完全取决于面试官是谁。如果硬是要我说一个答案的话,那,我想说的是——在你面试之前,你能做到的你所认为的最好的程度,就可以拿去吹了~【PS:我爱自己的每一个烂游戏~!

    1. 不是的,只不过是用了一些C++11的语法而已,感觉大家对C++11好像有点奇特的看法….书里讲的是Cocos2d-x,与C++11没有任何直接关系,API里用了C++11的语法,那么我就会讲解到,书籍并不是以C++为重点

  11. 木头哥,看完了你的3.x,就是有个问题:网上下载的那些cocos2d3.x手游源码怎么导入vs2013,每次导入都有一大堆错误。能详细点吗?初学者,这本书快看完了,但是觉得还很不够,能不能推荐一下比较好的 书

    1. 入门之后就没什么推荐了,要看也不需要看Cocos2d-x的书了,而是看其他的技术书籍。接下来你可以写2到3个游戏,花上2个月到6个月的时间,到时候就算是对Cocos2d-x游戏开发有个不错的基础了。最重要的是掌握解决问题的能力,因为不管我们变得多牛,问题都会不断出现。导入项目有错误,就尝试去解决吧,没有固定的教程,因为问题太杂了…不要害怕问题,我从菜鸟时期开始(现在也还在努力),一直都是一个人折腾过来的,根本没人帮我

      1. 好羡慕你想写什么就能写什么!看完你的书之后虽然能跟着你的思维看懂代码的意思,但是我压根还不知道怎么去写一个游戏,因为我不知道从何下手,茫茫然,不知道一个游戏该用什么去联系起来,怎么去实现!木头有过这经历吗,怎么解决的呢?

        1. 我可不是想写什么就写什么,写新东西的时候还是要各种折腾了 你的经历每个人都有,而且没法解决,只能随着时间的流逝慢慢减弱,对未知的恐惧,是永远都不会消失的吧..所以,你要做的是,写自己的游戏,在写的过程中去成长,最好是所有的问题都自己解决(哪怕一个问题花一个星期)。你是看不见自己的成长的,但你会猛然发现自己变强了。

发表评论

电子邮件地址不会被公开。 必填项已用*标注