From 39e07e4cb62f226b40b9f1fbf2afd3bd4246d063 Mon Sep 17 00:00:00 2001 From: steev Date: Sun, 17 Dec 2023 20:38:39 +0100 Subject: [PATCH] moved card placing and keeping of cards to world class --- Game Server/Classes/Server.py | 15 ++++- Game Server/index.py | 67 ++----------------- Game_Client/Classes/Objects/Cards/TrapCard.py | 2 +- Game_Client/Classes/Objects/World.py | 13 +++- Game_Client/Classes/System/App.py | 38 +++++------ 5 files changed, 50 insertions(+), 85 deletions(-) diff --git a/Game Server/Classes/Server.py b/Game Server/Classes/Server.py index afd2835..7c06f4b 100644 --- a/Game Server/Classes/Server.py +++ b/Game Server/Classes/Server.py @@ -1,11 +1,13 @@ import json import socket +import threading class Server: __address:str __port:str __socket:socket + __clientThread:threading.Thread def __init__(self, address:str, port:str): self.__address = address @@ -20,6 +22,17 @@ class Server: self.__socket.listen() print(f"server started on: {self.__address}:{self.__port}") + # server loop forwards connection to handleConnection + while True: + # accept incoming connection + # TODO: validate this connection is a valid game connection + client_socket, client_address = self.__socket.accept() + + # create network thread for connection + self.__clientThread = threading.Thread(target=self.handleConnection, args=(client_socket, client_address)) + self.__clientThread.start() + + # handles ticking the game loop server side converting data and passing of to the event handler def handleConnection(self, socket:socket, address): # states that a connection has been established @@ -34,7 +47,7 @@ class Server: # decode message for handling message = data.decode() messageJson = json.loads(message) - + if messageJson["user"] in self.__users: self.handleEvents(messageJson) else: diff --git a/Game Server/index.py b/Game Server/index.py index ecd1315..f66de53 100644 --- a/Game Server/index.py +++ b/Game Server/index.py @@ -1,76 +1,17 @@ -import threading import os -import json -from dotenv import load_dotenv +import dotenv -__users:list - -# TODO: setup tcp service for authorization -def handleConnection(self, socket:socket, address): - # states that a connection has been established - print(f"Connected with {address}") - - # Communication with client - while True: - data = socket.recv(1024) - if not data: - break - - # decode message for handling - message = data.decode() - messageJson = json.loads(message) - if messageJson["user"] in self.__users: - handleEvents(messageJson) - else: - break - - print(f"received message from {address}: {message}") - - # connection is not required anymore and gets closed - socket.close() - print(f"connection closed for {address}") - -def handleEvents(self, event): - # decide which event should be performed - if event["event"] == "login": - pass - elif event["event"] == "join_queue": - # count queue - # move start game if 2 players are in the queue - # remove player from the queue once game starts - pass - elif event["event"] == "leave_queue": - # just remove player from the queue - pass - elif event["event"] == "gameAction": - # pass of to own handler function which handles game logic - pass +from Classes.Server import Server def main(self): - load_dotenv() + dotenv.load_dotenv() # retrieves host data from environment HOST = os.getenv("HOST") PORT = os.getenv("PORT") - self.__users = [] + Server(HOST, PORT) - # create tcp socket - server_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM) - - # make socket bind connection info and listen for connections - - print(f"authorization server online on {HOST}:{PORT}") - - # server loop forwards connection to handleConnection - while True: - # accept incoming connection - # TODO: validate this connection is a valid game connection - client_socket, client_address = server_socket.accept() - - # create network thread for connection - client_thread = threading.Thread(target=handleConnection, args=(client_socket, client_address)) - client_thread.start() if __name__ == "__main__": main() \ No newline at end of file diff --git a/Game_Client/Classes/Objects/Cards/TrapCard.py b/Game_Client/Classes/Objects/Cards/TrapCard.py index ea63bf3..0dce7f6 100644 --- a/Game_Client/Classes/Objects/Cards/TrapCard.py +++ b/Game_Client/Classes/Objects/Cards/TrapCard.py @@ -12,7 +12,7 @@ class TrapCard(pygame.sprite.Sprite): __dragging:bool = False __offset:pygame.Vector2 = pygame.Vector2(0,0) __inputHandler: InputHandler - __type:str = "SpellCard" + __type:str = "TrapCard" image:pygame.image rect:pygame.rect diff --git a/Game_Client/Classes/Objects/World.py b/Game_Client/Classes/Objects/World.py index c436c19..cc3c662 100644 --- a/Game_Client/Classes/Objects/World.py +++ b/Game_Client/Classes/Objects/World.py @@ -1,10 +1,13 @@ import pygame from Classes.Objects.BoardField import BoardField from Classes.System.Components.Label import Label +from Classes.Objects.Cards.MonsterCard import MonsterCard +from Classes.System.Components.InputHandler import InputHandler class World(): __boardFields:list __labels:list + __cards:pygame.sprite.Group() __screen:pygame.surface __cardWidth:int = 150 __cardHeight:int = 200 @@ -13,6 +16,7 @@ class World(): def __init__(self, screen:pygame.surface, cardWidth:int=200, cardHeight:int=250, cardOffset:int=400): self.__boardFields = [] self.__labels = [] + self.__cards = [] self.__screen = screen self.__cardWidth = cardWidth self.__cardHeight = cardHeight @@ -59,6 +63,7 @@ class World(): self.__boardFields.append(BoardField("EnemyMonsterField-"+str(i), "Enemy", "MonsterField", eMonsterPos, "Assets/Cards/Arena/field.png")) self.__boardFields.append(BoardField("EnemySpellTrapField-"+str(i), "Enemy", "EffectField", eEffectPos, "Assets/Cards/Arena/field.png")) + def getBoardFields(self) -> list: return self.__boardFields @@ -69,4 +74,10 @@ class World(): return self.__cardWidth def getCardHeight(self) -> int: - return self.__cardHeight \ No newline at end of file + return self.__cardHeight + + def getCards(self) -> pygame.sprite.Group: + return self.__cards + + def spawnCard(self, asset:str, pos:pygame.Vector2, inputHandler:InputHandler) -> MonsterCard: + self.__cards.add(MonsterCard(pos, asset, inputHandler)) \ No newline at end of file diff --git a/Game_Client/Classes/System/App.py b/Game_Client/Classes/System/App.py index 3189b74..3603a62 100644 --- a/Game_Client/Classes/System/App.py +++ b/Game_Client/Classes/System/App.py @@ -31,21 +31,14 @@ class App: def startGameLoop(self): # create sprite groups - self.cards = pygame.sprite.Group() - - # ui trial assets - testMonsterCard = MonsterCard(pygame.Vector2(500, 1050), "Assets/Cards/MonsterCards/testmonstercard/", self.__inputHandler) - testMonsterCard1 = MonsterCard(pygame.Vector2(600, 1050), "Assets/Cards/MonsterCards/testmonstercard/", self.__inputHandler) - testMonsterCard2 = MonsterCard(pygame.Vector2(700, 1050), "Assets/Cards/MonsterCards/testmonstercard/", self.__inputHandler) - testMonsterCard3 = MonsterCard(pygame.Vector2(800, 1050), "Assets/Cards/MonsterCards/testmonstercard/", self.__inputHandler) - testMonsterCard4 = MonsterCard(pygame.Vector2(900, 1050), "Assets/Cards/MonsterCards/testmonstercard/", self.__inputHandler) - testMonsterCard5 = MonsterCard(pygame.Vector2(1000, 1050), "Assets/Cards/MonsterCards/testmonstercard/", self.__inputHandler) - self.cards.add(testMonsterCard) - self.cards.add(testMonsterCard1) - self.cards.add(testMonsterCard2) - self.cards.add(testMonsterCard3) - self.cards.add(testMonsterCard4) - self.cards.add(testMonsterCard5) + # todo: remove these and let server handle card creation instead + # blocker: server - client communication + self.__world.spawnCard("Assets/Cards/MonsterCards/testmonstercard/", (pygame.Vector2(500, 1050), self.__inputHandler)) + self.__world.spawnCard("Assets/Cards/MonsterCards/testmonstercard/", (pygame.Vector2(600, 1050), self.__inputHandler)) + self.__world.spawnCard("Assets/Cards/MonsterCards/testmonstercard/", (pygame.Vector2(700, 1050), self.__inputHandler)) + self.__world.spawnCard("Assets/Cards/MonsterCards/testmonstercard/", (pygame.Vector2(800, 1050), self.__inputHandler)) + self.__world.spawnCard("Assets/Cards/MonsterCards/testmonstercard/", (pygame.Vector2(900, 1050), self.__inputHandler)) + self.__world.spawnCard("Assets/Cards/MonsterCards/testmonstercard/", (pygame.Vector2(1000, 1050), self.__inputHandler)) while self.__running: self.__clock.tick(self.__FPS) @@ -56,7 +49,7 @@ class App: self.__window.drawWorld(self.__world) # updates all cards inside the cards Spritegroup at each step the gameloops does - self.cards.update() + self.__world.getCards().update() # draw groups self.__window.drawSpriteGroup(self.cards) @@ -77,7 +70,7 @@ class App: elif pygame.mouse.get_pressed()[0]: # Wenn linke Maustaste gedrückt wird mouse_x, mouse_y = pygame.mouse.get_pos() mouse_pos = pygame.Vector2(mouse_x, mouse_y) - for card in self.cards: + for card in self.__world.getCards(): if card.rect.collidepoint(mouse_pos) and selectedCard == None: card.setDragging(True) selectedCard = card @@ -92,14 +85,21 @@ class App: field.image = card.image.copy() card.setDragging(False) # card.kill() - + elif field.getType() == "EffectField" and card.getType() == "SpellCard" or field.getType() == "EffectField" and card.getType() == "TrapCard": + # todo: resize card so that it fits into the card field + # card.image = pygame.transform.scale(card.image, (field.getSize()[0] - 10, field.getSize()[1] - 10)) + card.rect.center = field.rect.center + field.image = card.image.copy() + card.setDragging(False) + # card.kill() elif event.type == pygame.MOUSEBUTTONUP: mouse_x, mouse_y = pygame.mouse.get_pos() mouse_pos = pygame.Vector2(mouse_x, mouse_y) if event.button == 1: # Wenn linke Maustaste losgelassen wird - for card in self.cards: + for card in self.__world.getCards(): card.setDragging(False) + # TODO: send server command if not card == None: card = None