【发布时间】:2015-12-10 00:26:59
【问题描述】:
我有一个“舞台选择”场景和一个“游戏”场景。但是,当用户按下按钮开始游戏场景时,在按下按钮和显示场景之间会有延迟(在旧设备上大约需要 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);
}
这样的结果是加载场景显示一个简单的角色运行动画精灵。起初我尝试在回调前延迟 1.0 秒来检查精灵是否正常工作(确实如此,角色运行)。但是在执行回调(加载新场景的回调)时它会停止移动,并保持这种状态大约 1-2 秒,直到场景加载并呈现出来。..
有谁知道如何在场景加载时保持精灵动画,以便在显示“游戏”场景之前它永远不会停止运行?
编辑:
我正在使用 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:
我的游戏场景加载时间过长的原因是因为我正在加载我的舞台所需的所有精灵图,如下所示:
// 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);
}
【问题讨论】:
标签: c++ cocos2d-x cocos2d-x-3.0