¿Cómo restauro el sprite en la image original después de cambiarlo por otro en coco2dx?

En mi context de juego, el sprite es un bebé sonriente, cuando se toca al bebé, la image del sprite actual cambia a un bebé que llora, y luego de 3 segundos de efecto de sonido que llora, el sprite restaurará la image del bebé sonriente.

Mi problema es

  1. ¿Cómo volver a intercambiar con la image anterior?

He cambiado el bebé sonriente por uno lloroso, pero no tengo idea de cómo podría cambiarlo con el sonriente original.

  1. ¿Cómo garantizar un clic al mismo time? Cada vez que se toca el bebé sprite, el audio comenzará a sonar, lo que no es ideal, porque espero que la function de evento solo se llame después de que finalice el process de evento anterior.

aquí está mi código, ¡y muchas gracias!

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::shanetworkingTextureCache()->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; 

}

Lo que quiere es mantenerse al tanto si el bebé está llorando o no. Lo mejor que se puede hacer es mantener esta lógica en una subclass Node personalizada.

Aquí hay un código (casi pseudo) para comenzar:

Baby.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(); }; 

Baby.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); } 

Agregue el nodo Baby en el padre en lugar del sprite, usando:

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

Donde _baby es una variable de instancia y usa el método isInside() para probar si un evento táctil está dentro de los límites del sprite y llamar a su método touched() :

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

y el object Baby ignorará el toque según el estado.