void updateGameScene(GameScene &scene, float elapsedTime) { if (scene.gameState == GameState::Playing) { updatePackman(scene.packman, elapsedTime, scene.field); // Контейнер std::map при обходе с range-based for // последовательно возвращает пары (ключ, значение), // упакованные в контейнер std::pair. // pair имеет тип `std::pair<const GhostId, Ghost> &` for (auto &pair : scene.ghosts) { updateGhost(pair.second, elapsedTime, scene.field); } // Проверяем условие поражения - столкновение пакмана и призрака. const sf::FloatRect packmanBounds = getPackmanBounds(scene.packman); for (const auto &pair : scene.ghosts) { if (getGhostBounds(pair.second).intersects(packmanBounds)) { updateGameOverLabel(scene.gameOverLabel, "Game Over! You lose."); scene.gameState = GameState::PlayerLosed; } } // Проверяем условие победы - всё печенье съедено. if (getRemainingCookies(scene) == 0) { updateGameOverLabel(scene.gameOverLabel, "Congratulations, you won!"); scene.gameState = GameState::PlayerWon; } } }
void ShiftTraceTool::leftButtonUp(const TPointD &pos, const TMouseEvent &) { if (CurveP0Gadget <= m_gadget && m_gadget <= CurvePmGadget) { if (m_curveStatus == TwoPointsCurve) { m_p2 = (m_p0 + m_p1) * 0.5; m_curveStatus = ThreePointsCurve; updateCurveAffs(); updateGhost(); m_center[0] = (m_aff[0] * m_dpiAff).inv() * m_p2; m_center[1] = (m_aff[1] * m_dpiAff).inv() * m_p2; } } m_gadget = NoGadget; invalidate(); }
void ShiftTraceTool::leftButtonDrag(const TPointD &pos, const TMouseEvent &) { if (m_gadget == NoGadget) { if (norm(pos - m_oldPos) > 10 * getPixelSize()) { m_curveStatus = TwoPointsCurve; m_p0 = m_oldPos; m_gadget = CurveP1Gadget; } } if (isCurveGadget(m_gadget)) { if (m_gadget == CurveP0Gadget) m_p0 = pos; else if (m_gadget == CurveP1Gadget) m_p1 = pos; else m_p2 = pos; updateCurveAffs(); } else if (m_gadget == RotateGadget) { TAffine aff = getGhostAff(); TPointD c = aff * m_center[m_ghostIndex]; TPointD a = m_oldPos - c; TPointD b = pos - c; m_oldPos = pos; TPointD u = normalize(a); double phi = atan2(-u.y * b.x + u.x * b.y, u.x * b.x + u.y * b.y) * 180.0 / 3.14153; TPointD imgC = aff * m_center[m_ghostIndex]; m_aff[m_ghostIndex] = TRotation(imgC, phi) * m_aff[m_ghostIndex]; } else if (m_gadget == MoveCenterGadget) { TAffine aff = getGhostAff().inv(); TPointD delta = aff * pos - aff * m_oldPos; m_oldPos = pos; m_center[m_ghostIndex] += delta; } else if (m_gadget == TranslateGadget) { TPointD delta = pos - m_oldPos; m_oldPos = pos; m_aff[m_ghostIndex] = TTranslation(delta) * m_aff[m_ghostIndex]; } updateGhost(); invalidate(); }
bool CameraViewUpdate() { if (viewFightInitRequired()) initFightView(); bool ghostAvailable = getGameState()->getGhost() != NULL; // Clear the screen IwGxClear(IW_GX_COLOUR_BUFFER_F | IW_GX_DEPTH_BUFFER_F); if (ghostAvailable && (!gameIsHalt() || getGameState()->getGhost()->isDead())) { updateGhost(); } renderCamera(); setupPlayer(); if (ghostAvailable) renderGhost(); playerAttackView->Render(); playerHit->Render(); manaBar->Render(); cameraDefend->Update(); cameraDefend->Render(); tutorialView->Render(); IwGxFlush(); IwGxSwapBuffers(); IwGxTickUpdate(); return true; }
void initFightView() { GhostType ghostType = getGameState()->getGhost()->getGhostType(); if (ghostType == GhostType::VIKING) { ghost_Model = ghostStore_Model[0]; ghostCollision = ghostStoreCollision[0]; for (int i = 0; i < 5; i++) { ghost_Anims[i] = ghostStore_Anims[0][i]; } ghost_Skel = ghostStore_Skel[0]; ghost_Skin = ghostStore_Skin[0]; } else if (ghostType == GhostType::SKELMAN) { ghost_Model = ghostStore_Model[1]; ghostCollision = ghostStoreCollision[1]; for (int i = 0; i < 5; i++) { ghost_Anims[i] = ghostStore_Anims[1][i]; } ghost_Skel = ghostStore_Skel[1]; ghost_Skin = ghostStore_Skin[1]; } if (ghostMatrix) delete ghostMatrix; if (ghost_Player) delete ghost_Player; ghostMatrix = new CIwFMat(); ghostCollision->init(ghostMatrix, ghostType); ghost_Player = new CIwAnimPlayer; ghost_Player->SetSkel(ghost_Skel); // Reset animation ghost_Player->PlayAnim(ghost_Anims[GHOST_ANIM_IDLE], 1, CIwAnimBlendSource::LOOPING_F, 0); updateGhost(); }