Пример #1
0
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;
}
Пример #2
0
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;
}