Skip to content

Commit 2dcc547

Browse files
authored
Merge pull request #8 from PashkovD/seeds_opmiziation
Buffer for seed drawing and collision
2 parents 8914fa4 + 427c309 commit 2dcc547

File tree

2 files changed

+35
-19
lines changed

2 files changed

+35
-19
lines changed

pacman/objects/seed.py

Lines changed: 33 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,6 @@
1-
from pygame import Rect, Surface, draw, time
1+
from math import floor
2+
3+
from pygame import SRCALPHA, Rect, Surface, draw, time
24

35
from pacman.data_core import Colors, IDrawable
46
from 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)

pacman/scenes/main_scene.py

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -50,6 +50,8 @@ def __init__(self, map_color=None):
5050

5151
self.__create_heroes()
5252

53+
self.__seeds.create_buffer()
54+
5355
self.__update_score_text()
5456

5557
# region Private

0 commit comments

Comments
 (0)