import pygame import numpy as np from scripts.tiles import Tilemap from scripts.entities import Entity, Partner, GroupEntities from scripts.utils import load_image, load_images, to_isometric_pixel, Button, change_status, to_cartesian, TILE_DICT from scripts.camera import Camera, CameraPlayerLess # SETTINGS WIDTH = 1280 HEIGHT = 720 TITLE = 'YuGiOh Tag Force Clone' RENDER_SCALE = 2 class Game: def __init__(self): pygame.init() self.screen = pygame.display.set_mode((WIDTH, HEIGHT)) self.display = pygame.Surface((WIDTH//RENDER_SCALE, HEIGHT//RENDER_SCALE)) pygame.display.set_caption(TITLE) self.clock = pygame.time.Clock() 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): self.player = Entity(self, 'player', (64., 64.), (28, 42)) self.partner = Partner(self, (80.,80.), (28,42)) self.entities = GroupEntities(self, [self.player, self.partner]) self.assets = { 'player' : load_image('entities/player.png'), 'partner': load_image('entities/partner.png'), #'grass' : load_images('tiles/grass/'), #'stone' : load_images('tiles/stone/') 'iso' : load_images('tiles/iso/') } self.tilemap = Tilemap(self, (64,32), 'map_1.csv') self.camera = Camera(self) while self.status == 'iso_game': delta = np.array([0.0,0.0]) for event in pygame.event.get(): if event.type == pygame.QUIT: self.status = 'quit' keys = pygame.key.get_pressed() if keys[pygame.K_LEFT]: delta += np.array([-5,5]) if keys[pygame.K_RIGHT]: delta += np.array([5,-5]) if keys[pygame.K_UP]: delta += np.array([-5,-5]) if keys[pygame.K_DOWN]: delta += np.array([5,5]) self.camera.update() self.player.update(self.tilemap, delta) self.partner.update() self.iso_render() self.clock.tick(60) 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() 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]) 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) if click: self.tilemap.tilemap[*pos] = {'type' : TILE_DICT[self.tile_sel][0], 'variant' : TILE_DICT[self.tile_sel][1], 'pos': pos, 'walkable': TILE_DICT[self.tile_sel][2]} 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() 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() pygame.quit() Game().run()