Compare commits

...

2 Commits

Author SHA1 Message Date
49f15f9a21 phc: + hero move accel 2024-04-01 00:42:29 +03:00
98a2e240e3 phc: key repeat + 30 fps event_loop 2024-04-01 00:09:37 +03:00

View File

@ -27,6 +27,7 @@ import tempfile
import urllib.request
from abc import ABC, abstractmethod
from contextlib import contextmanager
from enum import Enum
from random import choice, randrange, sample
from typing import NamedTuple, Optional
@ -211,6 +212,13 @@ def get_maze_sz(maze: list[list[int]]) -> Coords:
return Coords(len(maze[0]), len(maze))
class Direction(Enum):
LEFT = 1
RIGHT = 2
UP = 3
DOWN = 4
class GameObject(ABC):
"""обобщение игрового элемента"""
@ -274,6 +282,8 @@ class Hero(GameObject):
self.rect.topleft = coords
self.active = True
self.looking_right = False
self._speed = 1
self.direction = Direction.RIGHT
# картинка изначально влево, а надо бы начинать со взгляда вправо
self.flip()
@ -284,8 +294,17 @@ class Hero(GameObject):
"""Проверка пересечения со стенами"""
new_rect = self.rect.copy()
new_rect.topleft = coords
new_rect.scale_by_ip(0.99, 0.99)
return self.scene.walls.check_collision(new_rect)
@property
def speed(self):
return self._speed
@speed.setter
def speed(self, value):
self._speed = value % 14 + 1
def _reduce_step(self, coords):
"""Уменьшение шага движения, с целью подойти вплотную к стене"""
delta = coords - self.coords
@ -315,12 +334,30 @@ class Hero(GameObject):
self.looking_right = not self.looking_right
self._surface = pygame.transform.flip(self.surface, True, False)
def move(self, direction: Coords, step: int = 1):
def update_direction(self, direction: Coords):
if direction.x != 0:
going_right = direction.x > 0
if self.looking_right != going_right:
self.flip()
self.coords += direction * step
if direction.x < 0:
new_direction = Direction.LEFT
elif direction.x > 0:
new_direction = Direction.RIGHT
elif direction.y < 0:
new_direction = Direction.UP
elif direction.y > 0:
new_direction = Direction.DOWN
if new_direction != self.direction:
self.speed = 0
self.direction = new_direction
else:
self.speed += 1
def move(self, direction: Coords, step: int = 1):
self.update_direction(direction)
self.coords += direction * step * self._speed // 3
self.scene.coins.collect(self.rect)
def move_left(self, step: int = 1):
@ -339,7 +376,7 @@ class Hero(GameObject):
if not self.active:
return
wide, short = 30, 5
wide, short = 5, 1
if event.type == pygame.KEYDOWN:
match event.key:
case pygame.K_UP:
@ -646,11 +683,14 @@ class Scene(GameObject):
self.end.handle_event(event)
def event_loop(self):
clock = pygame.time.Clock()
pygame.key.set_repeat(50, 30)
while not self.done:
event = pygame.event.wait()
self.handle_event(event)
for event in pygame.event.get():
self.handle_event(event)
self.draw()
pygame.display.flip()
clock.tick(30)
def game(assets):