Tôi có cảnh "chọn giai đoạn" và cảnh "trò chơi". Tuy nhiên khi người dùng nhấn nút để bắt đầu cảnh trò chơi, có sự chậm trễ giữa cảnh báo và cảnh hiển thị (khoảng 2 giây trở lên trên các thiết bị cũ). Vì vậy, những gì tôi nghĩ là tôi nên tạo ra một cảnh tải.Làm thế nào để bạn tải một cảnh trong khi hoạt hình một sprite trong cocos2d-x?
Vì vậy, những gì tôi đang làm ngay bây giờ là đi qua để "tải" tôi cảnh một std :: chức năng mà được gọi là 0,1 giây sau khi cảnh bốc xuất hiện. Chức năng này có mã để bắt đầu cảnh "trò chơi" như sau:
Để tạo cảnh tải.
auto loading_scene = LoadingScene::createLoadingScene([stage_course]() {
Director::getInstance()->replaceScene(Game::createScene(stage_course->course_id));
});
Director::getInstance()->replaceScene(loading_scene);
Để tải cảnh trò chơi.
void LoadingScene::onEnter()
{
Node::onEnter();
call_after(0.1, callback_start);
}
Kết quả là cảnh tải hiển thị bằng hình động đơn giản của ký tự đang chạy. Lúc đầu, tôi đã thử với một sự chậm trễ là 1,0 giây trước khi gọi lại để kiểm tra xem sprite có đang hoạt động đúng không (nó hoạt động, ký tự chạy). Nhưng nó dừng di chuyển khi gọi lại được thực hiện (một trong đó tải các cảnh mới) và vẫn như thế này trong khoảng 1-2 giây cho đến khi cảnh đã tải và sau đó được trình bày ..
Có ai biết làm thế nào để giữ sprite hoạt hình trong khi cảnh đang tải để nó không bao giờ ngừng chạy cho đến khi cảnh "game" được hiển thị?
Edit:
Tôi đang sử dụng cocos2d-x-3.8.
cảnh tải của tôi có đoạn mã sau trong hàm init của nó để tạo ra một hình ảnh động được sử dụng để animate một chóp:
// 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));
Chỉnh sửa 2:
Lý do tại sao trò chơi của tôi cảnh mất quá nhiều thời gian để tải là bởi vì tôi đang tải tất cả các spritemaps sân khấu của tôi cần như thế này:
// 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);
}
Tôi đoán đây là cách tiếp cận tốt nhất, đó là những gì các câu trả lời khác nói nhưng dễ hiểu hơn nhờ mã ví dụ. Tôi đoán tôi có thể làm cho các thông tin về những gì sprite tờ là cần thiết trong mỗi cảnh tĩnh cho mỗi loại cảnh và đệ quy tải tất cả cần thiết dựa trên nó. Sau đó, tôi có thể sử dụng điều này cho hầu hết các cảnh của tôi. cảm ơn. (Tôi không biết tôi có thể tải các kết cấu và sau đó liên kết nó với bộ nhớ cache spriteframe như thế này.Tôi nghĩ rằng 'addSpriteFramesWithFile' sẽ tạo lại tất cả mọi thứ từ đầu vì vậy tôi đã không nghĩ rằng tôi có thể sử dụng phương pháp addImageAsync. – Pochi