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; }
//-------------------------------------------------------------- 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; }