您的位置:首页 > 移动开发 > Cocos引擎

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

2013-09-06 10:56 519 查看
1. 实体父类因为我觉得玩家和怪物会有一些共同的操作,所以我将玩家和怪物都定为一个实体,于是,我们需要一个实体类作为父类(实体文件夹下创建Entity.h和Entity.cpp文件):
01
//Entity.h文件
02
03
#ifndef   __ENTITY_H__
04
#define   __ENTITY_H__
05
06
#include   "cocos2d.h"
07
08
using
namespace
cocos2d;
09
10
class
Entity   :
public
CCNode   {
11
public
:
12
void
setSprite(CCSprite*   mSprite);
13
14
protected
:
15
CCSprite*   mSprite;
16
};
17
18
#endif</pre>
19
<pre
class
=
"cpp"
>
//Entity.cpp文件
20
21
#include   "Entity.h"
22
23
void
Entity::setSprite(   CCSprite* mSprite )
24
{
25
this
->mSprite   = mSprite;
26
}
实体类很简单,目前只有一个setSprite方法。 2. 创建玩家现在我们需要一个Player类,虽然玩家表面上看是一个精灵,但是我们不直接让它继承精灵类,我们用组合的方式来做,精灵类只是玩家的一个属性。我们让玩家继承实体类(在实体文件夹下创建Player.h和Player.cpp):
01
//Player.h文件
02
03
#ifndef   __PLAYER_H__
04
#define   __PLAYER_H__
05
06
#include   "Entity.h"
07
08
class
Player   :
public
Entity   {
09
public
:
10
CREATE_FUNC(Player);
11
virtual
bool
init();
12
};
13
14
#endif
1
//Player.cpp文件
2
3
#include   "Player.h"
4
5
bool
Player::init()
6
{
7
return
true
;
8
}
OK,玩家有了,我们把它加到地图里吧~打开我们的TollgateScene.cpp文件,修改init方法,加入如下代码:
01
/*   -------------- 加载玩家 --------------- */
02
CCSize   visibleSize = CCDirector::sharedDirector()->getVisibleSize();
03
CCSprite*   playerSprite = CCSprite::create(
"sprite/player1.png"
);
04
playerSprite->setPosition(ccp(100,   visibleSize.height / 2));
05
06
/*   精灵添加到地图 */
07
map->addChild(playerSprite);
08
09
/*   将精灵绑定到玩家对象上 */
10
Player*   mPlayer = Player::create();
11
mPlayer->setSprite(playerSprite);
OK,编译运行,我们将看到我们的主角(话说这个主角是不是太丑了= =,我找不到又帅又在跑的资源)。

3. 固定玩家出生点(对象层的使用)现在主角的坐标是在代码里写死的,我们还可以更灵活一点,Tiled Map还有一个很厉害的功能,那就是:对象层。其实没有多神奇,就是在地图上的某个位置设置一个对象,然后可以在代码里获取这个对象的信息,比如坐标,对了,就是要坐标~来,打开我们的地图编辑器,点击菜单栏的图层,添加对象层,新建一个对象层:

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

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

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

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

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

OK,我们现在只要在代码里取得PlayerPoint对象,再获得它的x、y属性就可以了。继续打开TollgateScene.cpp文件,修改init函数,在设置玩家精灵坐标的前面,添加以下代码:
01
/*   加载对象层 */
02
CCTMXObjectGroup*   objGroup = map->objectGroupNamed(
"objects"
);
03
04
/*   加载玩家坐标对象 */
05
CCDictionary*   playerPointDic = objGroup->objectNamed(
"PlayerPoint"
);
06
float
playerX   = playerPointDic->valueForKey(
"x"
)->floatValue();
07
float
playerY   = playerPointDic->valueForKey(
"y"
)->floatValue();
08
09
/*   -------------- 加载玩家 --------------- */
10
CCSize   visibleSize = CCDirector::sharedDirector()->getVisibleSize();
11
CCSprite*   playerSprite = CCSprite::create(
"sprite/player1.png"
);
12
playerSprite->setPosition(ccp(playerX,   playerY));
简单解释一下。CTMXObjectGroup存放了我们对象层的所有对象,map->objectGroupNamed(“objects”)就是取得了我们刚刚创建的obejects对象层里的所有对象,当然,目前只有一个PlayerPoint对象。怎么取得PlayerPoint对象呢,通过objectNamed函数来获得,获得之后返回的是一个CCDictionary对象,CCDictionary是什么东西?不知道大家用过Java没有?和Java的HashMap是差不多的概念,就是一个key值对应一个value值,然后可以存放很多对这样的key、value。于是,我们从playerPointDic里取得PlayerPoint对象的x、y坐标值,然后给玩家精灵设置坐标就好了。来,编译运行,我们的主角就出现在我们需要的位置了~!
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐