转载请注明,原文地址: http://www.benmutou.com/archives/28
文章来源:笨木头与游戏开发

Cocos2d-x游戏实例-《跑跑跑》制作教程(第二篇)——加入主角

 

笨木头花心贡献,啥?花心?不呢,是用心~ 转载请注明,原文地址 http://www.benmutou.com/archives/28

正文:

注:本文使用到的资源请到这里下载:http://download.csdn.net/detail/musicvs/4769412

1.  实体父类

因为我觉得玩家和怪物会有一些共同的操作,所以我将玩家和怪物都定为一个实体,于是,我们需要一个实体类作为父类(实体文件夹下创建Entity.hEntity.cpp文件)

[cce_cpp]//Entity.h文件

#ifndef __ENTITY_H__ #define __ENTITY_H__

#include "cocos2d.h"

using namespace cocos2d;

class Entity : public CCNode { public: void setSprite(CCSprite* mSprite);

protected: CCSprite* mSprite; };

#endif</pre> <pre class="cpp">//Entity.cpp文件

#include "Entity.h"

void Entity::setSprite( CCSprite* mSprite ) { this->mSprite = mSprite; }[/cce_cpp]

实体类很简单,目前只有一个setSprite方法。

 

2. 创建玩家

现在我们需要一个Player类,虽然玩家表面上看是一个精灵,但是我们不直接让它继承精灵类,我们用组合的方式来做,精灵类只是玩家的一个属性。我们让玩家继承实体类(在实体文件夹下创建Player.hPlayer.cpp):

[cce_cpp]//Player.h文件

#ifndef __PLAYER_H__ #define __PLAYER_H__

#include "Entity.h"

class Player : public Entity { public: CREATE_FUNC(Player); virtual bool init(); };

#endif[/cce_cpp] [cce_cpp]//Player.cpp文件

#include "Player.h"

bool Player::init() { return true; }[/cce_cpp]

OK,玩家有了,我们把它加到地图里吧~

打开我们的TollgateScene.cpp文件,修改init方法,加入如下代码:

[cce_cpp]/* -------------- 加载玩家 --------------- */ CCSize visibleSize = CCDirector::sharedDirector()->getVisibleSize(); CCSprite* playerSprite = CCSprite::create("sprite/player1.png"); playerSprite->setPosition(ccp(100, visibleSize.height / 2));

/* 精灵添加到地图 */ map->addChild(playerSprite);

/* 将精灵绑定到玩家对象上 */ Player* mPlayer = Player::create(); mPlayer->setSprite(playerSprite);[/cce_cpp]

OK,编译运行,我们将看到我们的主角(话说这个主角是不是太丑了= =,我找不到又帅又在跑的资源)。

Cocos2d-x游戏实例-《跑跑跑》制作教程(第二篇)——加入主角

 

3. 固定玩家出生点(对象层的使用)

现在主角的坐标是在代码里写死的,我们还可以更灵活一点,Tiled Map还有一个很厉害的功能,那就是:对象层。

其实没有多神奇,就是在地图上的某个位置设置一个对象,然后可以在代码里获取这个对象的信息,比如坐标,对了,就是要坐标~

来,打开我们的地图编辑器,点击菜单栏的图层,添加对象层,新建一个对象层:

Cocos2d-x游戏实例-《跑跑跑》制作教程(第二篇)——加入主角

或者在右下角的图层那里点击新建:

Cocos2d-x游戏实例-《跑跑跑》制作教程(第二篇)——加入主角

 

然后将图层命名为“objects”,哇,好形象的名字,噗~

Cocos2d-x游戏实例-《跑跑跑》制作教程(第二篇)——加入主角

 

现在我们要绘制对象,点击菜单栏上的这个按钮:

Cocos2d-x游戏实例-《跑跑跑》制作教程(第二篇)——加入主角

 

然后在地图上绘制一个矩形,它代表一个对象:

Cocos2d-x游戏实例-《跑跑跑》制作教程(第二篇)——加入主角

 

接下来,我们要给这个对象命名,在矩形上右键,选择对象属性,然后命名为PlayerPoint

Cocos2d-x游戏实例-《跑跑跑》制作教程(第二篇)——加入主角

 

OK,我们现在只要在代码里取得PlayerPoint对象,再获得它的xy属性就可以了。

继续打开TollgateScene.cpp文件,修改init函数,在设置玩家精灵坐标的前面,添加以下代码:

[cce_cpp]/* 加载对象层 */ CCTMXObjectGroup* objGroup = map->objectGroupNamed("objects");

/* 加载玩家坐标对象 */ CCDictionary* playerPointDic = objGroup->objectNamed("PlayerPoint"); float playerX = playerPointDic->valueForKey("x")->floatValue(); float playerY = playerPointDic->valueForKey("y")->floatValue();

/* -------------- 加载玩家 --------------- */ CCSize visibleSize = CCDirector::sharedDirector()->getVisibleSize(); CCSprite* playerSprite = CCSprite::create("sprite/player1.png"); playerSprite->setPosition(ccp(playerX, playerY));[/cce_cpp]

简单解释一下。

CTMXObjectGroup存放了我们对象层的所有对象,map->objectGroupNamed(“objects”)就是取得了我们刚刚创建的obejects对象层里的所有对象,当然,目前只有一个PlayerPoint对象。

怎么取得PlayerPoint对象呢,通过objectNamed函数来获得,获得之后返回的是一个CCDictionary对象,CCDictionary是什么东西?不知道大家用过Java没有?和JavaHashMap是差不多的概念,就是一个key值对应一个value值,然后可以存放很多对这样的keyvalue

于是,我们从playerPointDic里取得PlayerPoint对象的xy坐标值,然后给玩家精灵设置坐标就好了。

来,编译运行,我们的主角就出现在我们需要的位置了~

Cocos2d-x游戏实例-《跑跑跑》制作教程(第二篇)——加入主角

 

下一篇我们要让主角跑起来了,主角跑起来很帅的~
16 条评论
  • 乜亻八一 2015-12-15 14:08:12

    3.0 这句要出错
    CCDictionary* playerPointDic = objGroup->objectNamed("PlayerPoint");
    说valuemap不能转换CCDictionary
    0回复
    • 博主 糟糕_树叶的mut 2015-12-15 21:10:47

      3.0还是看那个《别救我》的教程吧,也是TiledMap的~
      0回复
    • Bing 2016-03-24 11:39:35

      ValueMap playerPointDic = objGroup->objectNamed("PlayerPoint");
      0回复
  • 郑先生 2014-08-27 07:23:43

    Chapter7_4_RunRunRun04 书上的这个例子在VC下能通过,但移植不到ANDROID,
    0回复
  • 乐颜 2013-12-07 22:30:59

    实体不继承精灵,怎么用batchNode进行优化呢?
    0回复
    • 博主 糟糕_树叶的mut 2013-12-08 20:24:31

      我是在创建实体的时候传batchNode参数给它的~不过这样有些地方还要处理,有点小麻烦~
      0回复
  • pp 2013-06-13 16:33:15

    float playerX = playerPointDic->valueForKey("x")->floatValue();这一句不能用,会报错额~
    0回复
    • pp 2013-06-13 16:51:20

      居然能编译过去,就是还有那两红曲线,不只大神是否遇到过这种情况。。。。。
      0回复
      • 博主 糟糕_树叶的mut 2013-06-13 22:36:32

        红曲线?是啥?~
        0回复
    • 博主 糟糕_树叶的mut 2013-06-13 22:36:18

      报什么错呢?
      0回复
      • pp 2013-06-14 09:37:22

        错误信息有两个:Method 'floatValue' could not be resolvedInvalid arguments ' candidates are: const cocos2d:CCString* valueForKey(const ? &) const cocos2d:CCString* valueForKey(int) '但是每次关闭一下工程,然后再开一下工程,就能编过去,也能用。一旦修改个什么,又报错。。。。我用的是Eclipse,我猜可能是在Eclipse上跑C++有问题,少了某个东西
        0回复
        • 博主 糟糕_树叶的mut 2013-06-14 19:24:01

          那真应该是eclipse的问题了
          0回复
  • azymq 2012-12-17 11:40:00

    写的不错 学习了 很详细 适合我初学
    果断关注你
    0回复
  • musicvs 2012-12-17 12:38:00

    [reply]azymq[/reply]
    我果断被感动了~
    0回复
  • raaland 2012-12-21 17:15:00

    果断收藏了
    0回复
  • musicvs 2012-12-21 18:49:00

    [reply]raaland[/reply]
    我果断很开心~
    0回复
发表评论
粤ICP备16043700号

本博客基于 BlazorAnt Design Blazor 开发