36 lines
1.5 KiB
Python
36 lines
1.5 KiB
Python
import pygame
|
|
import numpy as np
|
|
from scripts.utils import to_isometric_pixel
|
|
|
|
class Entity:
|
|
def __init__(self, game, e_type, pos, size):
|
|
self.game = game
|
|
self.type = e_type
|
|
self.pos = np.array(pos)
|
|
self.size = np.array(size)
|
|
self.velocity = np.array([0,0], dtype=np.float32)
|
|
def update(self, tilemap, movement = np.array([0,0])):
|
|
frame_movement = self.velocity + movement
|
|
self.pos[0] += frame_movement[0]
|
|
entity_rect = self.rect()
|
|
for rect in tilemap.physics_rects_around(self.pos):
|
|
if entity_rect.colliderect(rect):
|
|
if frame_movement[0] > 0: #i was moving right
|
|
entity_rect.right = rect.left
|
|
if frame_movement[0] < 0: #i was moving left
|
|
entity_rect.left = rect.right
|
|
self.pos[0] = entity_rect.x
|
|
self.pos[1] += frame_movement[1]
|
|
entity_rect = self.rect()
|
|
for rect in tilemap.physics_rects_around(self.pos):
|
|
if entity_rect.colliderect(rect):
|
|
if frame_movement[1] > 0: #i was moving down
|
|
entity_rect.bottom = rect.top
|
|
if frame_movement[1] < 0: #i was moving up
|
|
entity_rect.top = rect.bottom
|
|
self.pos[1] = entity_rect.y
|
|
def render(self, surface, offset = np.array([0.,0.])):
|
|
surface.blit(self.game.assets[self.type], to_isometric_pixel(self.pos-np.array([48,80]))*np.array([1,0.5])-offset)
|
|
def rect(self):
|
|
return pygame.Rect(self.pos, self.size)
|