diff --git a/src/core/animation_manager.py b/src/core/animation_manager.py index faa829b..b9d5c2b 100644 --- a/src/core/animation_manager.py +++ b/src/core/animation_manager.py @@ -157,6 +157,17 @@ def update_frame(self): elif self.current_state == "thinking": # Наклон + покачивание painter.rotate(10 + 5 * math.sin(self.frame_counter * 0.2)) + elif self.current_state == "playing": + # Покачивание и подпрыгивание + angle = 8 * math.sin(self.frame_counter * 0.6) + jump = -abs(8 * math.sin(self.frame_counter * 0.6)) + painter.translate(0, jump) + painter.rotate(angle) + elif self.current_state == "shaking": + # Сильное встряхивание с динамическим изменением масштаба + scale_var = 1.0 + 0.08 * math.sin(self.frame_counter * 1.2) + painter.scale(scale_var, scale_var) + painter.translate(random.randint(-5, 5), random.randint(-5, 5)) painter.translate(-size.width() / 2, -size.height() / 2) diff --git a/tests/test_utils.py b/tests/test_utils.py index 1a72e44..1e6062c 100644 --- a/tests/test_utils.py +++ b/tests/test_utils.py @@ -412,6 +412,36 @@ def test_animation_manager_current_fps(self): am.current_fps = 15 self.assertEqual(am.current_fps, 15) + def test_animation_manager_playing_and_shaking_procedural_transforms(self): + os.environ["QT_QPA_PLATFORM"] = "offscreen" + from PySide6.QtWidgets import QApplication, QLabel + from src.core.animation_manager import AnimationManager + + app = QApplication.instance() or QApplication([]) + label = QLabel() + label.resize(100, 100) + config = ConfigManager(self.config_path) + am = AnimationManager(label, config) + + # Переключаем на SVG скин для тестирования процедурного SVG движка + am.set_skin("ginger") + + # Проверка состояния playing + am.play_state("playing") + self.assertEqual(am.current_state, "playing") + self.assertEqual(am.current_fps, 12) + am.update_frame() + self.assertIsNotNone(label.pixmap()) + self.assertFalse(label.pixmap().isNull()) + + # Проверка состояния shaking + am.play_state("shaking") + self.assertEqual(am.current_state, "shaking") + self.assertEqual(am.current_fps, 20) + am.update_frame() + self.assertIsNotNone(label.pixmap()) + self.assertFalse(label.pixmap().isNull()) + def test_sound_manager_fallback(self): from src.utils.sound_manager import SoundManager from PySide6.QtMultimedia import QSoundEffect diff --git a/verification/screenshots/stats_history.png b/verification/screenshots/stats_history.png index 1fa59b4..7117b8e 100644 Binary files a/verification/screenshots/stats_history.png and b/verification/screenshots/stats_history.png differ