2022-04-03 15:47:41 +02:00
|
|
|
import pygame as pg
|
2022-04-04 11:40:18 +02:00
|
|
|
import pygame.image
|
|
|
|
from settings import *
|
2022-04-03 15:47:41 +02:00
|
|
|
from random import uniform
|
|
|
|
from map import collide_hit_rect
|
|
|
|
|
|
|
|
vec = pg.math.Vector2
|
|
|
|
|
|
|
|
|
|
|
|
def collide_with_walls(sprite, group, dir):
|
|
|
|
if dir == 'x':
|
|
|
|
hits = pg.sprite.spritecollide(sprite, group, False, collide_hit_rect)
|
|
|
|
if hits:
|
|
|
|
if hits[0].rect.centerx > sprite.hit_rect.centerx:
|
|
|
|
sprite.pos.x = hits[0].rect.left - sprite.hit_rect.width / 2
|
|
|
|
if hits[0].rect.centerx < sprite.hit_rect.centerx:
|
|
|
|
sprite.pos.x = hits[0].rect.right + sprite.hit_rect.width / 2
|
|
|
|
sprite.vel.x = 0
|
|
|
|
sprite.hit_rect.centerx = sprite.pos.x
|
|
|
|
if dir == 'y':
|
|
|
|
hits = pg.sprite.spritecollide(sprite, group, False, collide_hit_rect)
|
|
|
|
if hits:
|
|
|
|
if hits[0].rect.centery > sprite.hit_rect.centery:
|
|
|
|
sprite.pos.y = hits[0].rect.top - sprite.hit_rect.height / 2
|
|
|
|
if hits[0].rect.centery < sprite.hit_rect.centery:
|
|
|
|
sprite.pos.y = hits[0].rect.bottom + sprite.hit_rect.height / 2
|
|
|
|
sprite.vel.y = 0
|
|
|
|
sprite.hit_rect.centery = sprite.pos.y
|
|
|
|
|
|
|
|
class Player(pg.sprite.Sprite):
|
|
|
|
def __init__(self, game, x, y):
|
|
|
|
self.groups = game.all_sprites
|
|
|
|
pg.sprite.Sprite.__init__(self, self.groups)
|
|
|
|
self.game = game
|
|
|
|
self.image = game.player_img
|
|
|
|
self.rect = self.image.get_rect()
|
2022-04-04 11:40:18 +02:00
|
|
|
self.rect.center = (x,y)
|
|
|
|
self.hit_rect = PLAYER_HIT_RECT
|
|
|
|
self.hit_rect.center = self.rect.center
|
2022-04-03 15:47:41 +02:00
|
|
|
self.vel = vec(0, 0)
|
|
|
|
self.pos = vec(x, y)
|
|
|
|
self.rot = 0
|
2022-04-04 11:40:18 +02:00
|
|
|
|
2022-04-03 15:47:41 +02:00
|
|
|
|
|
|
|
def get_keys(self):
|
|
|
|
self.rot_speed = 0
|
|
|
|
self.vel = vec(0, 0)
|
|
|
|
keys = pg.key.get_pressed()
|
|
|
|
if keys[pg.K_LEFT] or keys[pg.K_a]:
|
|
|
|
self.rot_speed = PLAYER_ROT_SPEED
|
|
|
|
if keys[pg.K_RIGHT] or keys[pg.K_d]:
|
|
|
|
self.rot_speed = -PLAYER_ROT_SPEED
|
|
|
|
if keys[pg.K_UP] or keys[pg.K_w]:
|
|
|
|
self.vel = vec(PLAYER_SPEED, 0).rotate(-self.rot)
|
|
|
|
if keys[pg.K_DOWN] or keys[pg.K_s]:
|
|
|
|
self.vel = vec(-PLAYER_SPEED / 2, 0).rotate(-self.rot)
|
|
|
|
|
|
|
|
|
|
|
|
def update(self):
|
|
|
|
self.get_keys()
|
|
|
|
self.rot = (self.rot + self.rot_speed * self.game.dt) % 360
|
|
|
|
self.image = pg.transform.rotate(self.game.player_img, self.rot)
|
|
|
|
self.rect = self.image.get_rect()
|
|
|
|
self.rect.center = self.pos
|
|
|
|
self.pos += self.vel * self.game.dt
|
|
|
|
self.hit_rect.centerx = self.pos.x
|
|
|
|
collide_with_walls(self, self.game.walls, 'x')
|
|
|
|
self.hit_rect.centery = self.pos.y
|
|
|
|
collide_with_walls(self, self.game.walls, 'y')
|
|
|
|
self.rect.center = self.hit_rect.center
|
|
|
|
|
2022-04-04 11:40:18 +02:00
|
|
|
class Dump(pg.sprite.Sprite):
|
|
|
|
# wysypisko
|
|
|
|
def __init__(self):
|
|
|
|
super().__init__()
|
|
|
|
self.glass = []
|
|
|
|
self.paper = []
|
|
|
|
self.bio = []
|
|
|
|
self.other_trash = []
|
|
|
|
class trash(pg.sprite.Sprite):
|
|
|
|
|
|
|
|
def __init__(self,x,y,img, type):
|
|
|
|
super().__init__()
|
|
|
|
|
|
|
|
self.width=16
|
|
|
|
self.height=16
|
|
|
|
|
|
|
|
self.type = type
|
|
|
|
|
|
|
|
self.x = x
|
|
|
|
self.y = y
|
|
|
|
|
|
|
|
self.image = pygame.image.load(img)
|
|
|
|
self.image = pygame.transform.scale(self.image, (self.x,self.y))
|
|
|
|
self.rect = self.image.get_rect()
|
|
|
|
class trashbin(pg.sprite.Sprite):
|
|
|
|
|
|
|
|
def __init__(self,x,y,img, type):
|
|
|
|
super().__init__()
|
|
|
|
|
|
|
|
# trashbin type
|
|
|
|
self.type = type
|
|
|
|
|
|
|
|
# dimensions
|
|
|
|
if type == "small":
|
|
|
|
self.width = 4
|
|
|
|
self.height = 4
|
|
|
|
elif type == "medium":
|
|
|
|
self.width = 8
|
|
|
|
self.height = 8
|
|
|
|
elif type == "large":
|
|
|
|
self.width = 16
|
|
|
|
self.height = 16
|
|
|
|
|
|
|
|
# spawn coords
|
|
|
|
self.x = x
|
|
|
|
self.y = y
|
|
|
|
|
|
|
|
# load trashbin image
|
|
|
|
self.image = pygame.image.load(img)
|
|
|
|
self.image = pygame.transform.scale(self.image, (self.x,self.y))
|
|
|
|
self.rect = self.image.get_rect()
|
|
|
|
|
|
|
|
class trashmaster(pg.sprite.Sprite):
|
|
|
|
|
|
|
|
def __init__(self,x,y,img):
|
|
|
|
super().__init__()
|
|
|
|
|
|
|
|
self.width=x
|
|
|
|
self.height=y
|
|
|
|
|
|
|
|
self.x = 0
|
|
|
|
self.y = 0
|
|
|
|
|
|
|
|
self.image = pygame.image.load(img)
|
|
|
|
self.image = pygame.transform.scale(self.image, (self.width,self.height))
|
|
|
|
self.rect = self.image.get_rect()
|
|
|
|
|
|
|
|
def movement(self, key, vel):
|
|
|
|
if key == pygame.K_LEFT:
|
|
|
|
self.x -= vel
|
|
|
|
|
|
|
|
if key == pygame.K_RIGHT:
|
|
|
|
self.x += vel
|
|
|
|
|
|
|
|
if key == pygame.K_UP:
|
|
|
|
self.y -= vel
|
|
|
|
|
|
|
|
if key == pygame.K_DOWN:
|
|
|
|
self.y += vel
|
|
|
|
return (self.x, self.y)
|
2022-04-03 15:47:41 +02:00
|
|
|
|
|
|
|
class Obstacle(pg.sprite.Sprite):
|
|
|
|
def __init__(self, game, x, y, w, h):
|
|
|
|
self.groups = game.walls
|
|
|
|
pg.sprite.Sprite.__init__(self, self.groups)
|
|
|
|
self.game = game
|
|
|
|
self.rect = pg.Rect(x, y, w, h)
|
|
|
|
self.hit_rect = self.rect
|
|
|
|
self.x = x
|
|
|
|
self.y = y
|
|
|
|
self.rect.x = x
|
2022-04-04 11:40:18 +02:00
|
|
|
self.rect.y = y
|