如何将精灵转换为coco2dx中的另一个精灵后恢复原始图像?

时间:2015-07-09 16:38:02

标签: c++ ios cocos2d-x

在我的游戏环境中,精灵是一个微笑的宝贝,当宝宝被触摸时,当前的精灵图像变为哭闹的宝宝,然后经过3秒的哭声声音效果结束后,精灵将恢复到微笑的宝宝图像。

我的问题是

  1. 如何换回上一张图片?
  2. 我把微笑的婴儿变成了哭泣的婴儿,但我不知道怎么能把它换成原来的微笑?

    1. 如何确保一次点击一次? 每次触摸婴儿精灵时,音频都将开始播放,这是不理想的,因为我希望事件功能仅在前一个事件过程结束后调用。
    2. 这是我的代码,非常感谢你!

      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;
      

      }

1 个答案:

答案 0 :(得分:2)

如果宝宝哭闹,你想要保持状态。最好的办法是将此逻辑保留在自定义的Node子类中。

以下是一些(几乎是伪)代码可以帮助您入门:

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

使用以下命令在父级中添加Baby节点而不是精灵:

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

其中_baby是一个实例变量,并使用isInside()方法测试触摸事件是否在精灵的范围内并调用其touched()方法:

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

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