gpt4 book ai didi

c++ - 在 cocos2d-x 中动画 Sprite 时如何加载场景?

转载 作者:IT老高 更新时间:2023-10-28 23:01:51 25 4
gpt4 key购买 nike

我有一个“舞台选择”场景和一个“游戏”场景。但是,当用户按下按钮开始游戏场景时,在按下按钮和显示场景之间会有延迟(在旧设备上大约需要 2 秒或更长时间)。所以我想我应该创建一个加载场景。

所以我现在正在做的是向我的“加载”场景传递一个 std::function,它在加载场景出现后 0.1 秒被调用。这个函数有这样的代码来启动“游戏”场景:

用于创建加载场景。

auto loading_scene = LoadingScene::createLoadingScene([stage_course]() {

Director::getInstance()->replaceScene(Game::createScene(stage_course->course_id));

});

Director::getInstance()->replaceScene(loading_scene);

加载游戏场景。

void LoadingScene::onEnter()
{
Node::onEnter();

call_after(0.1, callback_start);
}

这样做的结果是加载场景显示一个简单的角色运行动画 Sprite 。起初我尝试在回调之前延迟 1.0 秒以检查 Sprite 是否正常工作(确实如此,角色运行)。但是在执行回调(加载新场景的回调)时它会停止移动,并保持这种状态大约 1-2 秒,直到场景加载并呈现出来。..

有谁知道如何在场景加载时保持 Sprite 动画,以便在显示“游戏”场景之前它永远不会停止运行?


编辑:

我正在使用 cocos2d-x-3.8。

我的加载场景在其 init 函数中包含以下代码,用于创建用于动画尖顶的动画:

// Create the sprite animation
Animation *animation = Animation::create();
for (int i = 0; i < INT16_MAX; i++)
{
string frame_sprite_name = StringUtils::format("Interface/loading/0_%d.png",i);

auto frame = SpriteFrameCache::getInstance()->getSpriteFrameByName(frame_sprite_name);

if (frame) {
animation->addSpriteFrame(frame);
} else {
break;
}
}

animation->setDelayPerUnit(0.15f);


Animate *animate = Animate::create(animation);


// Create a temporal sprite to run the animation

auto temp_sprite = Sprite::create();

temp_sprite->setAnchorPoint(Vec2(0.5,0.5));
temp_sprite->setPosition(Vec2(DISPLAY_WIDTH/2.0f,DISPLAY_HEIGHT/2.0f));


this->addChild(temp_sprite);

temp_sprite->runAction(RepeatForever::create(animate));

编辑 2:

我的游戏场景加载时间过长的原因是因为我正在加载我的舞台所需的所有 Sprite 图,如下所示:

// Shared

if (!SpriteFrameCache::getInstance()->isSpriteFramesWithFileLoaded(STUDENTS_SPRITE_MAP)) {
SpriteFrameCache::getInstance()->addSpriteFramesWithFile(STUDENTS_SPRITE_MAP);
}

if (!SpriteFrameCache::getInstance()->isSpriteFramesWithFileLoaded(OTHERS_SPRITE_MAP)) {
SpriteFrameCache::getInstance()->addSpriteFramesWithFile(OTHERS_SPRITE_MAP);
}

if (!SpriteFrameCache::getInstance()->isSpriteFramesWithFileLoaded(INTERFACE_SPRITE_MAP)) {
SpriteFrameCache::getInstance()->addSpriteFramesWithFile(INTERFACE_SPRITE_MAP);
}

if (!SpriteFrameCache::getInstance()->isSpriteFramesWithFileLoaded(ZOMBIES_SPRITE_MAP)) {
SpriteFrameCache::getInstance()->addSpriteFramesWithFile(ZOMBIES_SPRITE_MAP);
}

if (!SpriteFrameCache::getInstance()->isSpriteFramesWithFileLoaded(PORTRAITS_SPRITE_MAP)) {
SpriteFrameCache::getInstance()->addSpriteFramesWithFile(PORTRAITS_SPRITE_MAP);
}

if (!SpriteFrameCache::getInstance()->isSpriteFramesWithFileLoaded(CUTS_SPRITE_MAP)) {
SpriteFrameCache::getInstance()->addSpriteFramesWithFile(CUTS_SPRITE_MAP);
}

// Exclusive

if (!SpriteFrameCache::getInstance()->isSpriteFramesWithFileLoaded(TEACHERS_SPRITE_MAP)) {
SpriteFrameCache::getInstance()->addSpriteFramesWithFile(TEACHERS_SPRITE_MAP);
}

最佳答案

试试这个:

void HelloWorld::loadTextures1(){
Director::getInstance()->getTextureCache()->addImageAsync("sprites1.png", CC_CALLBACK_1(HelloWorld::loadTextures2, this));
}

void HelloWorld::loadTextures2(Texture2D* texture1){
this->texture1 = texture1;
CCLOG("Texture 1 loaded!");
Director::getInstance()->getTextureCache()->addImageAsync("sprites2.png", CC_CALLBACK_1(HelloWorld::loadTextures3, this));
}


void HelloWorld::loadTextures3(Texture2D* texture2){
this->texture2 = texture2;
CCLOG("Texture 2 loaded!");
Director::getInstance()->getTextureCache()->addImageAsync("sprites3.png", CC_CALLBACK_1(HelloWorld::allTexturesLoaded, this));
}

void HelloWorld::allTexturesLoaded(Texture2D* texture3){
this->texture3 = texture3;
CCLOG("Texture 3 loaded!");

auto cache = SpriteFrameCache::getInstance();

cache->addSpriteFramesWithFile("sprites1.plist", texture1);
cache->addSpriteFramesWithFile("sprites2.plist", texture2);
cache->addSpriteFramesWithFile("sprites3.plist", texture3);

auto scene = GameScene::createScene();
Director::getInstance()->replaceScene(TransitionShrinkGrow::create(.5, scene));
}

它异步加载这 3 个纹理,然后同步加载带有预加载纹理的 plist 文件。最后有一点卡住(同步部分),但我认为这还不错。您也可以深入挖掘 SpriteFrameCache 并尝试对其进行优化。

关于c++ - 在 cocos2d-x 中动画 Sprite 时如何加载场景?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32557414/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com