added server communication between client and server

This commit is contained in:
2024-01-07 19:26:41 +01:00
parent fab79061ea
commit 6adea1730e
31 changed files with 173 additions and 129 deletions

View File

@ -1,14 +0,0 @@
import json
import pygame
class Card(pygame.sprite.Sprite):
def __init__(self, pos:tuple, assetDir:str):
if assetDir == "":
return ValueError.add_note("Card: imagePath cannot be empty")

View File

@ -1,9 +1,8 @@
import json
from typing import Any
import pygame
from Classes.System.Components.InputHandler import InputHandler
from Classes.Game.Player import Player
class MonsterCard(pygame.sprite.Sprite):
__name:str
@ -15,16 +14,18 @@ class MonsterCard(pygame.sprite.Sprite):
__dragging:bool = False
__offset:pygame.Vector2 = pygame.Vector2(0,0)
__inputHandler: InputHandler
__owner:Player
image:pygame.image
rect:pygame.rect
def __init__(self, pos:pygame.Vector2, assetDir:str, inputHandler:InputHandler):
def __init__(self, pos:pygame.Vector2, assetDir:str, inputHandler:InputHandler, owner:Player):
if assetDir == "":
return ValueError.add_note("Card: imagePath cannot be empty")
pygame.sprite.Sprite.__init__(self)
data = json.load(open(assetDir + "/card.json"))
self.__owner = owner
self.__id = int(data["id"])
self.__pos = pos
self.__name = data["name"]
@ -42,7 +43,7 @@ class MonsterCard(pygame.sprite.Sprite):
self.__attacks.append(attack)
def update(self):
if self.getDragging():
if self.__dragging:
mouse_pos = self.__inputHandler.getMousePos()
self.__pos = mouse_pos
self.rect.center = self.__pos
@ -74,6 +75,9 @@ class MonsterCard(pygame.sprite.Sprite):
def getID(self) -> int:
return self.__id
def getOwner(self) -> Player:
return self.__owner
def setDragging(self, dragging:bool):
self.__dragging = dragging

View File

@ -0,0 +1,7 @@
from Classes.Game.World import World
# 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):
pass

View File

@ -1,42 +1,9 @@
import pygame
from Classes.Game.World import World
from Classes.System.Network.NetworkManager import NetworkManager
from Classes.Game.Cards.MonsterCard import MonsterCard
from Game_Client.Classes.Game.Cards.SpellCard import SpellCard
from Game_Client.Classes.Game.Cards.TrapCard import TrapCard
# the event the client sends to the server when it places a card
def PlaceMonsterCard(networkManager: NetworkManager, card:MonsterCard):
# todo: send card information to the server
# todo: required info is:
# - position
# - field type (used for validating what field the card is played in will be compared on server side)
# - card id (server will do the rest to fetch card info)
payload = {
"event":"placecard",
"card": card.getID(),
"pos": card.getPos(),
}
networkManager.udp.send(payload)
# the event the client sends to the server when it places a card
def PlaceSpellCard(networkManager: NetworkManager, card:SpellCard):
# todo: send card information to the server.
# todo: required info is:
# - position
# - field type (used for validating what field the card is played in will be compared on server side)
# - card id (server will do the rest to fetch card info)
payload = {
"event":"placecard",
"card": card.getID(),
"pos": card.getPos(),
}
networkManager.udp.send(payload)
# the event the client sends to the server when it places a card
def PlaceTrapCard(networkManager: NetworkManager, card:TrapCard):
def PlaceCard(networkManager: NetworkManager, card):
# todo: send card information to the server
# todo: required info is:
# - position
@ -51,5 +18,6 @@ def PlaceTrapCard(networkManager: NetworkManager, card:TrapCard):
networkManager.udp.send(payload)
# the event send from the server to display a card on the field
def CardPlaced(world:World):
def CardPlaced(world:World, card:int, pos:pygame.Vector2):
pass

View File

@ -3,11 +3,13 @@ import pygame
class Player:
__id:int
__hp:int
__mana:int
__name:str
__handCards:pygame.Sprite.Group
__handCards:pygame.sprite.Group
def __init__(self, hp:int, name:str):
def __init__(self, hp:int, mana:int, name:str):
self.__hp = hp
self.__mana = mana
self.__name = name
def setID(self, id:int):
@ -21,17 +23,21 @@ class Player:
def getHP(self) -> int:
return self.__hp
def getMana(self) -> int:
return self.__mana
def adjustHP(self, hp:int) -> int:
self.__hp = self.__hp + hp
def getHand(self) -> pygame.Sprite.Group:
def getHand(self) -> pygame.sprite.Group:
return self.__handCards
def AddToHand(self, card) -> pygame.Sprite.Group:
def AddToHand(self, card) -> pygame.sprite.Group:
self.__handCards.add(card)
return self.__handCards
def removeFromHand(self, pos:int) -> pygame.Sprite.Group:
def removeFromHand(self, pos:int) -> pygame.sprite.Group:
self.__handCards.remove(pos)
return self.__handCards
return self.__handCards

View File

@ -2,12 +2,18 @@ import pygame
from Classes.Game.BoardField import BoardField
from Classes.System.Components.Label import Label
from Classes.Game.Cards.MonsterCard import MonsterCard
from Classes.Game.Cards.SpellCard import SpellCard
from Classes.Game.Cards.TrapCard import TrapCard
from Classes.System.Components.InputHandler import InputHandler
from Classes.Game.Player import Player
class World():
__boardFields:list
__player:Player
__enemy:Player
__labels:list
__cards:pygame.sprite.Group()
__PlayerHandCards:pygame.sprite.Group()
__screen:pygame.surface
__cardWidth:int = 150
__cardHeight:int = 200
@ -16,11 +22,14 @@ class World():
def __init__(self, screen:pygame.surface, cardWidth:int=200, cardHeight:int=250, cardOffset:int=400):
self.__boardFields = []
self.__labels = []
self.__cards = []
self.__cards = pygame.sprite.Group()
self.__PlayerHandCards = pygame.sprite.Group()
self.__screen = screen
self.__cardWidth = cardWidth
self.__cardHeight = cardHeight
self.__cardOffset = cardOffset
self.__player = None
self.__enemy = None
self.buildGameWorld()
def buildGameWorld(self):
@ -42,17 +51,19 @@ class World():
pDeckPos = pygame.Vector2((self.__cardOffset + (((self.__cardWidth + 10) - 30 ) * 5)), pRow2Height)
pNamePos = pygame.Vector2(20, pRow2Height + 195)
pHPPos = pygame.Vector2(20, pRow2Height + 225)
pManaPos = pygame.Vector2(20, pRow2Height + 255)
# 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, "0", pManaPos))
self.__labels.append(Label("EnemyHP", self.__screen, "1000 / 1000", eHPPos))
self.__labels.append(Label("EnemyName", self.__screen, "Enemy", eNamePos))
self.__boardFields.append(BoardField("EnemyDeck", "Enemy", "Deck", eDeckPos, "Assets/Cards/Arena/field.png"))
self.__boardFields.append(BoardField("EnemyGraveyard", "Enemy", "Grave", eGravePos, "Assets/Cards/Arena/field.png"))
self.__boardFields.append(BoardField("PlayerDeck", "Player", "Deck", pDeckPos, "Assets/Cards/Arena/field.png"))
self.__boardFields.append(BoardField("PlayerGraveyard", "Player", "Grave", pGravePos, "Assets/Cards/Arena/field.png"))
self.__boardFields.append(BoardField("EnemyDeck", "Enemy", "Deck", eDeckPos, "Assets/Cards/0/field.png", "e-deck"))
self.__boardFields.append(BoardField("EnemyGraveyard", "Enemy", "Grave", eGravePos, "Assets/Cards/0/field.png", "e-grave"))
self.__boardFields.append(BoardField("PlayerDeck", "Player", "Deck", pDeckPos, "Assets/Cards/0/field.png", "P-deck"))
self.__boardFields.append(BoardField("PlayerGraveyard", "Player", "Grave", pGravePos, "Assets/Cards/0/field.png", "p-grave"))
# handle field creation
for i in range(5):
@ -61,10 +72,10 @@ class World():
eMonsterPos = pygame.Vector2((self.__cardOffset + (((self.__cardWidth + 10) - 30) * (i+1)), eRow1Height))
eEffectPos = pygame.Vector2((self.__cardOffset + (((self.__cardWidth + 10) - 30) * (i+1))), eRow2Height)
self.__boardFields.append(BoardField("PlayerMonsterField-"+str(i), "Player", "MonsterField", pMonsterPos, "Assets/Cards/Arena/field.png", "pm"+str(id)))
self.__boardFields.append(BoardField("PlayerEffectField-"+str(i), "Player", "EffectField", pEffectPos, "Assets/Cards/Arena/field.png", "pe"+str(id)))
self.__boardFields.append(BoardField("EnemyMonsterField-"+str(i), "Enemy", "MonsterField", eMonsterPos, "Assets/Cards/Arena/field.png", "em"+str(id)))
self.__boardFields.append(BoardField("EnemySpellTrapField-"+str(i), "Enemy", "EffectField", eEffectPos, "Assets/Cards/Arena/field.png", "ee"+str(id)))
self.__boardFields.append(BoardField("PlayerMonsterField-"+str(i), "Player", "MonsterField", pMonsterPos, "Assets/Cards/0/field.png", "pm"+str(id)))
self.__boardFields.append(BoardField("PlayerEffectField-"+str(i), "Player", "EffectField", pEffectPos, "Assets/Cards/0/field.png", "pe"+str(id)))
self.__boardFields.append(BoardField("EnemyMonsterField-"+str(i), "Enemy", "MonsterField", eMonsterPos, "Assets/Cards/0/field.png", "em"+str(id)))
self.__boardFields.append(BoardField("EnemySpellTrapField-"+str(i), "Enemy", "EffectField", eEffectPos, "Assets/Cards/0/field.png", "ee"+str(id)))
def getBoardFields(self) -> list:
return self.__boardFields
@ -81,9 +92,45 @@ class World():
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))
def getHandCards(self) -> pygame.sprite.Group:
return self.__PlayerHandCards
def getPlayer(self) -> Player:
return self.__player
def getEnemy(self) -> Player:
return self.__enemy
def setPlayer(self, player:Player):
for label in self.__labels:
if label.getName() == "PlayerName":
label.setText(player.getName())
self.__player = player
def setEnemy(self, player:Player):
for label in self.__labels:
if label.getName() == "EnemyName":
label.setText(player.getName())
self.__enemy = player
def spawnMonsterCard(self, asset:str, pos:pygame.Vector2, inputHandler:InputHandler, owner:Player) -> MonsterCard:
card = MonsterCard(pos, asset, inputHandler, owner)
self.__cards.add(card)
return card
def spawnSpellCard(self, asset:str, pos:pygame.Vector2, inputHandler:InputHandler, owner:Player) -> SpellCard:
card = SpellCard(pos, asset, inputHandler, owner)
self.__cards.add(card)
return card
def spawnTrapCard(self, asset:str, pos:pygame.Vector2, inputHandler:InputHandler, owner:Player) -> TrapCard:
card = TrapCard(pos, asset, inputHandler, owner)
self.__cards.add(card)
return card
def spawnCards(self, cards:pygame.sprite.Group):
for card in cards:
self.__cards.append(card)
self.__cards.add(card)
def AddToPlayerHand(self, Card):
self.__PlayerHandCards.add(Card)