2024-07-10 20:08:18 +02:00
|
|
|
import pygame
|
|
|
|
import os
|
2024-07-12 16:56:47 +02:00
|
|
|
import numpy as np
|
2024-07-10 20:08:18 +02:00
|
|
|
TILE_DICT = {
|
2024-07-12 22:04:31 +02:00
|
|
|
1 : ('iso',0,True),
|
|
|
|
2 : ('iso',1,False),
|
|
|
|
3 : ('iso',2,False),
|
|
|
|
4 : ('iso',3,False),
|
|
|
|
5 : ('iso',4,False),
|
|
|
|
6 : ('iso',5,False)
|
2024-07-10 20:08:18 +02:00
|
|
|
}
|
|
|
|
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
|
2024-07-12 16:56:47 +02:00
|
|
|
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]))
|
2024-07-13 15:29:03 +02:00
|
|
|
|
|
|
|
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)]
|
|
|
|
|
2024-07-13 20:10:33 +02:00
|
|
|
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)
|