DSZI_Survival/src/game/EventManager.py

122 lines
4.5 KiB
Python
Raw Normal View History

2020-04-26 03:59:09 +02:00
from random import Random
2020-04-06 13:42:56 +02:00
from time import sleep
2020-04-02 17:30:25 +02:00
import pygame
from src.entities.Interactable import Interactable
2020-04-06 00:40:16 +02:00
from src.entities.Pickupable import Pickupable
2020-04-25 22:02:21 +02:00
from src.entities.Player import Movement
2020-04-04 21:33:39 +02:00
2020-04-05 14:49:37 +02:00
# Player can move every given milliseconds
TIMEOUT = 100
2020-03-31 21:47:09 +02:00
class EventManager:
2020-04-05 14:49:37 +02:00
keyTimeout = 0
#self.game.map
2020-04-04 21:33:39 +02:00
def __init__(self, gameObject, player):
2020-04-02 17:30:25 +02:00
self.game = gameObject
2020-04-04 21:33:39 +02:00
self.player = player
2020-04-05 14:49:37 +02:00
self.keyTimer = pygame.time.Clock()
self.turnOff = False
2020-04-04 21:33:39 +02:00
# Player controls
# TODO
def loadKeyboardSettings(self):
pass
2020-04-02 17:30:25 +02:00
def handleEvents(self):
2020-04-04 21:33:39 +02:00
pygame.event.pump()
if self.turnOff:
sleep(5)
exit(0)
self.game.screen.ui.updateTime()
2020-04-05 23:57:53 +02:00
2020-04-04 21:33:39 +02:00
keys = pygame.key.get_pressed()
2020-04-02 17:30:25 +02:00
for event in pygame.event.get():
if event.type == pygame.QUIT:
self.game.running = False
if event.type == pygame.MOUSEBUTTONUP:
pos = pygame.mouse.get_pos()
# get a list of all sprites that are under the mouse cursor
clicked_collidables = [s for s in self.game.map.collidables if s.rect.collidepoint(pos)]
# do something with the clicked sprites...
if len(clicked_collidables) > 0:
self.game.movement.gotoToTarget(Random().choice(clicked_collidables))
else:
clicked_terrains = [tile for tile in self.game.map.terrainTilesList if tile.rect.collidepoint(pos)]
if len(clicked_terrains) > 0:
print("Terrains under clik:")
for terrain in clicked_terrains:
print(terrain)
else:
print("NO TERRAIN FOUND UNDER CLICK")
self.game.screen.ui.updateBasedOnPygameEvent(event)
2020-04-05 14:49:37 +02:00
self.keyTimeout += self.keyTimer.tick()
if self.keyTimeout >= TIMEOUT:
2020-04-06 13:42:56 +02:00
if self.player.alive:
self.handlePlayerControls(keys)
self.keyTimeout = 0
else:
self.game.screen.ui.updateOnDeath(self.player)
self.turnOff = True
2020-04-04 21:33:39 +02:00
self.game.screen.ui.updateBarsBasedOnPlayerStats(self.player.statistics)
2020-04-04 21:33:39 +02:00
def handlePlayerControls(self, keys):
# Key names are temporary
# TODO: Load key bindings from JSON
2020-04-06 13:42:56 +02:00
# Picking up items
if keys[pygame.K_SPACE]:
object = self.game.map.getEntityOnCoord(self.player.getFacingCoord())
# Picked up item gets removed from the map
if type(object) is Pickupable:
object.on_interaction(self.player)
self.game.screen.ui.updateOnPlayerPickup(self.player.statistics, object)
self.game.map.removeSpriteFromMap(object)
elif type(object) is Interactable:
object.on_interaction(self.player)
self.game.screen.ui.updateOnPlayerInteraction(self.player.statistics, object)
2020-04-06 13:42:56 +02:00
# Movement
2020-04-25 22:02:21 +02:00
# if keys[pygame.K_w]:
# self.player.rotate(Rotations.NORTH)
# if not self.game.map.collision(self.player.rect.x, self.player.rect.y - self.player.rect.w):
# self.player.move(Rotations.NORTH)
# if keys[pygame.K_s]:
# self.player.rotate(Rotations.SOUTH)
# if not self.game.map.collision(self.player.rect.x, self.player.rect.y + self.player.rect.w):
# self.player.move(Rotations.SOUTH)
# if keys[pygame.K_d]:
# self.player.rotate(Rotations.EAST)
# if not self.game.map.collision(self.player.rect.x + self.player.rect.w, self.player.rect.y):
# self.player.move(Rotations.EAST)
# if keys[pygame.K_a]:
# self.player.rotate(Rotations.WEST)
# if not self.game.map.collision(self.player.rect.x - self.player.rect.w, self.player.rect.y):
# self.player.move(Rotations.WEST)
2020-04-06 13:42:56 +02:00
if keys[pygame.K_w]:
2020-04-25 22:02:21 +02:00
# TODO: Collision ckecks
self.player.move(Movement.FORWARD)
2020-04-06 13:42:56 +02:00
if keys[pygame.K_a]:
2020-04-25 22:02:21 +02:00
self.player.move(Movement.ROTATE_L)
if keys[pygame.K_d]:
self.player.move(Movement.ROTATE_R)
2020-04-04 21:33:39 +02:00
# Pick random target for A* algorithm
2020-04-26 03:59:09 +02:00
if keys[pygame.K_u]:
while True:
try:
self.game.movement.gotoToTarget(Random().choice(self.game.map.entities))
break
except IndexError:
pass
2020-04-05 20:20:37 +02:00