Пример #1
0
UMPTile* UMPFile::getTileForMap (const std::string& map)
{
    if (map.find(getBase()) == std::string::npos)
        return (UMPTile*) 0;
    const std::string tileName = getTileName(map);
    for (UMPTileIterator i = _umpTiles.begin(); i != _umpTiles.end(); ++i) {
        UMPTile& tile = *i;
        if (tile.getTileName(getBase()) == tileName)
            return &tile;
    }
    return (UMPTile*) 0;
}
Пример #2
0
//--------------------------------------------------------------
void ofApp::update(){
	//clear and update the renderer
	spriteRenderer->clear();
	spriteRenderer->update(ofGetElapsedTimeMillis());
	
	//add the Link sprite to the renderer.
	spriteRenderer->addCenteredTile(&player->animation, player->pos.x - cameraCenter.x, player->pos.y - cameraCenter.y, 1, F_NONE, SCALE);
	
	//if there are backgrounds, loop through it and add each one to the renderer.
	if (backgrounds.size() > 0) {
		for (int i = backgrounds.size()-1; i>=0; i--) {
			//this line isn't necessary and in fact is imperfect, but uncomment to see how we might limit drawing to only the current screen area.
			//if (backgrounds[i]->pos.x > 0 && backgrounds[i]->pos.x < ofGetWindowWidth() && backgrounds[i]->pos.y > 0 && backgrounds[i]->pos.y < ofGetWindowHeight()) {
			spriteRenderer->addCenteredTile(backgrounds[i]->tileName, 0, backgrounds[i]->pos.x, backgrounds[i]->pos.y, 0, 1, 1, F_NONE, SCALE);
			//}
		}
	}
	
	//update the background position based on the grid and the camera position.
	for (int i = 0; i < GRIDH; i++) {
		for (int j = 0; j < GRIDW; j++) {
			backgrounds[i * GRIDW + j]->pos.set(j*spriteRenderer->getTileSize()*SCALE - cameraCenter.x, i*spriteRenderer->getTileSize()*SCALE - cameraCenter.y);
		}
	}
	
	//update the player's position and animation index based on key presses.
	int runModifier = runPressed ? 2 : 1;
	
	ofPoint newPos = player->pos;
	
	if (leftPressed) {
		newPos.x -= player->speed * runModifier * spriteRenderer->getTileSize()*SCALE;
		player->animation.index = 4;
	}
	if (rightPressed) {
		newPos.x += player->speed * runModifier * spriteRenderer->getTileSize()*SCALE;
		player->animation.index = 2;
	}
	if (upPressed) {
		newPos.y -= player->speed * runModifier * spriteRenderer->getTileSize()*SCALE;
		player->animation.index = 0;
	}
	if (downPressed) {
		newPos.y += player->speed * runModifier * spriteRenderer->getTileSize()*SCALE;
		player->animation.index = 6;
	}
	
	//if no keys are being pressed, stop animating.
	//if keys are being pressed, animate Link's sprite.
	if (!leftPressed && !rightPressed && !upPressed && !downPressed) {
		player->animation.loops = 0;
	} else {
		player->animation.loops = -1;
		
		//this is an application of how we could check the player's position against the tiles.
		//we could use this approach to do collision detection for example.
		
		float xAdj = player->pos.x > newPos.x
			? (spriteRenderer->getTileSize() * SCALE) / 2
			: (spriteRenderer->getTileSize() * SCALE) / 2;
		float yAdj = player->pos.y > newPos.y
			? (spriteRenderer->getTileSize() * SCALE) / 2
			: (spriteRenderer->getTileSize() * SCALE) / 2;

		int tilePosX = floor((newPos.x + (spriteRenderer->getTileSize() * SCALE) / 2) / (spriteRenderer->getTileSize() * SCALE));
		int tilePosY = floor((newPos.y + (spriteRenderer->getTileSize() * SCALE) / 2) / (spriteRenderer->getTileSize() * SCALE));

		
		
		basicSprite* tile = getTile(tilePosX, tilePosY);
		if (tile != NULL) {
			if (!tile->isWall) {
				player->pos = newPos;
				wallBreaktimer = 0;
			} else {
				wallBreaktimer++;
				if (wallBreaktimer > wallBreaktimerDuration) {
					wallBreaktimer = 0;
					tile->isWall = false;
					tile->tileName = (int)ofRandom(8,11);
				}
			}
		} else {
			player->pos = newPos;
			wallBreaktimer = 0;
		}
		
		
		cout << "pos.x relative to tiles: " <<  tilePosX << ", pos.y relative to tiles: " <<  tilePosY << endl;
		
		cout << "background sprite index: " << getTileName(tilePosX, tilePosY) << endl;
	}
	
	//update the camera position to focus on the player's position.
	cameraCenter.x = player->pos.x - ofGetWindowWidth()/2;
	cameraCenter.y = player->pos.y - ofGetWindowHeight()/2;
}