stabilized login, first successfull stream of cards accross clients
This commit is contained in:
@ -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
|
||||
|
||||
|
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
@ -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
|
@ -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
|
Binary file not shown.
Binary file not shown.
Binary file not shown.
@ -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)
|
||||
|
Binary file not shown.
Binary file not shown.
Binary file not shown.
@ -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:
|
||||
|
Binary file not shown.
Binary file not shown.
Binary file not shown.
23
Client/Classes/System/GameManager.py
Normal file
23
Client/Classes/System/GameManager.py
Normal 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
|
@ -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
|
||||
|
Binary file not shown.
BIN
Client/Classes/System/Utils/__pycache__/Path.cpython-312.pyc
Normal file
BIN
Client/Classes/System/Utils/__pycache__/Path.cpython-312.pyc
Normal file
Binary file not shown.
Binary file not shown.
Reference in New Issue
Block a user