c++ - 在将它交换到 coco2dx 中的另一个之后,如何将 Sprite 恢复为原始图像?

标签 c++ ios cocos2d-x

在我的游戏环境中, Sprite 是一个微笑的婴儿,当婴儿被触摸时,当前的 Sprite 图像变为哭泣的婴儿,然后在 3 秒的哭声效果结束后, Sprite 将恢复为微笑的婴儿图像.

我的问题是

  1. 如何换回之前的图片?

我已经把微笑的宝宝换成哭泣的宝宝了,但是我不知道怎么把它和原来的微笑的宝宝换掉?

  1. 如何确保一次点击? 每次小 Sprite 被触摸时,音频都会开始播放,这是不理想的,因为我希望事件函数只在上一个事件处理完成后才被调用。

这是我的代码,非常感谢!

bool HelloWorld::init()
{
    // 1. super init first
if ( !Layer::init() )
{
    return false;
}

Size visibleSize = Director::getInstance()->getVisibleSize();
Vec2 origin = Director::getInstance()->getVisibleOrigin();

//add background scene
auto backgroundSprite = Sprite :: create("scene001.jpg");
backgroundSprite->setAnchorPoint(Vec2(0,0));
backgroundSprite->setScaleX((visibleSize.width / backgroundSprite->getContentSize().width) * 1);
backgroundSprite->setScaleY((visibleSize.height / backgroundSprite->getContentSize().height) * 1);
addChild(backgroundSprite);

//add smileBaby sprite
auto smileBabySprite = Sprite :: create("figure001.png");

smileBabySprite -> setPosition(Vec2(500,400));
addChild(smileBabySprite);

//add crying audio
auto audio = CocosDenshion::SimpleAudioEngine::getInstance();

auto babyListener = EventListenerTouchOneByOne::create();
babyListener -> onTouchBegan = [smileBabySprite, audio](Touch* touch, Event* event)
{
    //change smileBaby sprite to cryingBaby sprite
    smileBabySprite->setTexture(CCTextureCache::sharedTextureCache()->addImage("figure002.png"));
    audio -> playEffect("babycry.mp3",false,1.0f,1.0f,1.0f);

    return true;
};

babyListener -> onTouchEnded=[smileBabySprite](Touch* touch, Event* event )
{

};



_eventDispatcher -> addEventListenerWithSceneGraphPriority(babyListener, this);

return true;

最佳答案

您想要的是保持状态婴儿是否在哭。最好的办法是将此逻辑保留在自定义 Node 子类中。

这里有一些(几乎是伪的)代码可以帮助您入门:

宝宝.h:

#pragma once

#include "cocos2d.h"

class Baby : public cocos2d::Node
{
private:
    cocos2d::Sprite *_sprite;    // Weak reference
    bool _crying;
    float _cryingTime;

public:
    CREATE_FUNC(Baby);

protected:
    virtual bool init() override;
    virtual void update(float delta) override;

public:
    void touched();
    bool isInside(cocos2d::Touch *touch) const
protected:
    void setSprite();
};

宝宝.cpp:

#include "Baby.h"

USING_NS_CC;

bool Baby::init()
{
    if (!Node::init())
        return false;
    _crying = false;
    setSprite();
    scheduleUpdate();
    return true;
}

void Baby::update(float delta)
{
    Node::update(delta);
    if (_crying) {
        _cryingTime -= delta;
        if (_cryingTime <= 0.0f) {
            _crying = false;
            setSprite();
        }
    }
}

void Baby::touched()
{
    if (_crying)
        return;      // Already crying
    _crying = true;
    _cryingTime = 3.0f;    // Length of audio, I guess?
    setSprite();

    // Start crying sound here
}

bool Baby::isInside(Touch *touch) const
{
    Vec2 locationInNode = _sprite->convertToNodeSpace(touch->getLocation());
    Size size = _sprite->getContentSize();
    Rect rect = Rect(0.0f, 0.0f, size.width, size.height);
    return rect.containsPoint(locationInNode);
}

void Baby::setSprite()
{
    if (_sprite)
        _sprite->removeFromParent();

    _sprite = Sprite::initWithFile(_crying ? "baby_crying.png" : "baby.png");
    Vec2 size = getContentSize();
    _sprite->setPosition(size.width * 0.5f, size.height * 0.5f);
    addChild(_sprite);
}

您将 Baby 节点添加到父级而不是 Sprite 中,使用:

_baby = Baby::create();
_baby->setPosition(Wherever);
addChild(_baby);

其中 _baby 是一个实例变量,使用 isInside() 方法来测试触摸事件是否在 Sprite 的边界内,并调用它的 touched () 方法:

Touch *touch = ...;
if (_baby->isInside(touch)) {
    _baby->touched();
}

Baby 对象将根据状态忽略触摸。

关于c++ - 在将它交换到 coco2dx 中的另一个之后,如何将 Sprite 恢复为原始图像?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31323450/

相关文章:

c++ - 你能在 VS 2005 中创建一个 lib 或 dll 并与 VS 2008 链接吗

c++ - 使用 Boost 的邻居边缘

ios - Paytm 库 2.1 与 iOS 链接器集成错误?

javascript - 在 UIWebView 中暂停 Javascript 执行

c# - 在 Microsoft Visual Studio Community 2015 中使用 Cocos2d-x

c++ - 构造函数中的静态变量,有什么缺点或副作用吗?

c++ - Makefile 与 OpenMP : cannot specify -o with -c, -S 或 -E 与多个文件

c++ - 如果我在 init 之外定义,如何在 ccTouchEnded 中删除子项

ios - UILocalNotification 不会在 ios9 设备上触发(横幅未显示)

iphone - cocos2d-x如何将plist读入数组