void Senario::update(float time) { if(animatedStringList != NULL) { for (int i = 0; i < animatedStringList->count(); i++) { AnimatedString* as = (AnimatedString*) animatedStringList->objectAtIndex(i); as->update(time); } } if(animatedSpriteList != NULL) { for (int i = 0; i < animatedSpriteList->count(); i++) { AnimatedSprite* as = (AnimatedSprite*) animatedSpriteList->objectAtIndex(i); as->update(time); } } if(animatedDialogueList != NULL) { for (int i = 0; i < animatedDialogueList->count(); i++) { AnimatedDialogue* ad = (AnimatedDialogue*) animatedDialogueList->objectAtIndex(i); ad->update(time); } } }
void pacman::update(){ xpos += xvel; ypos += yvel; sprite.setPosition(sf::Vector2f(xpos, ypos)); anspr.setPosition(sf::Vector2f(xpos, ypos)); collision_box = anspr.getGlobalBounds(); anspr.update(frame_time.restart()); }
void update(sf::Time time) { MusicManager::instance().update(time); system.update(time); sm.update(); oTweener.step(time.asMilliseconds() / 1000.f); if ((int)(rand() % 90) == 3 && first) sm.setCurrentEffect("distortion", sf::seconds(0.05)); if ((int)(rand() % 100) == 3 && !first) sm.setCurrentEffect("inversion", sf::seconds(1)); if (first) { logo.setColor(sf::Color(255,255,255,interpolateLinear(logo.getColor().a, 255, 0.05f))); logo.setPosition(0, newLogoY); if (!pressFading) { press.setColor(sf::Color(255,255,255,interpolateLinear(press.getColor().a, 0,pressFactor))); if (press.getColor().a < 7) { pressFading = true; } } else { press.setColor(sf::Color(255,255,255,interpolateLinear(press.getColor().a, 255, pressFactor))); if (press.getColor().a > 243) { pressFading = false; } } sprite.update(time); if (transition && timer.getElapsedTime().asSeconds() > 0.5) { press.setColor(sf::Color(255,255,255,0)); } if (transition && timer.getElapsedTime().asSeconds() > 0.5) { transition = false; oTweener.addTween(&CDBTweener::TWEQ_BACK, CDBTweener::TWEA_INOUT, 2.f, &newLogoY, -800.0f); } if (!transition && logo.getPosition().y <= -800 && !check) { sm.setCurrentEffect("rgb", sf::seconds(1)); check = true; timer.restart();SoundManager::instance().playNoiseSound(); } if (check && timer.getElapsedTime().asSeconds() > 1) { first = false; MusicManager::instance().playMusicFast("battle"); pressFading = true; } } else { pressFactor = 0.2; if (!pressFading) { pointer.setColor(sf::Color(255,255,255,interpolateLinear(pointer.getColor().a, 0,pressFactor))); if (pointer.getColor().a < 7) { pressFading = true; } } else { pointer.setColor(sf::Color(255,255,255,interpolateLinear(pointer.getColor().a, 255, pressFactor))); if (pointer.getColor().a > 243) { pressFading = false; } } switch (selection) { case 0: pointer.setPosition(1183, 415); break; case 1: pointer.setPosition(1183, 531); break; case 2: pointer.setPosition(1183, 645); break; default: break; } } };
int main() { //Initalize Variables and Settings const sf::Vector2i screenDimensions(800, 600); FloatRect playerMoveSpace = sf::FloatRect(100, 100, screenDimensions.x - 100, screenDimensions.y - 320); RenderWindow window(VideoMode(screenDimensions.x, screenDimensions.y), "Donkey Island", Style::Titlebar | Style::Close); window.setFramerateLimit(60); CircleShape shape(100.f); shape.setFillColor(Color::Green); Texture MenuBGTex; Sprite MenuBackground; Texture PlayerTex; AnimatedSprite PlayerImage; sf::Time actionTimer; int loadedLevelIndex = 0; GameScene* levels[] = { new LakeGrass(), new flower(), new House() }; GameScene* loadedLevel = levels[loadedLevelIndex]; tinyxml2::XMLElement* levelElement = NULL; static bool dragging = false; sf::Vector2f Target1; Inventory::item *draggeditem = NULL; bool clicked = false; if (MenuBGTex.loadFromFile("resources/menubackground.jpg")) { MenuBackground.setTexture(MenuBGTex); MenuBackground.setPosition(0.0f, 460.0f); } // load a new inventory. The inventory is kept across scenes. Inventory* playerInventory = new Inventory(); // load a new quest journal. Each level, this variable is recreated with the right quests for that current level Quests* playerQuests = new Quests(loadedLevel); if (!PlayerTex.loadFromFile("resources/donkeyMovement.png")) { std::cout << "Failed to load player spritesheet!" << std::endl; return 1; } Animation walkingAnimationRight; walkingAnimationRight.setSpriteSheet(PlayerTex); walkingAnimationRight.addFrame(sf::IntRect(200, 0, 200, 200)); walkingAnimationRight.addFrame(sf::IntRect(400, 0, 200, 200)); walkingAnimationRight.addFrame(sf::IntRect(600, 0, 200, 200)); walkingAnimationRight.addFrame(sf::IntRect(0, 0, 200, 200)); Animation walkingAnimationLeft; walkingAnimationLeft.setSpriteSheet(PlayerTex); walkingAnimationLeft.addFrame(sf::IntRect(200, 200, 200, 200)); walkingAnimationLeft.addFrame(sf::IntRect(400, 200, 200, 200)); walkingAnimationLeft.addFrame(sf::IntRect(600, 200, 200, 200)); walkingAnimationLeft.addFrame(sf::IntRect(0, 200, 200, 200)); Animation walkingAnimationIdle; walkingAnimationIdle.setSpriteSheet(PlayerTex); walkingAnimationIdle.addFrame(sf::IntRect(200, 400, 200, 200)); walkingAnimationIdle.addFrame(sf::IntRect(400, 400, 200, 200)); walkingAnimationIdle.addFrame(sf::IntRect(600, 400, 200, 200)); walkingAnimationIdle.addFrame(sf::IntRect(0, 400, 200, 200)); Animation* currentAnimation = &walkingAnimationLeft; PlayerImage = AnimatedSprite(sf::seconds(0.1), true, false); PlayerImage.setPosition(sf::Vector2f(screenDimensions / 3)); sf::Clock frameClock; float speed = 160.f; bool noKeyWasPressed = true; // ------------------------ // Initialization ends here // Our GAMELOOP starts here while (window.isOpen()) { Event event; while (window.pollEvent(event)) { if (event.type == Event::Closed) { window.close(); } if (event.type == Event::MouseButtonReleased) { playerInventory->refreshItems(); dragging = false; clicked = false; } } sf::Time frameTime = frameClock.restart(); // if a key was pressed set the correct animation and move correctly sf::Vector2f movement(0.f, 0.f); if (sf::Keyboard::isKeyPressed(sf::Keyboard::Up)) { movement.y -= speed; noKeyWasPressed = false; } if (sf::Keyboard::isKeyPressed(sf::Keyboard::Down)) { movement.y += speed; noKeyWasPressed = false; } if (sf::Keyboard::isKeyPressed(sf::Keyboard::Left)) { currentAnimation = &walkingAnimationLeft; movement.x -= speed; noKeyWasPressed = false; } if (sf::Keyboard::isKeyPressed(sf::Keyboard::Right)) { currentAnimation = &walkingAnimationRight; movement.x += speed; noKeyWasPressed = false; } PlayerImage.play(*currentAnimation); PlayerImage.move(movement * frameTime.asSeconds()); // if no key was pressed stop the animation if (noKeyWasPressed) { //PlayerImage.stop(); PlayerImage.setFrameTime(sf::seconds(0.4)); currentAnimation = &walkingAnimationIdle; } if (!noKeyWasPressed) { PlayerImage.setFrameTime(sf::seconds(0.1)); } noKeyWasPressed = true; // update AnimatedSprite PlayerImage.update(frameTime); // constatly check if the player completed the quest playerQuests->checkQuests(draggeditem, playerInventory, PlayerImage); window.clear(); if (loadedLevel) { // draw the level background window.draw(loadedLevel->bgSprite); } // draw the menubackground (bottom part of screen) window.draw(MenuBackground); for (auto && entity : loadedLevel->currentEntities) { // draw all active entities in the level window.draw(entity.Sprite); } // Show text of talking NPCs if (playerQuests->triggerShowText) { if (playerQuests->clock.getElapsedTime().asSeconds() < 10) window.draw(playerQuests->talkText); if (playerQuests->clock.getElapsedTime().asSeconds() > 10) playerQuests->triggerShowText = false; } window.draw(PlayerImage); window.draw(playerQuests->currentQuestText); for (auto && item : playerInventory->currentItems) { // draw all items in the player invneotry window.draw(item.itemIconSprite); } // initiate the final draw call window.display(); // Switch level, if 5 tasks have been accomplished in every map if (playerQuests->currentQuestId > 5 && loadedLevelIndex <= 3) { delete loadedLevel; delete playerQuests; loadedLevelIndex++; loadedLevel = levels[loadedLevelIndex]; playerQuests = new Quests(loadedLevel); PlayerImage.setPosition(0.0f, 100.0f); } // Execute the Game Loop in each individual level constantly loadedLevel->Update(playerQuests->currentQuestId); //Check for left mouse clicks if (sf::Mouse::isButtonPressed(sf::Mouse::Left)) { sf::Vector2i localPosition = sf::Mouse::getPosition(window); sf::Vector2f worldPos = window.mapPixelToCoords(localPosition); // Move player, if cursor is in game world if (localPosition.y < 380 && !dragging) { Target1.x = worldPos.x - 100; Target1.y = worldPos.y - 100; } // Use item and init dragging, if cursor is in menu (bottom screen part) if (localPosition.y > 380 && !dragging) { for (auto && item : playerInventory->currentItems) { if (localPosition.y < item.itemIconSprite.getPosition().y + item.itemIconSprite.getGlobalBounds().height && localPosition.y > item.itemIconSprite.getPosition().y && localPosition.x < item.itemIconSprite.getPosition().x + item.itemIconSprite.getGlobalBounds().width && localPosition.x > item.itemIconSprite.getPosition().x) { item.itemIconSprite.setPosition(localPosition.x - 32, localPosition.y - 32); dragging = true; draggeditem = &item; } } } if (draggeditem) { if (dragging) { //Set the item position to the mouse cursor position if the user is dragging it draggeditem->itemIconSprite.setPosition(localPosition.x - 32, localPosition.y - 32); } } // MOVE TO POINT via CURSOR float k = 1; // Speed Constant float px = PlayerImage.getPosition().x; float py = PlayerImage.getPosition().y; float ex = Target1.x; float ey = Target1.y; // "clicked" is used to not allow the player to just drag his charachter across the screen, // but instead the player has to confirm each charachter movement by mouse click. if (!clicked) { PlayerImage.setPosition(Target1.x, Target1.y); } clicked = true; } } return 0; }
void GameUpdateDraw( NimblePixMap& map, NimbleRequest request ) { #if WRITING_DOCUMENTATION new(&TheMap) NimblePixMap( map ); #endif /* WRITING_DOCUMENTATION */ WavefieldRect = NimbleRect(PanelWidth,map.height()/2,map.width(),map.height()); NimblePixMap subsurface(map,WavefieldRect); NimblePixMap seismogramClip( map,NimbleRect(PanelWidth,0,map.width(),map.height()/2) ); if( request & NimbleUpdate ) { ShowGeology.update(); ShowSeismic.update(); } const NimbleRequest pausedRequest = IsPaused ? request-NimbleUpdate : request; SeismogramUpdateDraw( seismogramClip, pausedRequest&NimbleUpdate, TheColorFunc, IsAutoGainOn ); WavefieldFunctor wf(subsurface, pausedRequest); SeismogramFunctor sf( seismogramClip, pausedRequest&NimbleDraw ); ReservoirFunctor rf( pausedRequest ); #if PARALLEL tbb::parallel_invoke( wf, sf, rf ); #else wf(); sf(); rf(); #endif if( pausedRequest & NimbleUpdate ) { DrillBit.update(); UpdateDuckAndRig(); } if( request & NimbleDraw ) { ClickableSetEnd = ClickableSet; const int wavefieldWidth = map.width()-PanelWidth; Assert(wavefieldWidth%4==0); const int wavefieldHeight = map.height()/2; ReservoirDrawHoles( subsurface ); if( DrillY>0 ) DrillBit.drawOn( subsurface, RigX-DrillBit.width()/2, DrillY-5 ); if( ShowReservoir ) ReservoirDraw( subsurface ); NimblePixMap spriteClip( map, NimbleRect( PanelWidth, 0, map.width(), map.height() ));\ NimblePixel greenPixel = map.pixel( NimbleColor( 0, NimbleColor::FULL, 0 )); NimblePixel redPixel = map.pixel( NimbleColor( NimbleColor::FULL, 0, 0 )); const int lineHeight = map.height()/2-1; if( CultureBeginX<CultureEndX ) { spriteClip.draw( NimbleRect( 0, lineHeight, CultureBeginX, lineHeight+1 ), greenPixel ); spriteClip.draw( NimbleRect( CultureBeginX, lineHeight-1, CultureEndX, lineHeight+2 ), redPixel ); spriteClip.draw( NimbleRect( CultureEndX, lineHeight, spriteClip.width(), lineHeight+1 ), greenPixel ); Culture.drawOn( spriteClip, CultureBeginX+(CultureEndX-CultureBeginX)/2-Culture.width()/2, map.height()/2-Culture.height() ); } else { spriteClip.draw( NimbleRect( 0, lineHeight, spriteClip.width(), lineHeight+1 ), greenPixel ); } OilRig->drawOn( spriteClip, RigX-OilRig->width()/2, OilRigVerticalOffset ); if( DuckGoingLeft ) DuckLeft.drawOn( spriteClip, DuckX-50, map.height()/2-DuckLeft.height()+12 ); else DuckRight.drawOn( spriteClip, DuckX-(DuckRight.width()-50), map.height()/2-DuckLeft.height()+12 ); NimblePixMap panelClip( map, NimbleRect( 0, 0, PanelWidth, map.height() )); PanelBackground.drawOn( panelClip ); int cashMeterY = map.height()- 50 -CashMeter.height(); int levelMeterY = cashMeterY - 10 - LevelMeter.height(); // The Min is there so that if there is room, the green line artistically lines up // with the top of the fluid meters. int fluidMeterY = Min(levelMeterY - 10 - WaterMeter.height(), map.height()/2 ); if( ScoreState.isDisplayingScore() ) { LevelMeter.drawOn( map, PanelWidth/2-LevelMeter.width()/2, levelMeterY ); CashMeter.drawOn( map, PanelWidth/2-CashMeter.width()/2, cashMeterY ); } int meterMarginX = (PanelWidth-WaterMeter.width()-OilMeter.width()-GasMeter.width())/4; WaterMeter.drawOn( map, meterMarginX, fluidMeterY ); OilMeter.drawOn( map, PanelWidth/2-OilMeter.width()/2, fluidMeterY ); GasMeter.drawOn( map, PanelWidth-meterMarginX-GasMeter.width(), fluidMeterY ); if( VisibleDialog ) { if( VisibleDialog==&TheAboutTheAuthorDialog || VisibleDialog==&TheLevelContinueDialog ) // Center it on screen VisibleDialog->drawOn( map, map.width()/2-VisibleDialog->width()/2, map.height()/2-VisibleDialog->height()/2 ); else if( VisibleDialog==&TheKeyboardHelpDialog ) // Put in upper right corner VisibleDialog->drawOn( map, map.width()*.95f-VisibleDialog->width(), map.height()*.05f ); else // Put it in upper left portion of seismogram VisibleDialog->drawOn( map, PanelWidth+24, 24 ); } int tabTop1 = 50; int tabTop2 = tabTop1+2*TheFont.height(); int tabLeft1 = PanelWidth/8; int tabLeft2 = PanelWidth*5/8; int airGunTop = tabTop2+2*TheFont.height();; AirgunMeter.drawOn( map, PanelWidth/2-AirgunMeter.width()/2, airGunTop ); if( ShowFrameRate ) { FrameRateMeter.setValue( EstimateFrameRate() ); FrameRateMeter.drawOn( map, PanelWidth/2-FrameRateMeter.width()/2, fluidMeterY-FrameRateMeter.height()-15 ); } const int tabSpacing = PanelWidth/4; DrawClickable( TheFileMenu, map, tabLeft1, tabTop1 ); DrawClickable( TheHelpMenu, map, tabLeft2, tabTop1 ); // The "isTabbed" tests below do some ad-hoc occlusion testing. if( TheFileMenu.isTabbed() ) DrawClickable( TheModelMenu, map, tabLeft1, tabTop2 ); if( TheFileMenu.isTabbed() && TheHelpMenu.isTabbed() ) DrawClickable( TheViewMenu, map, tabLeft2, tabTop2 ); } ScoreState.update(); }