У меня есть сцена "сценический выбор" и сцена "игра". Однако, когда пользователь нажимает кнопку для запуска игровой сцены, происходит задержка между нажатием и сценой (около 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 секунд, пока сцена не загрузится, а затем его будет представлена.
Кто-нибудь знает, как сохранить анимацию спрайта во время загрузки сцены, чтобы она не переставала работать до тех пор, пока не будет показана сцена "игра"?
Edit:
Я использую 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);
}