Room *RoomLoader::loadRoom(const std::string& filename) { TileMap* tileMap = loadTileMap(filename); std::cout << "Loading room " + filename + "..."; std::vector<std::string> data = tokenize(loadFile(filename), "\n", true); std::vector<std::string> tileSetInfo = tokenize(data[data.size()-1], " "); if (tileSetInfo.size() == 0) { throw DB_EXCEPTION("Tilset info is missing in file " + filename); } std::string tileSetFileName = "graphics/" + tileSetInfo[0]; int numTiles = fromString<int>(tileSetInfo[1]); Room* room = new Room(tileMap, new Animation(tileSetFileName, numTiles)); int width = 0; int height = 0; int row; int col; // Load entities int x = 0; int y = 0; for (row = 0; row < tileMap->getHeight(); row++) { for (col = 0; col < tileMap->getWidth(); col++) { char c = data[row].at(col); // Ignore solidities. if (c != '.' && c != '#') { Entity* entity = createEntity(c, x * TileMap::TILE_SIZE, y * TileMap::TILE_SIZE, Random::get()); room->addEntity(entity); } x++; } x = 0; y++; } std::cout << " Done!" << std::endl; return room; }
bool startGame(PlayState *playState, GameContext *gameContext, SDL_Renderer *renderer, GameMemory *gameMemory) { gameContext->cameraPosition = {-gameContext->scrollSpeed, 0}; if (playState->scrollingBackground) { freeMemory(&gameMemory->longTimeMemory, playState->scrollingBackground); playState->scrollingBackground = 0; } for (EntityNode **entityNode = &playState->entityList; *entityNode;) { EntityNode *freeEntity = *entityNode; // NOTE: must modify the pointer itself *entityNode = (*entityNode)->next; freeEntity->next = playState->freeEntities; playState->freeEntities = freeEntity; assert((*entityNode == 0) || (*entityNode != (*entityNode)->next)); } TileMap *tileMap = RESERVE_MEMORY(&gameMemory->shortTimeMemory, TileMap); *tileMap = {}; if (!loadTileMap(tileMap, "map1.tmx", gameContext, renderer, gameMemory, &playState->freeEntities)) { return false; } playState->tileMapWidth = tileMap->width * tileMap->tileWidth; playState->scrollingBackground = tileMap->scrollingBackground; playState->entityList = tileMap->entityList; playState->player = 0; for (EntityNode *entityNode = playState->entityList; entityNode; entityNode = entityNode->next) { if (entityNode->entity.type == PLAYER_TYPE) { playState->player = &entityNode->entity; break; } } if (!playState->player) { return false; } playState->liveTexture = getTexture("LIVES", gameContext); if (!playState->liveTexture) { return false; } playState->bullet1Texture = getTexture("BULLET1", gameContext); if (!playState->bullet1Texture) { return false; } playState->bullet2Texture = getTexture("BULLET2", gameContext); if (!playState->bullet2Texture) { return false; } playState->smallExplosionTexture = getTexture("SMALL_EXPLOSION", gameContext); if (!playState->smallExplosionTexture) { return false; } playState->explosionTexture = getTexture("EXPLOSION", gameContext); if (!playState->explosionTexture) { return false; } playState->largeExplosionTexture = getTexture("LARGE_EXPLOSION", gameContext); if (!playState->largeExplosionTexture) { return false; } playState->bossExplosionTexture = getTexture("BOSS_EXPLOSION", gameContext); if (!playState->bossExplosionTexture) { return false; } for (EntityNode *node = playState->entityList; node; node = node->next) { initEntity(&node->entity); } playState->currentLives = 3; return true; }