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

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

作者: MarcoHorse | 来源:发表于2017-04-19 17:06 被阅读71次

    当给游戏页面添加了边界框后,下一步就是在边框内添加游戏角色!其中包括游戏人物对象,是一个动画,其中需要使用到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
    对文章有什么优化改进的地方,请留言!谢谢大家

    相关文章

      网友评论

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

          本文链接:https://www.haomeiwen.com/subject/vupeettx.html