[Cocos2Dx-一个都不能死]3.添加游戏人物对象

当给游戏页面添加了边界框后,下一步就是在边框内添加游戏角色!其中包括游戏人物对象,是一个动画,其中需要使用到flash,另外一个就是游戏的滑块对象,其中滑块对象是自动运动的,下面我们先添加人物对象!

新建一个Hero.h头文件继承自Sprite精灵类,并新建一个Hero类,里面创建一个人物对象,并声明初始化方法
<pre>class Hero :public Sprite
{
private:
public:
virtual bool init();
CREATE_FUNC(Hero);
};</pre>

因为人物是有动画的,所以需要借助Flash来生成两个文件,动作描述的json文件和图片文件

Paste_Image.png
Hero.png

<pre>{"frames": {

"hero0000":
{
"frame": {"x":0,"y":0,"w":44,"h":52},
"rotated": false,
"trimmed": false,
"spriteSourceSize": {"x":0,"y":0,"w":44,"h":52},
"sourceSize": {"w":44,"h":52}
},
"hero0001":
{
"frame": {"x":44,"y":0,"w":42,"h":52},
"rotated": false,
"trimmed": true,
"spriteSourceSize": {"x":2,"y":0,"w":44,"h":52},
"sourceSize": {"w":44,"h":52}
},
"hero0002":
{
"frame": {"x":86,"y":0,"w":42,"h":52},
"rotated": false,
"trimmed": true,
"spriteSourceSize": {"x":2,"y":0,"w":44,"h":52},
"sourceSize": {"w":44,"h":52}
},
"hero0003":
{
"frame": {"x":0,"y":52,"w":42,"h":52},
"rotated": false,
"trimmed": true,
"spriteSourceSize": {"x":2,"y":0,"w":44,"h":52},
"sourceSize": {"w":44,"h":52}
},
"hero0004":
{
"frame": {"x":42,"y":52,"w":42,"h":52},
"rotated": false,
"trimmed": true,
"spriteSourceSize": {"x":2,"y":0,"w":44,"h":52},
"sourceSize": {"w":44,"h":52}
}},
"meta": {
"app": "Adobe Flash Professional",
"version": "13.1.0.226",
"image": "Hero.png",
"format": "RGBA8888",
"size": {"w":128,"h":128},
"scale": "1"
}
}
</pre>
我们需要写一个解析Json数据的工具类,代码如下:
<pre>
Animate * FlashTool::readJsonSpriteSheet(std::string jsonFile,float delayPerUnit){

rapidjson::Document doc;
std::string fileContent = FileUtils::getInstance()->getStringFromFile(jsonFile);
fileContent.erase(0,fileContent.find_first_of('{'));

doc.Parse<0>(fileContent.c_str());

std::string imgFileName = doc["meta"]["image"].GetString();

auto &frames = doc["frames"];
auto sfc = SpriteFrameCache::getInstance();

Vector<AnimationFrame*> animFrames;
for (auto m=frames.MemberBegin(); m!=frames.MemberEnd(); m++) {
    auto frameName = m->name.GetString();
    auto & frameProperties = m->value["frame"];
    auto & spriteSourceSize = m->value["spriteSourceSize"];
    
    auto sf = sfc->getSpriteFrameByName(frameName);
    if (!sf) {
        sf = SpriteFrame::create(imgFileName, Rect(frameProperties["x"].GetInt(), frameProperties["y"].GetInt(), frameProperties["w"].GetInt(), frameProperties["h"].GetInt()), m->value["rotated"].GetBool(), Vec2(spriteSourceSize["x"].GetInt(), spriteSourceSize["y"].GetInt()), Size(spriteSourceSize["w"].GetInt(), spriteSourceSize["h"].GetInt()));
        sfc->addSpriteFrame(sf, frameName);
    }
    animFrames.pushBack(AnimationFrame::create(sf, delayPerUnit, ValueMapNull));
}

Animation * animation = Animation::create(animFrames,delayPerUnit);
return Animate::create(animation);

}
</pre>
如何应用呢?

之后,我们在Hero.cpp里面来实现人物对象的初始化
<pre>bool Hero::init() {
Sprite::init();
Size herobox = Size(44, 52);//设置任务的宽高

//限制宽高
setContentSize(herobox);
setPhysicsBody(PhysicsBody::createBox(herobox));

//设置锚点
setAnchorPoint(Point(0, 0));
getPhysicsBody()->setRotationEnable(false);

//添加碰撞检测
getPhysicsBody()->setContactTestBitmask(1);

action = RepeatForever::create(FlashTool::readJsonSpriteSheet(“Hero.png”, 0.2f));
runAction(action);
return true;

}</pre>

最后我们把Hero对象放入Scene里面
<pre>hero = Hero::create();
hero->setPosition(30, positionY);
addChild(hero);
</pre>
这样,我们就实现了一个人物的动画效果!

项目git地址:https://github.com/marco115/NoOneDies.git
对文章有什么优化改进的地方,请留言!谢谢大家

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 199,902评论 5 468
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 84,037评论 2 377
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 146,978评论 0 332
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 53,867评论 1 272
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 62,763评论 5 360
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,104评论 1 277
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,565评论 3 390
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,236评论 0 254
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,379评论 1 294
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,313评论 2 317
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,363评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,034评论 3 315
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,637评论 3 303
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,719评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 30,952评论 1 255
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 42,371评论 2 346
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 41,948评论 2 341

推荐阅读更多精彩内容