This repository has been archived on 2019-12-09. You can view files and clone it, but cannot push or open issues or pull requests.
pacman2/scenes/game_objects/ghost.py

112 lines
3.7 KiB
Python
Raw Normal View History

2019-12-09 12:36:42 +01:00
from random import random, randint
from pygame import Surface, draw, Rect, image
from engine.entity import Entity
from engine.scene_manager import SceneManager
2019-12-09 12:36:42 +01:00
from engine.resources import res
from engine.components.collide_rect import CollideRect
from engine.components.sprite import Sprite
from .common import S, Direction
2019-12-09 12:36:42 +01:00
from .pacdot import PacDot
class Ghost(Entity):
SPEED = 1
def __init__(self, x, y):
super().__init__(self.__repr__())
sprite = Sprite(image.load(res('ghost.png')).convert(), 2)
self.add(sprite)
self.phys = CollideRect(Rect(self.x, self.y,
sprite.width, sprite.width),
static=False,
solid=False,
cb=self.cb)
2019-12-09 12:36:42 +01:00
self.add(self.phys)
self.script = Ghost.script
self.x = x
self.y = y
self.direction = Direction(randint(0, 3))
2019-12-09 12:36:42 +01:00
def cb(self, c):
2019-12-09 13:21:33 +01:00
if not c.solid:
2019-12-09 12:36:42 +01:00
return
if c.parent.name == 'pacman':
print('Perdu!')
exit(0)
if self.direction == Direction.UP:
self.direction = Direction.RIGHT if random() < .5 \
else Direction.LEFT
return
if self.direction == Direction.RIGHT:
self.direction = Direction.DOWN if random() < .5 \
else Direction.UP
return
if self.direction == Direction.DOWN:
self.direction = Direction.LEFT if random() < .5 \
else Direction.RIGHT
return
if self.direction == Direction.LEFT:
self.direction = Direction.UP if random() < .5 \
else Direction.DOWN
return
def script(self):
# graph = SceneManager().scene.entities['level'].graph
# cur_node = graph[self.y//S][self.x//S]
# # print(self.y//S, self.x//S)
# pacman = SceneManager().scene.entities['pacman']
# x_dist = pacman.x - self.x
# y_dist = pacman.y - self.y
# s = 1
# p = self.find_shortest_path(graph[pacman.y//S][pacman.x//S])
# # print([x[1] for x in p])
# cur_dir = p[0][1]
# if cur_dir == Direction.UP:
# self.phys.vx = 0
# self.phys.vy = -1
# elif cur_dir == Direction.DOWN:
# self.phys.vx = 0
# self.phys.vy = 1
# elif cur_dir == Direction.LEFT:
# self.phys.vx = -1
# self.phys.vy = 0
# else:
# self.phys.vx = 1
# self.phys.vy = 0
2019-12-09 12:36:42 +01:00
if self.direction == Direction.UP:
self.phys.vy = -Ghost.SPEED
self.phys.vx = 0
elif self.direction == Direction.DOWN:
self.phys.vy = Ghost.SPEED
self.phys.vx = 0
elif self.direction == Direction.LEFT:
self.phys.vx = -Ghost.SPEED
self.phys.vy = 0
elif self.direction == Direction.RIGHT:
self.phys.vx = Ghost.SPEED
self.phys.vy = 0
def find_shortest_path(self, final_node):
graph = SceneManager().scene.entities['level'].graph
cur_node = graph[self.y//S][self.x//S]
children = cur_node.children
trace = [cur_node] + [x[0] for x in children]
paths = [[x] for x in children]
while 1:
cur_len = len(paths)
for path in paths[:cur_len]:
for child in path[-1][0].children:
if child[0] is not None and child[0] not in trace:
trace.append(child[0])
paths.append(path + [child])
if child[0] == final_node:
return path
paths = paths[cur_len:]