Manager::Manager() : env( SDL_putenv(const_cast<char*>("SDL_VIDEO_CENTERED=center")) ), jgdata( JSONGamedata::getInstance() ), io( IOManager::getInstance() ), clock( Clock::getInstance() ), screen( io.getScreen() ), worlds(), viewport( Viewport::getInstance() ), explosions(), sprites(), player(jgdata.getStr("player.name")), currentSprite(0), TICK_INTERVAL(jgdata.getInt("fpsController.tickInterval")), nextTime(clock.getTicks()+TICK_INTERVAL) { clock.pause(); if (SDL_Init(SDL_INIT_VIDEO) != 0) { throw string("Unable to initialize SDL: "); } atexit(SDL_Quit); JSONValue* backs = jgdata.getValue("backgrounds"); unsigned int numbacks = backs->CountChildren(); std::cout << "Loading " << numbacks << " backgrounds" << std::endl; for(unsigned i = 0; i < numbacks; i++){ std::string name = backs->Child(i)->Child("name")->AsString(); int fact = 1; if (backs->Child(i)->HasChild("fact")) fact = backs->Child(i)->Child("fact")->AsNumber(); worlds.push_back( World(FrameFactory::getInstance().getFrame(name), fact) ); } unsigned int n = jgdata.getInt("triForce.num"); float smin = jgdata.getFloat("triForce.scale.min"); float smax = jgdata.getFloat("triForce.scale.max"); sprites.reserve(n+2); for(unsigned i = 0; i < n; i++){ sprites.push_back(new Sprite("triForce",smin,smax)); } explosions.push_back(new TwowayMultiframeSprite("Etank")); sort(sprites.begin(), sprites.end()); viewport.setObjectToTrack(player.getSprite()); }
void addChildFromJSON( JSONValue* jv, UIComponent* curParent, bool isFloating = false ) { int i; int j; int curIcon = 0; JSONValue* curTempl = NULL; if ( jv->HasChild("template") ) { if ( jvTemplates->HasChild(jv->Child("template")->string_value) ) { curTempl = jvTemplates->Child(jv->Child("template")->string_value); } else { cout << "invalid template \n";// << jv->Child("template")->string_value << "\n"; } } for (i = 0; i < E_GST_LENGTH; i++) { guiStringValues[i] = ""; } for (i = 0; i < E_GFT_LENGTH; i++) { guiFloatValues[i] = 0.0f; } guiFloatValues[E_GFT_HASBACKGROUND] = 1.0; guiFloatValues[E_GFT_SINGLELINE] = 1.0; guiStringValues[E_GST_SS] = "defaultSS"; for (j = 0; j < 2; j++) { if (curTempl != NULL) { for (i = 0; i < E_GST_LENGTH; i++) { if ( curTempl->HasChild(guiStringTypes[i]) ) { guiStringValues[i] = curTempl->Child(guiStringTypes[i])->string_value; } } for (i = 0; i < E_GFT_LENGTH; i++) { if ( curTempl->HasChild(guiFloatTypes[i]) ) { guiFloatValues[i] = curTempl->Child(guiFloatTypes[i])->number_value; } } } curTempl = jv; } guiFloatValues[E_GFT_LAYER] = max(guiFloatValues[E_GFT_LAYER],(float)(curParent->layer)); UIComponent* newParent = curParent->addChild( curParent->nodeId, nodeCount, guiStringValues, guiFloatValues, isFloating, jv ); nodeCount++; int numChildren = 0; int numFloatingChildren = 0; int numDataChildren = 0; int numFilters = 0; JSONValue* jvChildren = NULL; JSONValue* jvFloatingChildren = NULL; JSONValue* jvChildTemplate = NULL; JSONValue* jvFilter = NULL; JSONValue* curFilter = NULL; JSONValue* jvData = NULL; JSONValue* jvDataRoot = NULL; JSONValue* curData = NULL; if (jv->HasChild("children")) { jvChildren = jv->Child("children"); numChildren = jvChildren->CountChildren(); } for (i = 0; i < numChildren; i++) { addChildFromJSON(jvChildren->Child(i),newParent, false); } if (jv->HasChild("floatingChildren")) { jvFloatingChildren = jv->Child("floatingChildren"); numFloatingChildren = jvFloatingChildren->CountChildren(); } for (i = 0; i < numFloatingChildren; i++) { addChildFromJSON(jvFloatingChildren->Child(i),newParent,true); } bool doProc = false; bool isInternal = false; int totCount = 0; E_GUI_CHILD_TYPES curCT = E_GCT_LENGTH;; if (jv->HasChild("childType")) { tempStrings[E_GDS_CHILD_TYPE] = jv->Child("childType")->string_value; if (jv->HasChild("isInternal")) { if (jv->Child("isInternal")->number_value != 0 ) { // use an internally generated JSON node isInternal = true; } else { // todo: load JSON file } } if (jv->HasChild("whereAllEqual")) { jvFilter = jv->Child("whereAllEqual"); numFilters = jvFilter->CountChildren(); } else { jvFilter = NULL; numFilters = 0; } if (jv->HasChild("dataSource")) { tempStrings[E_GDS_DATA_SOURCE] = jv->Child("dataSource")->string_value; if (isInternal) { if (jv->HasChild("dataFile")) { tempStrings[E_GDS_DATA_FILE] = jv->Child("dataFile")->string_value; jvDataRoot = (singleton->internalJSON[tempStrings[E_GDS_DATA_FILE]]).jv; } } else { jvDataRoot = jvRoot; } if (jvDataRoot != NULL) { getJVNodeByString(jvDataRoot, &jvData, tempStrings[E_GDS_DATA_SOURCE]); numDataChildren = jvData->CountChildren(); if (jv->HasChild("childTemplate")) { jvChildTemplate = jv->Child("childTemplate"); } } } if ((jvData != NULL)&&(jvChildTemplate != NULL)) { if (compChildStr("inventoryItem")) { curCT = E_GCT_INV_ITEM; } if (compChildStr("shaderParams")) { curCT = E_GCT_SHADER_PARAM; } ////////////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////////////// for (i = 0; i < numDataChildren; i++) { curData = jvData->Child(i); doProc = true; if (jvFilter != NULL) { for (j = 0; j < numFilters; j++) { curFilter = jvFilter->Child(j); if ( curData->Child(curFilter->Child(0)->string_value)->IsNumber() ) { if ( curData->Child(curFilter->Child(0)->string_value)->number_value != curFilter->Child(1)->number_value ) { doProc = false; } } else { // todo: string support } } } if (doProc) { switch (curCT) { case E_GCT_INV_ITEM: tempStrings[E_GDS_CHILD_NAME] = curData->Child("name")->string_value; curIcon = jvRoot-> Child("itemDefs")-> Child(tempStrings[E_GDS_CHILD_NAME])-> Child("iconNum")-> number_value; jvChildTemplate-> Child("floatingChildren")-> Child(0)-> Child("children")-> Child(0)-> Child("label")-> string_value = jvRoot-> Child("itemDefs")-> Child(tempStrings[E_GDS_CHILD_NAME])-> Child("class")-> string_value; tempStrings[E_GDS_MATERIAL] = curData->Child("mat")->string_value; if (tempStrings[E_GDS_MATERIAL].compare("none") == 0) { tempStrings[E_GDS_MATERIAL] = ""; } jvChildTemplate->Child("label")->string_value = i__s(curIcon) + "& " + tempStrings[E_GDS_MATERIAL] + " " + tempStrings[E_GDS_CHILD_NAME]; break; case E_GCT_SHADER_PARAM: jvChildTemplate->Child("label")->string_value = curData->Child("shaderName")->string_value + "." + curData->Child("paramName")->string_value; jvChildTemplate->Child("uid")->string_value = curData->Child("uid")->string_value; jvChildTemplate->Child("callbackData")->Child("shaderName")->string_value = curData->Child("shaderName")->string_value; jvChildTemplate->Child("callbackData")->Child("paramName")->string_value = curData->Child("paramName")->string_value; break; case E_GCT_LENGTH: break; } // copy template to new child jv->Child("children")->array_value.push_back( JSON::Parse(jvChildTemplate->Stringify().c_str()) ); //PROBLEM addChildFromJSON(jv->Child("children")->Child(totCount),newParent,false); //jvChildTemplate //jv->Child("children")->Child(i) totCount++; } } } } }