import pygame import os import numpy as np TILE_DICT = { 1 : ('iso',0,True), 2 : ('iso',1,False), 3 : ('iso',2,False), 4 : ('iso',3,False), 5 : ('iso',4,False), 6 : ('iso',5,False) } BASE_IMG_PATH = 'data/images/' def load_image(path): img = pygame.image.load(BASE_IMG_PATH + path).convert() img.set_colorkey((0,0,0)) return img def load_images(path): images = [] for img_name in sorted(os.listdir(BASE_IMG_PATH + path)): images.append(load_image(path + '/' + img_name)) return images def to_isometric(coord, tilesize): #(1,0) -> (+tilesize[0]/2,+tilesize[1]/2) #(0,1) -> (-tilesize[0]/2,+tilesize[1]/2) #a must be (+tilesize[0]/2,-tilesize[0]/2) # (+tilesize[1]/2,+tilesize[1]/2) a = np.array([[1,-1],[1,1]]) a = 0.5 * a * tilesize[:,np.newaxis] return np.squeeze(np.matmul(a,coord[:,np.newaxis])) def to_cartesian(coord, tilesize): #manually calculated the inverse of a in to_isometric a = np.array([[1,1],[-1,1]]) a = a * (1/tilesize) return np.squeeze(np.matmul(a,coord[:,np.newaxis])) def to_isometric_pixel(coord): a = np.array([[1,-1],[1,1]]) a = 0.5 * a return np.squeeze(np.matmul(a,coord[:,np.newaxis])) class Animation: def __init__(self, images, img_dur=5, loop=True): self.images = images self.img_duration = img_dur self.loop = loop self.done = False self.frame = 0 #in the sense of gameframe, not current frame of the animation def copy(self): return Animation(self.images, self.img_duration, self.loop) def update(self): if self.loop: self.frame = (self.frame + 1) % (self.img_duration * len(self.images)) else: self.frame = min(self.frame + 1, self.img_duration * len(self.images) - 1) if self.frame >= self.img_duration * len(self.images) - 1: self.done = True def img(self): return self.images[int(self.frame / self.img_duration)] def change_status(game,new_status): game.status = new_status class Button: def __init__(self, game, pos, size, buttonText='Button', onclickFunction=None, onePress=False): self.game = game self.pos = np.array(pos) self.size = np.array(size) self.onclickFunction = onclickFunction self.onePress = onePress self.alreadyPressed = False self.fillColors = { 'normal': '#ffffff', 'hover': '#666666', 'pressed': '#333333', } #font = pygame.font.SysFont('Arial', 40) self.buttonSurface = pygame.Surface(self.size) self.buttonRect = pygame.Rect(self.pos, self.size) self.buttonSurf = pygame.font.SysFont('Arial', 40).render(buttonText, True, (20, 20, 20)) def process(self): mousePos = pygame.mouse.get_pos() self.buttonSurface.fill(self.fillColors['normal']) if self.buttonRect.collidepoint(mousePos): self.buttonSurface.fill(self.fillColors['hover']) if pygame.mouse.get_pressed(num_buttons=3)[0]: self.buttonSurface.fill(self.fillColors['pressed']) if self.onePress: self.onclickFunction() elif not self.alreadyPressed: self.onclickFunction() self.alreadyPressed = True else: self.alreadyPressed = False self.buttonSurface.blit(self.buttonSurf, [ self.buttonRect.width/2 - self.buttonSurf.get_rect().width/2, self.buttonRect.height/2 - self.buttonSurf.get_rect().height/2 ]) self.game.screen.blit(self.buttonSurface, self.buttonRect)