1- from pygame import Rect , Surface , draw , time
1+ from math import floor
2+
3+ from pygame import SRCALPHA , Rect , Surface , draw , time
24
35from pacman .data_core import Colors , IDrawable
46from pacman .data_core .data_classes import Cell
@@ -12,23 +14,24 @@ def __init__(self, seed_data, energizer_data, anim_step: int) -> None:
1214 super ().__init__ ()
1315 self .__timer = time .get_ticks ()
1416 self .__anim_step = anim_step
15- self .__seeds = self .prepare_seeds (seed_data )
17+ self .__seeds : list [ list [ bool ]] = self .prepare_seeds (seed_data )
1618 self .__energizers = self .prepare_energizers (energizer_data )
1719
20+ self .__buffer = Surface ((len (self .__seeds [0 ]) * 8 , len (self .__seeds ) * 8 + 20 ), SRCALPHA )
21+
1822 self .__ram_img = ImgObj ("other/ram" )
1923 self .__yandex_img = ImgObj ("other/yandex" )
2024
2125 self .__show_energizer = True
26+ self .__seeds_counts = sum (sum (i ) for i in self .__seeds )
2227 self .__max_seeds = len (self .__seeds )
2328
2429 @staticmethod
25- def prepare_seeds (seed_data ) -> list [Cell ]:
26- seed = []
27- for i in range (len (seed_data )):
28- for j in range (len (seed_data [i ])):
29- if not seed_data [i ][j ]:
30- continue
31- seed .append (Cell (j , i ))
30+ def prepare_seeds (seed_data ) -> list [list [bool ]]:
31+ seed : list [list [bool ]] = [[False ] * len (seed_data [0 ]) for _ in range (len (seed_data ))]
32+ for y in range (len (seed_data )):
33+ for x in range (len (seed_data [y ])):
34+ seed [y ][x ] = seed_data [y ][x ]
3235 return seed
3336
3437 @staticmethod
@@ -37,11 +40,17 @@ def prepare_energizers(energizer_data) -> list[Cell]:
3740
3841 def __draw_seeds (self , screen ) -> None :
3942 if SkinStorage ().equals (SkinEnum .CHROME ):
40- for seed in self .__seeds :
41- self .__ram_img .move_center (* seed .rect .center ).draw (screen )
43+ for y in range (len (self .__seeds )):
44+ for x in range (len (self .__seeds [y ])):
45+ if self .__seeds [y ][x ]:
46+ cell = Cell (x , y )
47+ self .__ram_img .move_center (* cell .rect .center ).draw (screen )
4248 return
43- for seed in self .__seeds :
44- draw .circle (screen , Colors .WHITE , seed .rect .center , 1 )
49+ for y in range (len (self .__seeds )):
50+ for x in range (len (self .__seeds [y ])):
51+ if self .__seeds [y ][x ]:
52+ cell = Cell (x , y )
53+ draw .circle (screen , Colors .WHITE , cell .rect .center , 1 )
4554
4655 def __draw_energizers (self , screen ) -> None :
4756 if time .get_ticks () - self .__timer > self .__anim_step :
@@ -56,17 +65,22 @@ def __draw_energizers(self, screen) -> None:
5665 for energizer in self .__energizers :
5766 draw .circle (screen , Colors .WHITE , energizer .rect .center , 4 )
5867
68+ def create_buffer (self ):
69+ self .__draw_seeds (self .__buffer )
70+
5971 def draw (self , screen : Surface ) -> None :
60- self .__draw_seeds ( screen )
72+ screen . blit ( self .__buffer , ( 0 , 0 ) )
6173 self .__draw_energizers (screen )
6274
6375 def seed_collision (self , rect : Rect ) -> bool :
6476 if not len (self .__seeds ):
6577 return False
66- for i , cell in enumerate (self .__seeds ):
67- if cell .rect .center == rect .center :
68- del self .__seeds [i ]
69- return True
78+ cell = Cell (floor (rect .centerx / 8 ), floor ((rect .centery - 20 ) / 8 ))
79+ if self .__seeds [cell .y ][cell .x ] and cell .rect .center == rect .center :
80+ self .__seeds [cell .y ][cell .x ] = False
81+ draw .rect (self .__buffer , (0 , 0 , 0 , 0 ), cell )
82+ self .__seeds_counts -= 1
83+ return True
7084 return False
7185
7286 def energizer_collision (self , rect : Rect ) -> bool :
@@ -77,7 +91,7 @@ def energizer_collision(self, rect: Rect) -> bool:
7791 return False
7892
7993 def is_field_empty (self ) -> bool :
80- return len ( self .__seeds ) == 0
94+ return self .__seeds_counts == 0
8195
8296 def __len__ (self ):
8397 return len (self .__seeds )
0 commit comments