2024-07-10 20:08:18 +02:00
|
|
|
import pygame
|
|
|
|
import numpy as np
|
|
|
|
from scripts.tiles import Tilemap
|
2024-07-13 15:29:03 +02:00
|
|
|
from scripts.entities import Entity, Partner, GroupEntities
|
2024-07-17 00:08:42 +02:00
|
|
|
from scripts.utils import load_image, load_images, to_isometric_pixel, Button, change_status, to_cartesian, TILE_DICT
|
|
|
|
from scripts.camera import Camera, CameraPlayerLess
|
2024-07-10 20:08:18 +02:00
|
|
|
|
|
|
|
# SETTINGS
|
|
|
|
WIDTH = 1280
|
|
|
|
HEIGHT = 720
|
|
|
|
TITLE = 'YuGiOh Tag Force Clone'
|
2024-07-17 00:08:42 +02:00
|
|
|
RENDER_SCALE = 2
|
2024-07-10 20:08:18 +02:00
|
|
|
|
|
|
|
class Game:
|
|
|
|
def __init__(self):
|
|
|
|
pygame.init()
|
|
|
|
self.screen = pygame.display.set_mode((WIDTH, HEIGHT))
|
2024-07-17 00:08:42 +02:00
|
|
|
self.display = pygame.Surface((WIDTH//RENDER_SCALE, HEIGHT//RENDER_SCALE))
|
2024-07-10 20:08:18 +02:00
|
|
|
|
|
|
|
pygame.display.set_caption(TITLE)
|
|
|
|
self.clock = pygame.time.Clock()
|
2024-07-13 20:10:33 +02:00
|
|
|
def iso_render(self):
|
|
|
|
self.display.fill('white')
|
|
|
|
self.tilemap.render(self.display, offset = self.camera.scroll)
|
|
|
|
self.entities.render(self.display, offset = self.camera.scroll)
|
|
|
|
#self.player.render(self.display, offset = self.camera.scroll)
|
|
|
|
#self.partner.render(self.display, offset = self.camera.scroll)
|
|
|
|
self.screen.blit(pygame.transform.scale(self.display,self.screen.get_size()), (0,0))
|
|
|
|
pygame.display.update()
|
|
|
|
def iso_game(self):
|
2024-07-12 22:04:31 +02:00
|
|
|
self.player = Entity(self, 'player', (64., 64.), (28, 42))
|
2024-07-13 15:29:03 +02:00
|
|
|
self.partner = Partner(self, (80.,80.), (28,42))
|
|
|
|
self.entities = GroupEntities(self, [self.player, self.partner])
|
2024-07-10 20:08:18 +02:00
|
|
|
self.assets = {
|
|
|
|
'player' : load_image('entities/player.png'),
|
2024-07-13 15:29:03 +02:00
|
|
|
'partner': load_image('entities/partner.png'),
|
2024-07-12 16:56:47 +02:00
|
|
|
#'grass' : load_images('tiles/grass/'),
|
|
|
|
#'stone' : load_images('tiles/stone/')
|
|
|
|
'iso' : load_images('tiles/iso/')
|
2024-07-10 20:08:18 +02:00
|
|
|
}
|
2024-07-17 18:01:42 +02:00
|
|
|
self.tilemap = Tilemap(self, (64,32), 'map_2.csv')
|
2024-07-12 22:04:31 +02:00
|
|
|
self.camera = Camera(self)
|
2024-07-13 20:10:33 +02:00
|
|
|
while self.status == 'iso_game':
|
2024-07-10 20:08:18 +02:00
|
|
|
delta = np.array([0.0,0.0])
|
|
|
|
for event in pygame.event.get():
|
|
|
|
if event.type == pygame.QUIT:
|
2024-07-13 20:10:33 +02:00
|
|
|
self.status = 'quit'
|
2024-07-10 20:08:18 +02:00
|
|
|
keys = pygame.key.get_pressed()
|
|
|
|
if keys[pygame.K_LEFT]:
|
2024-07-13 15:29:03 +02:00
|
|
|
delta += np.array([-5,5])
|
2024-07-10 20:08:18 +02:00
|
|
|
if keys[pygame.K_RIGHT]:
|
2024-07-13 15:29:03 +02:00
|
|
|
delta += np.array([5,-5])
|
2024-07-10 20:08:18 +02:00
|
|
|
if keys[pygame.K_UP]:
|
2024-07-13 15:29:03 +02:00
|
|
|
delta += np.array([-5,-5])
|
2024-07-10 20:08:18 +02:00
|
|
|
if keys[pygame.K_DOWN]:
|
2024-07-13 15:29:03 +02:00
|
|
|
delta += np.array([5,5])
|
|
|
|
|
2024-07-12 22:04:31 +02:00
|
|
|
self.camera.update()
|
|
|
|
self.player.update(self.tilemap, delta)
|
2024-07-13 15:29:03 +02:00
|
|
|
self.partner.update()
|
2024-07-13 20:10:33 +02:00
|
|
|
self.iso_render()
|
2024-07-10 20:08:18 +02:00
|
|
|
self.clock.tick(60)
|
2024-07-13 20:10:33 +02:00
|
|
|
def menu(self):
|
|
|
|
buttons = [
|
|
|
|
Button(self,[100,100],[300,90],'Start Isometric',(lambda: change_status(self,'iso_game'))),
|
|
|
|
Button(self,[100,200],[300,90],'Level Editor',(lambda: change_status(self,'level_editor'))),
|
|
|
|
Button(self,[100,300],[300,90],'Quit',(lambda: change_status(self,'quit')))
|
|
|
|
]
|
|
|
|
while self.status == 'menu':
|
|
|
|
for event in pygame.event.get():
|
|
|
|
if event.type == pygame.QUIT:
|
|
|
|
self.status = 'quit'
|
|
|
|
self.screen.fill('gray')
|
|
|
|
for button in buttons:
|
|
|
|
button.process()
|
|
|
|
pygame.display.update()
|
2024-07-17 00:08:42 +02:00
|
|
|
self.clock.tick(60)
|
|
|
|
def level_editor(self):
|
|
|
|
self.assets = {
|
|
|
|
'iso' : load_images('tiles/iso/')
|
|
|
|
}
|
|
|
|
self.tilemap = Tilemap(self, (64,32),'map_2.csv')
|
|
|
|
self.camera = CameraPlayerLess(self)
|
|
|
|
self.tile_list = list(self.assets)
|
|
|
|
self.tile_sel = 0
|
|
|
|
while self.status == 'level_editor':
|
|
|
|
click, r_click = False, False
|
|
|
|
scrollup,scrolldown = False, False
|
|
|
|
delta = np.array([0.0,0.0])
|
|
|
|
for event in pygame.event.get():
|
|
|
|
if event.type == pygame.QUIT:
|
|
|
|
self.status = 'quit'
|
|
|
|
if event.type == pygame.MOUSEBUTTONDOWN and event.button == 4:
|
|
|
|
scrollup = True
|
|
|
|
if event.type == pygame.MOUSEBUTTONDOWN and event.button == 5:
|
|
|
|
scrolldown = True
|
|
|
|
keys = pygame.key.get_pressed()
|
|
|
|
mouse_butt = pygame.mouse.get_pressed(num_buttons = 5)
|
|
|
|
if keys[pygame.K_LEFT]:
|
|
|
|
delta += np.array([-5,0])
|
|
|
|
if keys[pygame.K_RIGHT]:
|
|
|
|
delta += np.array([5,0])
|
|
|
|
if keys[pygame.K_UP]:
|
|
|
|
delta += np.array([0,-5])
|
|
|
|
if keys[pygame.K_DOWN]:
|
|
|
|
delta += np.array([0,5])
|
2024-07-17 18:01:42 +02:00
|
|
|
if keys[pygame.K_o]:
|
|
|
|
self.tilemap.save('map_2.csv')
|
|
|
|
if keys[pygame.K_l]:
|
|
|
|
self.tilemap.load_map('map_2.csv')
|
2024-07-17 00:08:42 +02:00
|
|
|
if mouse_butt[0]: #on left click
|
|
|
|
click = True
|
|
|
|
if mouse_butt[2]: #on right click
|
|
|
|
r_click = True
|
|
|
|
if scrollup: #on scroll up(maybe)
|
|
|
|
self.tile_sel = ((self.tile_sel - 1) % len(TILE_DICT))
|
|
|
|
if scrolldown: #on scroll down(maybe)
|
|
|
|
self.tile_sel = ((self.tile_sel + 1) % len(TILE_DICT))
|
|
|
|
|
|
|
|
mpos = np.array(pygame.mouse.get_pos()) / RENDER_SCALE
|
|
|
|
pos = np.array(to_cartesian(mpos + self.camera.scroll,self.tilemap.tile_size),dtype=int)
|
2024-07-17 12:24:04 +02:00
|
|
|
|
|
|
|
if click and np.all(pos >= 0):
|
|
|
|
self.tilemap.add_tile(pos, {'type' : TILE_DICT[self.tile_sel][0], 'variant' : TILE_DICT[self.tile_sel][1], 'walkable': TILE_DICT[self.tile_sel][2]})
|
|
|
|
if r_click and np.all(pos >= 0):
|
|
|
|
self.tilemap.add_tile(pos, {'type' : TILE_DICT[0][0], 'variant' : TILE_DICT[0][1], 'walkable': TILE_DICT[0][2]})
|
2024-07-17 00:08:42 +02:00
|
|
|
|
|
|
|
current_tile_img = self.assets[TILE_DICT[self.tile_sel][0]][TILE_DICT[self.tile_sel][1]].copy()
|
|
|
|
current_tile_img.set_alpha(100)
|
|
|
|
|
|
|
|
self.camera.update(delta)
|
|
|
|
self.display.fill('white')
|
|
|
|
self.tilemap.render(self.display, offset = self.camera.scroll)
|
|
|
|
self.display.blit(current_tile_img, to_isometric_pixel(pos)*self.tilemap.tile_size-self.camera.scroll)
|
|
|
|
self.screen.blit(pygame.transform.scale(self.display,self.screen.get_size()), (0,0))
|
|
|
|
pygame.display.update()
|
|
|
|
|
2024-07-13 20:10:33 +02:00
|
|
|
self.clock.tick(60)
|
|
|
|
def run(self):
|
|
|
|
self.status = 'menu'
|
|
|
|
while self.status != 'quit':
|
|
|
|
if self.status == 'menu':
|
|
|
|
self.menu()
|
|
|
|
if self.status == 'iso_game':
|
|
|
|
self.iso_game()
|
|
|
|
if self.status == 'level_editor':
|
|
|
|
self.level_editor()
|
2024-07-10 20:08:18 +02:00
|
|
|
pygame.quit()
|
|
|
|
|
|
|
|
Game().run()
|