Pārlūkot izejas kodu

ajout de l'horloge, passage du monde dans les paramètres du joueur plutôt que de tout recalculer, et stockage de la liste des tuiles dans le monde en plus de la liste des positions des tuiles

Hvrnbi 3 nedēļas atpakaļ
vecāks
revīzija
5aab532994
6 mainītis faili ar 43 papildinājumiem un 48 dzēšanām
  1. 2 0
      .gitignore
  2. 0 3
      .vscode/settings.json
  3. 11 7
      main.py
  4. 5 31
      player.py
  5. 3 0
      variables.py
  6. 22 7
      world.py

+ 2 - 0
.gitignore

@@ -1,3 +1,5 @@
 .venv/
 
 __pycache__/
+
+.vscode/

+ 0 - 3
.vscode/settings.json

@@ -1,3 +0,0 @@
-{
-    "python-envs.defaultEnvManager": "ms-python.python:system"
-}

+ 11 - 7
main.py

@@ -1,6 +1,6 @@
 import pygame, sys
 from pygame.locals import * # Import des constantes de pygame
-from world import *
+from world import World
 from variables import *
 from player import *
 from nest import *
@@ -17,21 +17,23 @@ def main():
 
     pygame.display.set_caption("VISI301")   # Nom de la fenêtre, à changer à la fin TODO
 
+    # Horloge du jeu
+    clock = pygame.time.Clock()
+
     # Création du monde
     world = World(display, NB_COL, NB_ROW, GAP)
-    world.draw()
 
-    player = Player(0, 0, display)
-    player.draw(world.pos_list[1])              #Le choix de la tuile a été arbitraire
+    player = Player(0, 0, world, display)
 
     nest = Nest(0, display)
-    nest.draw(world.pos_list[0], 0)
 
     ### Boucle principale ###
     while True:
         
         # À chaque tick on fait ce qu'il y a là
-        # create_world(display, NB_COL, NB_ROW, GAP)
+        world.draw()
+        player.draw(world.pos_list[1])  # On commence sur la tuile en dessous du nid
+        nest.draw(world.pos_list[0], 0)
 
         for event in pygame.event.get():
 
@@ -42,7 +44,9 @@ def main():
                 pygame.quit()
                 sys.exit()
 
-            pygame.display.update()
+        pygame.display.update()
+        clock.tick(FPS)
+
 
     # On quitte pygame
     pygame.quit()

+ 5 - 31
player.py

@@ -1,47 +1,21 @@
 import pygame
 from tiles import *
 from variables import *
+from world import World
 
 
 class Player:
-    def __init__(self, x: int, y: int, display: pygame.display):
+    def __init__(self, x: int, y: int, world: World, display: pygame.display):
         """Un joueur, avec ses coordonnées (x, y)"""
         self.display = display
         self.x: int = x
         self.y: int = y
-        self.width: int = self.player_size()
-        self.height: int = self.player_size()
         self.picture: str = "player"
+        self.world: World = world
 
     def draw(self, tile: dict):
         """Affiche le joueur"""
-        image = pygame.transform.scale(PLAYER, (self.player_size(), self.player_size()))
-        tile_size = self.tile_size()
-        self.display.blit(image, (tile['x'] - tile_size // 3.7, tile['y'] - tile_size // 3.7))  #la valeur ici est arbitraire mais marche. elle est la pour centrer l'affichage du joueur sur une tuile, a changer dans le futur
-
-    def player_size(self):
-        """Renvoie la taille que fera le joueur (sa hauteur et sa largeur sont similaires)"""
-        width = (WINDOW_WIDTH - NB_COL * GAP) // NB_COL
-        height = (WINDOW_HEIGHT - NB_ROW * GAP) // NB_ROW
-
-        #Réutilisation du calcul de la taille des tuilles pour calculer la taille du joueur
-        if height < 0.86 * width:
-            width = height // 0.86
-        else:
-            height = round(width * 0.86)
-        return int(width) // 1.8
-
-    def tile_size(self):
-        """Renvoie la taille d'une tuille                       CECI EST UNE FONCTION TEST QUI POURRAS SUREMENT ETRE ENLEVEE"""
-        width = (WINDOW_WIDTH - NB_COL * GAP) // NB_COL
-        height = (WINDOW_HEIGHT - NB_ROW * GAP) // NB_ROW
-
-        #Réutilisation du calcul de la taille des tuilles pour calculer la taille du joueur
-        if height < 0.86 * width:
-            width = height // 0.86
-        else:
-            height = round(width * 0.86)
-        return int(width)
-
+        image = pygame.transform.scale(PLAYER, (self.world.tile_width, self.world.tile_height))
+        self.display.blit(image, (tile['x'] - self.world.tile_width // 2, tile['y'] - self.world.tile_height // 2))  #la valeur ici est arbitraire mais marche. elle est la pour centrer l'affichage du joueur sur une tuile, a changer dans le futur
     
     

+ 3 - 0
variables.py

@@ -5,6 +5,9 @@ from os import path
 WINDOW_WIDTH = 1920
 WINDOW_HEIGHT = 1080
 
+# Nombre d'images par secondes
+FPS = 60
+
 # Nombre de colonnes et de lignes sur la map
 NB_COL = 17
 NB_ROW = 12

+ 22 - 7
world.py

@@ -1,6 +1,6 @@
 from tiles import *
 from variables import *
-from random import randint
+from random import choice
 
 
 class World:
@@ -12,20 +12,35 @@ class World:
         self.gap = gap
         self.tile_width, self.tile_height = self.tile_size()
         self.pos_list = self.position_of_tiles((WINDOW_WIDTH // 2, WINDOW_HEIGHT // 2))
+        self.tiles_list = self.create_tiles()
+        self.left_border = min([tile["x"] for tile in self.pos_list])
+        self.right_border = max([tile["x"] for tile in self.pos_list])
+        self.top_border = min([tile["y"] for tile in self.pos_list])
+        self.bottom_border = max([tile["y"] for tile in self.pos_list])
 
     
     def draw(self):
         """Dessine les tuiles du monde"""
-        for pos in self.pos_list:
-            tile = Tile(pos["x"], pos["y"], self.tile_width, self.tile_height, self.tile_type(), self.display)
+        for tile in self.tiles_list:
             tile.draw()
 
 
-    def tile_type(self) -> str:
+    def random_tile_type(self) -> str:
         """Renvoie une chaine de caractère contenant 'green' ou 'seed' avec une probabilité respective de 80% et 20%"""
-        t_type = ["green", "green", "green", "green", "seed"]
-        return t_type[randint(0, 4)]
-            
+        t_type = ["green"] * 4 + ["seed"]
+        return choice(t_type)
+
+    
+    def create_tiles(self):
+        """Renvoie une liste avec toutes les tuiles du monde, générées en partie aléatoirement"""
+        res = []
+        # Tuile centrale
+        res.append(Tile(self.pos_list[0]["x"], self.pos_list[0]["y"], self.tile_width, self.tile_height, "green", self.display))
+        # Toutes les autres
+        for pos in self.pos_list[1:]:
+            res.append(Tile(pos["x"], pos["y"], self.tile_width, self.tile_height, self.random_tile_type(), self.display))
+        return res
+
 
     def tile_size(self) -> tuple:
         """Renvoie un tuple contenant la largeur et la hauteur d'une tuile en fonction du nombre de lignes, de colonnes, et de l'espacement entre le tuiles"""