stabilized login, first successfull stream of cards accross clients

This commit is contained in:
2024-01-22 19:37:54 +01:00
parent 3b7563c5f1
commit 18dcd6cc42
63 changed files with 441 additions and 859 deletions

View File

@ -16,10 +16,11 @@ class Card(pygame.sprite.Sprite):
__inputHandler: InputHandler
__owner:Player
__state:str
__dragable:bool = True
image:pygame.image
rect:pygame.rect
def __init__(self, pos: pygame.Vector2, assetDir: str, inputHandler: InputHandler, owner: Player):
def __init__(self, pos: pygame.Vector2, assetDir: str, inputHandler: InputHandler, owner: Player, dragable:bool=True):
if assetDir == "":
raise ValueError("Card: imagePath cannot be empty")
@ -49,9 +50,10 @@ class Card(pygame.sprite.Sprite):
def update(self):
if self.__dragging:
mouse_pos = self.__inputHandler.getMousePos()
self.__pos = mouse_pos
self.rect.center = self.__pos
if self.__dragable:
mouse_pos = self.__inputHandler.getMousePos()
self.__pos = mouse_pos
self.rect.center = self.__pos
def attacks(self):
return self.__attacks
@ -68,6 +70,9 @@ class Card(pygame.sprite.Sprite):
def getDragging(self):
return self.__dragging
def getDragable(self):
return self.__dragable
def getOffset(self):
return self.__offset

View File

@ -8,10 +8,10 @@ from Classes.System.Utils.Path import PathUtil
# send from the server to tell the player the game starts
# gives the client its and the opponents stats (not cards!!)
def GameStart(world: World, handCards:list, inputHandler:InputHandler, owner:Player, opponent:Player):
def GameStart(world: World, handCards:list, inputHandler:InputHandler, owner:Player):
index:int = 0
world.setEnemy(opponent)
for card in handCards:
world.AddToPlayerHand(Card(pygame.Vector2(500 + (index + 100), 1050), PathUtil.getAbsolutePathTo(f"Assets/Cards/{card}/"), inputHandler, owner))
#world.AddToPlayerHand(Card(pygame.Vector2(500 + (index * 100), 1050), PathUtil.getAbsolutePathTo(f"Assets/Cards/{card}/"), inputHandler, Player(1000, 0, "test"), dragable=True))
world.spawnCard(PathUtil.getAbsolutePathTo(f"Assets/Cards/{card}"), pygame.Vector2(500 + (index * 100), 1050), inputHandler, world.getPlayer())
index=index+1

View File

@ -2,6 +2,7 @@ import pygame
from Classes.Game.World import World
from Classes.System.Components.InputHandler import InputHandler
from Classes.Game.Cards.Card import Card
from Classes.System.Utils.Path import PathUtil
# the event the client sends to the server when it places a card
def PlaceCard(tcpClient, card:Card, player):
@ -22,9 +23,10 @@ def PlaceCard(tcpClient, card:Card, player):
tcpClient.send(payload)
# the event send from the server to display a card on the field
def CardPlaced(world:World, card:int, type:str, owner:str, pos:pygame.Vector2, inputHandler:InputHandler):
def CardPlaced(world:World, card:int, owner:str, pos:pygame.Vector2, inputHandler:InputHandler):
# todo: make this work with all cardtypes
world.spawnCard(f"Assets/Cards/{card}/", pos, inputHandler, owner)
print("placing enemy card")
world.spawnEnemyCard(PathUtil.getAbsolutePathTo(f"Assets/Cards/{card}"), pos, inputHandler, owner)
def MovedCard(world:World, card:int, type:str, owner:str, oldPos:pygame.Vector2, newPos:pygame.Vector2, inputHandler:InputHandler):
pass

View File

@ -16,7 +16,7 @@ class World():
__labels:list
__cards:pygame.sprite.Group()
__PlayerHandCards:pygame.sprite.Group()
__screen:pygame.surface
screen:pygame.surface
__cardWidth:int = 150
__cardHeight:int = 200
__cardOffset:int = 400
@ -57,10 +57,10 @@ class World():
# labeling
self.__labels.append(Label("PlayerHP", self.__screen, "1000 / 1000", pHPPos))
self.__labels.append(Label("PlayerName", self.__screen, "Player", pNamePos))
self.__labels.append(Label("PlayerName", self.__screen, "Not Connected", pNamePos))
self.__labels.append(Label("PlayerName", self.__screen, "0", pManaPos))
self.__labels.append(Label("EnemyHP", self.__screen, "1000 / 1000", eHPPos))
self.__labels.append(Label("EnemyName", self.__screen, "Enemy", eNamePos))
self.__labels.append(Label("EnemyName", self.__screen, "Not Connected", eNamePos))
self.__boardFields.append(BoardField("EnemyDeck", "Enemy", "Deck", eDeckPos, PathUtil.getAbsolutePathTo("Assets/Cards/0/field.png"), "e-deck"))
self.__boardFields.append(BoardField("EnemyGraveyard", "Enemy", "Grave", eGravePos, PathUtil.getAbsolutePathTo("Assets/Cards/0/field.png"), "e-grave"))
@ -121,6 +121,15 @@ class World():
self.__cards.add(card)
return card
def spawnEnemyCard(self, asset:str, pos:pygame.Vector2, inputHandler:InputHandler, owner:str) -> Card:
pos.y = (self.__cardHeight + 45)
card = Card(pos, asset, inputHandler, self.enemy, dragable=False)
self.__cards.add(card)
print(f"new card collection {self.__cards}")
return card
def spawnCards(self, cards:pygame.sprite.Group):
for card in cards:
self.__cards.add(card)

View File

@ -49,12 +49,12 @@ class App:
# 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"))
# 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)
@ -87,14 +87,15 @@ class App:
self.onCleanup()
elif self.__inputHandler.getMousePressed()[0]:
for card in self.__world.getCards():
if card.rect.collidepoint(self.__inputHandler.getMousePos()):
#self.__logger.info(f"dragging card {card}")
self.selectedCard = card
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)
# 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:

View File

@ -0,0 +1,23 @@
from Classes.Game.Player import Player
from Classes.Game.World import World
class GameManager:
player:Player
enemy:Player
world:World
def __init__(self, world):
self.world = world
def getPlayer(self) -> Player:
return self.player
def getEnemy(self) -> Player:
return self.enemy
def setPlayer(self, player:Player):
self.player = player
def setEnemy(self, enemy:Player):
self.enemy = enemy

View File

@ -2,16 +2,20 @@ import json
import socket
import threading
from Classes.System.Network.EventHandler import TCPEventHandler
import pygame
from Classes.Game.World import World
from Classes.System.Components.InputHandler import InputHandler
from Classes.Game.Events.GameStart import GameStart
from Classes.Game.Events.Login import LoginResponse
from Classes.Game.Events.PlaceCard import CardPlaced
from Classes.Game.Player import Player
class TCPClient:
def __init__(self, addr: str, port: str, world:World, inputHandler:InputHandler):
self.addr = addr
self.port = int(port)
self.tcpSocket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
self.eventHandler = TCPEventHandler(self.tcpSocket)
self.world = world
self.inputHandler = inputHandler
@ -35,11 +39,30 @@ class TCPClient:
data = self.tcpSocket.recv(1024)
if data:
decoded_data = json.loads(data.decode())
self.eventHandler.handleEvents(decoded_data, self.inputHandler, self.world)
self.handleEvents(decoded_data)
except Exception as e:
print(f"Error receiving TCP data: {e}")
break
def handleEvents(self, message):
print(message)
if message["event"] == "loginresponse":
if message["status"] != "success":
print("login failed")
else:
print("receiving login confirmation from server")
self.world.setPlayer(Player(0,0,message["name"], message["id"]))
elif message["event"] == "startgame":
print(self.world.player)
# world.player.setMana(message["player"]["mana"])
# world.player.setHp(message["player"]["hp"])
self.world.setEnemy(Player(message["enemy"]["hp"],0,message["enemy"]["name"], message["enemy"]["id"]))
GameStart(self.world, message["player"]["hand"], self.inputHandler, self.world.getPlayer())
pass
elif message["event"] == "PlacedCard":
CardPlaced(self.world, message["card"], message["owner"], pygame.Vector2(message["x"], message["y"]), self.inputHandler)
pass
def listen(self):
tcpThread = threading.Thread(target=self.receive)
tcpThread.daemon = True