Add files via upload

This commit is contained in:
Kiriteau 2025-03-06 16:38:03 +01:00 committed by GitHub
commit 254c4b7ab3
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194

293
avatar.py Normal file
View File

@ -0,0 +1,293 @@
import sys
import time
import os
import random
from threading import Thread
from PyQt5.QtWidgets import QApplication, QLabel, QWidget
from PyQt5.QtGui import QPixmap
from PyQt5.QtCore import QTimer, Qt, QPoint
class FloatingImage(QWidget):
def __init__(self):
super().__init__()
self.setWindowFlags(Qt.FramelessWindowHint | Qt.WindowStaysOnTopHint | Qt.Tool)
self.setAttribute(Qt.WA_TranslucentBackground)
# Variables de mouvement et état
self.gravity = 1
self.jump_strength = -15
self.dy = 0
self.dx = 0
self.on_ground = False
self.flying = False
self.friction = 0.95
self.moving_left = False
self.moving_right = False
self.moving_up = False
self.moving_down = False
self.jump_requested = False
self.dragging = False
self.hidden_in_folder = False # Ajouté pour gérer l'entrée dans les dossiers
self.offset = QPoint()
self.last_mouse_pos = QPoint()
self.last_mouse_time = 0
# Variables pour aller vers un dossier
self.target_folder = None
self.target_position = None
self.moving_to_folder = False
# Chargement de l'image
self.label = QLabel(self)
pixmap = QPixmap("avatar.png")
if pixmap.isNull():
print("Erreur : Impossible de charger avatar.png")
self.label.setPixmap(pixmap)
self.label.adjustSize()
self.resize(pixmap.width(), pixmap.height())
self.label.show()
self.show()
# Timer de mise à jour
self.timer = QTimer()
self.timer.timeout.connect(self.update_movement)
self.timer.start(30)
# Mode IA (désactivé au début)
self.ai_mode = False
self.ai_timer = QTimer()
self.ai_timer.timeout.connect(self.update_ai_behavior) # Appelle une fonction pour changer le comportement
self.ai_wants_to_fly = False # L'IA ne veut pas voler au départ
self.last_flight_toggle_time = time.time() # Dernière activation/désactivation du vol
self.sprint_active = False # Indique si l'avatar est en sprint
self.sprint_timer = 0 # Temps depuis lequel la touche est maintenue
self.base_speed = 3 # Vitesse normale
self.sprint_speed = 5 # Vitesse en sprint
self.current_speed = self.base_speed # Vitesse actuelle
self.bounce_factor = 0.5 # Facteur de rebond (50% de la vitesse est conservée)
self.bounce_threshold = 10 # Vitesse minimale pour rebondir
def update_ai_behavior(self):
import random
"""L'IA choisit une action et l'exécute."""
if not self.ai_mode:
return # L'IA ne bouge pas si elle est désactivée
actions = []
# Mode MARCHE (si au sol)
if self.on_ground:
actions.extend(["left", "right", "jump", "idle"]) # Il peut marcher, sauter ou rien faire
# Mode VOL (si activé)
if self.flying:
actions.extend(["fly_up", "fly_down", "fly_left", "fly_right", "idle"])
# Si l'avatar est en l'air mais pas en vol, il ne peut que tomber
if not self.on_ground and not self.flying:
actions = ["idle"] # Rien à faire, il chute tout seul
action = random.choice(actions) # Choisit une action au hasard
print(f"🤖 L'IA a choisi : {action}")
# Exécute l'action
if action == "left":
self.moving_left = True
self.moving_right = False
elif action == "right":
self.moving_right = True
self.moving_left = False
elif action == "jump" and self.on_ground:
self.dy = self.jump_strength # Applique le saut
self.on_ground = False
elif action == "fly_up" and self.flying:
self.moving_up = True
elif action == "fly_down" and self.flying:
self.moving_down = True
elif action == "fly_left" and self.flying:
self.moving_left = True
elif action == "fly_right" and self.flying:
self.moving_right = True
elif action == "idle":
self.moving_left = self.moving_right = self.moving_up = self.moving_down = False # Arrête tout
def update_movement(self):
if self.hidden_in_folder:
return # Ne rien faire si caché
if self.moving_to_folder and self.target_position:
x, y = self.x(), self.y()
target_x, target_y = self.target_position
if abs(x - target_x) > 3:
x += 3 if x < target_x else -3
if abs(y - target_y) > 3:
y += 3 if y < target_y else -3
self.move(x, y)
if abs(x - target_x) <= 5 and abs(y - target_y) <= 5:
self.moving_to_folder = False
self.flying = False
print(f"Arrivé au dossier {self.target_folder} !")
elif not self.moving_to_folder and not self.dragging:
screen = QApplication.primaryScreen().geometry()
x, y = self.x(), self.y()
if self.flying:
if self.moving_up:
y -= 5
if self.moving_down:
y += 5
if self.moving_left:
x -= 5
if self.moving_right:
x += 5
else:
self.dy += self.gravity
y += self.dy
x += self.dx
if self.moving_left:
x -= 5
if self.moving_right:
x += 5
self.dx *= self.friction
self.dy *= self.friction
if y + self.height() >= screen.height():
y = screen.height() - self.height()
self.on_ground = True
self.dy = 0
self.dx = 0
else:
self.on_ground = False
if x <= 0 or x + self.width() >= screen.width():
self.dx = 0
# Vérifier si on touche le plafond (rebond)
if y <= 0:
y = 0
if abs(self.dy) > self.bounce_threshold: # Si la vitesse est suffisante
self.dy = -self.dy * self.bounce_factor
else:
self.dy = 0
x = max(0, min(screen.width() - self.width(), x))
y = max(0, min(screen.height() - self.height(), y))
# L'IA décide d'activer ou désactiver le vol
current_time = time.time()
if current_time - self.last_flight_toggle_time > 10: # Attendre au moins 10 sec avant un changement
if self.flying: # Si elle vole déjà
if current_time - self.last_flight_toggle_time > 60: # Vol max de 1 min
self.flying = False
self.moving_up = self.moving_down = False # Arrêter les déplacements verticaux
self.last_flight_toggle_time = current_time
print("✈️ L'IA désactive le vol")
else: # Si elle est au sol
if random.random() < 0.1: # 10% de chance d'activer le vol
self.flying = True
self.last_flight_toggle_time = current_time
print("🚀 L'IA active le vol")
# Vérifier si on doit activer le sprint
if (self.moving_left or self.moving_right):
if not self.sprint_active and time.time() - self.sprint_timer >= 1: # Sprint après 1 sec
self.sprint_active = True
self.current_speed = self.sprint_speed # Augmente la vitesse
elif not self.moving_left and not self.moving_right:
self.sprint_active = False
self.current_speed = self.base_speed # Revenir à la vitesse normale
# Appliquer la vitesse actuelle
if self.moving_left:
x -= self.current_speed
if self.moving_right:
x += self.current_speed
self.move(int(x), int(y))
def keyPressEvent(self, event):
if event.key() == Qt.Key_Left:
self.moving_left = True
self.sprint_timer = time.time() # Enregistre le moment où la touche est pressée
elif event.key() == Qt.Key_Right:
self.moving_right = True
self.sprint_timer = time.time() # Enregistre le moment où la touche est pressée
elif event.key() == Qt.Key_Up and self.flying:
self.moving_up = True
elif event.key() == Qt.Key_Down and self.flying:
self.moving_down = True
elif event.key() == Qt.Key_Space and self.on_ground:
self.dy = self.jump_strength
self.on_ground = False
elif event.key() == Qt.Key_V:
self.flying = not self.flying
if self.flying:
self.dy = 0
if event.key() == Qt.Key_I:
self.ai_mode = not self.ai_mode # Active/Désactive le mode IA
if self.ai_mode:
print("✅ Mode IA activé !")
self.ai_timer.start(2000) # Change de comportement toutes les 2 secondes
else:
print("❌ Mode IA désactivé !")
self.ai_timer.stop()
def keyReleaseEvent(self, event):
if event.key() == Qt.Key_Left:
self.moving_left = False
elif event.key() == Qt.Key_Right:
self.moving_right = False
elif event.key() == Qt.Key_Up:
self.moving_up = False
elif event.key() == Qt.Key_Down:
self.moving_down = False
if event.key() == Qt.Key_Left or event.key() == Qt.Key_Right:
self.moving_left = False
self.moving_right = False
self.sprint_active = False # Désactive le sprint
self.current_speed = self.base_speed # Remet la vitesse normale
def mousePressEvent(self, event):
if event.button() == Qt.LeftButton:
self.dragging = True
self.offset = event.globalPos() - self.pos()
self.last_mouse_pos = event.globalPos()
self.last_mouse_time = time.time()
def mouseMoveEvent(self, event):
if self.dragging:
screen = QApplication.primaryScreen().geometry()
new_x = event.globalX() - self.offset.x()
new_y = event.globalY() - self.offset.y()
new_x = max(0, min(screen.width() - self.width(), new_x))
new_y = max(0, min(screen.height() - self.height(), new_y))
self.move(new_x, new_y)
def mouseReleaseEvent(self, event):
if event.button() == Qt.LeftButton:
self.dragging = False
time_elapsed = time.time() - self.last_mouse_time
if time_elapsed < 0.15:
mouse_delta = event.globalPos() - self.last_mouse_pos
speed_factor = 0.2
self.dx = mouse_delta.x() * speed_factor
self.dy = mouse_delta.y() * speed_factor
app = QApplication(sys.argv)
window = FloatingImage()
window.show()
sys.exit(app.exec_())