在我的游戏环境中, Sprite 是一个微笑的婴儿,当婴儿被触摸时,当前的 Sprite 图像变为哭泣的婴儿,然后在 3 秒的哭声效果结束后, Sprite 将恢复为微笑的婴儿图像.
我的问题是
- 如何换回之前的图片?
我已经把微笑的宝宝换成哭泣的宝宝了,但是我不知道怎么把它和原来的微笑的宝宝换掉?
- 如何确保一次点击? 每次小 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/