मेरे पास "चरण चयन" दृश्य और एक "गेम" दृश्य है। हालांकि जब उपयोगकर्ता गेम दृश्य शुरू करने के लिए बटन दबाता है तो दबाने और दृश्य के बीच एक देरी होती है (पुराने उपकरणों पर लगभग 2 सेकंड या उससे अधिक)। तो मैंने सोचा कि मुझे लोडिंग दृश्य बनाना चाहिए।cocos2d-x में स्प्राइट एनिमेट करते समय आप एक दृश्य कैसे लोड करते हैं?
तो अभी मैं क्या कर रहा हूँ एक std :: समारोह जो 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-एक्स 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);
}
मुझे लगता है कि यह सबसे अच्छा तरीका है, अन्य प्रकार के उत्तर क्या कहते हैं लेकिन उदाहरण कोड के लिए धन्यवाद समझने में आसान है। मुझे लगता है कि मैं प्रत्येक दृश्य स्थिर प्रति दृश्य प्रकार में स्प्राइट शीट की आवश्यकता के बारे में जानकारी बना सकता हूं और इसके आधार पर सभी आवश्यक रूप से लोड कर सकता हूं। फिर मैं अपने अधिकांश दृश्यों के लिए इसका उपयोग कर सकता हूं। धन्यवाद। (मुझे नहीं पता था कि मैं बनावट लोड कर सकता हूं और उसके बाद इसे स्प्राइटफ्रेम कैश के साथ जोड़ सकता हूं। मैंने सोचा था कि 'addSpriteFramesWithFile' स्क्रैच से सबकुछ फिर से बनाएगा, इसलिए मैंने नहीं सोचा था कि मैं addImageAsync विधि का उपयोग कर सकता हूं। – Pochi