import pygame from pygame.locals import * from Classes.Game.Cards.MonsterCard import MonsterCard from Classes.System.Components.Window import Window from Classes.System.Components.InputHandler import InputHandler from Classes.Game.World import World from Classes.System.Network.TCPClient import TCPClient from Classes.Game.Events.Login import Login from Classes.Game.Events.PlaceCard import PlaceCard from Classes.Game.Player import Player from Classes.Game.Cards.Card import Card from Classes.System.Utils.Path import PathUtil class App: __window:Window __running:bool = True __FPS = 60 __clock = pygame.time.Clock() __myFont:pygame.font __world:World __inputHandler: InputHandler __tcpClient: TCPClient def __init__(self, width:int=1920, height:int=1080, title:str="default title"): pygame.font.init() self.__myFont = pygame.font.SysFont('Comic Sans MS', 30) self.__window = Window(width=width, height=height, title=title) self.__inputHandler = InputHandler() self.selectedCard = None # game word self.__world = World(self.__window.getScreen()) try: self.__tcpClient = TCPClient("127.0.0.1", "54322", self.__world, self.__inputHandler) Login(self.__tcpClient) # will login to the server except Exception as e: print(f"failed to login due to error {e}") print("server connection failed or got refused") pass self.startGameLoop() self.onCleanup() def startGameLoop(self): # create sprite groups # todo: remove these and let server handle card creation instead # blocker: server - client communication [WIP] # self.__world.spawnCard(PathUtil.getAbsolutePathTo("Assets/Cards/1/"), pygame.Vector2(500, 1050), self.__inputHandler, Player(1000, 0, "test")) # self.__world.spawnCard(PathUtil.getAbsolutePathTo("Assets/Cards/1/"), pygame.Vector2(600, 1050), self.__inputHandler, Player(1000, 0, "test")) # self.__world.spawnCard(PathUtil.getAbsolutePathTo("Assets/Cards/1/"), pygame.Vector2(700, 1050), self.__inputHandler, Player(1000, 0, "test")) # self.__world.spawnCard(PathUtil.getAbsolutePathTo("Assets/Cards/1/"), pygame.Vector2(800, 1050), self.__inputHandler, Player(1000, 0, "test")) # self.__world.spawnCard(PathUtil.getAbsolutePathTo("Assets/Cards/1/"), pygame.Vector2(900, 1050), self.__inputHandler, Player(1000, 0, "test")) # self.__world.spawnCard(PathUtil.getAbsolutePathTo("Assets/Cards/1/"), pygame.Vector2(1000, 1050), self.__inputHandler, Player(1000, 0, "test")) while self.__running: self.__clock.tick(self.__FPS) self.__window.getScreen().fill((0,0,0)) # render world self.__window.drawWorld(self.__world) # updates all cards inside the cards Spritegroup at each step the gameloops does self.__world.getCards().update() self.__world.getHandCards().update() # draw groups self.__window.drawSpriteGroup(self.__world.getCards()) self.__window.drawSpriteGroup(self.__world.getHandCards()) # event handler self.handleEvent(pygame.event.get()) # emits update to the game pygame.display.update() # handles incoming event queue def handleEvent(self, events): # TODO: fix bug that stacks cards when dragging them around try: for event in events: if event.type == pygame.QUIT: self.onCleanup() elif self.__inputHandler.getMousePressed()[0]: for card in self.__world.getCards(): if card.getDragable() == True: if card.rect.collidepoint(self.__inputHandler.getMousePos()): #self.__logger.info(f"dragging card {card}") self.selectedCard = card # failsafe to prevent NoneType errors if self.selectedCard != None: #self.__logger.info(f"working with card: {self.selectedCard}") self.selectedCard.setDragging(True) elif event.type == pygame.MOUSEBUTTONUP: print("left mousebutton") if event.button == 1: if self.selectedCard != None: self.selectedCard.setDragging(False) print(self.selectedCard) for field in self.__world.getBoardFields(): print(f"checking field {field} is field mathinc? {field.getRect().collidepoint(self.__inputHandler.getMousePos())}") if field.getRect().collidepoint(self.__inputHandler.getMousePos()): print(f"is position valid? {field.getSide() == 'Player' and field.getType() == self.selectedCard.getType()} ") print(f"side {field.getSide()} fieldtype {field.getType()} card type {self.selectedCard.getType()}") if field.getSide() == "Player" and field.getType() == self.selectedCard.getType(): print(f"found field {field}") try: print(f"placing card {self.selectedCard} in field {field}") # snap card into the correct field self.selectedCard.rect.center = field.rect.center self.selectedCard.setDragging(False) print(self.selectedCard) # TODO: adapt this into the new game engine version PlaceCard(self.__tcpClient, self.selectedCard, self.__world.getPlayer()) # tells te server that the player placed this card self.selectedCard = None except Exception as e: print(f"failed to place card on server due to error: {e}") if self.selectedCard != None: self.selectedCard = None else: raise ValueError("selected card in event handler was found empty this should never happen!") pass except: pass # sets the running state for the gameloop def setRunning(self, running:bool): self.__running = running # ensures the gameloop stops running and the pygame instance is stopped properly def onCleanup(self): self.__running = False pygame.quit()