game: core: use server game calulation form
This commit is contained in:
@ -4,6 +4,8 @@ PADDLE_RATIO = 0.3
|
||||
|
||||
MAP_SIZE_X = 700
|
||||
MAP_SIZE_Y = 700
|
||||
MAP_CENTER_X = MAP_SIZE_X / 2
|
||||
MAP_CENTER_Y = MAP_SIZE_Y / 2
|
||||
|
||||
WALL_RATIO = 1
|
||||
|
||||
|
@ -6,8 +6,11 @@ import json
|
||||
|
||||
from .objects.GameRoomManager import GameRoomManager
|
||||
from .objects.GameMember import GameMember
|
||||
from .objects.Game import Game
|
||||
from .objects.GameManager import GameManager
|
||||
|
||||
game_room_manager: GameRoomManager = GameRoomManager()
|
||||
game_manager: GameManager = GameManager()
|
||||
|
||||
class GameWebSocket(WebsocketConsumer):
|
||||
|
||||
@ -16,6 +19,9 @@ class GameWebSocket(WebsocketConsumer):
|
||||
self.channel_name = "games"
|
||||
self.group_name = "games"
|
||||
|
||||
def send_game_data(self):
|
||||
self.member.send("init_game", self.game.to_dict())
|
||||
|
||||
def connect(self):
|
||||
|
||||
self.user: User = self.scope["user"]
|
||||
@ -25,6 +31,8 @@ class GameWebSocket(WebsocketConsumer):
|
||||
self.channel_layer.group_add(self.group_name, self.channel_name)
|
||||
|
||||
self.game_id = int(self.scope['url_route']['kwargs']['game_id'])
|
||||
|
||||
self.game = game_manager.get(self.game_id)
|
||||
|
||||
self.room = game_room_manager.get(self.game_id)
|
||||
|
||||
@ -36,6 +44,8 @@ class GameWebSocket(WebsocketConsumer):
|
||||
|
||||
self.room.append(self.member)
|
||||
|
||||
self.send_game_data()
|
||||
|
||||
def receive(self, text_data: str = None, bytes_data: bytes = None):
|
||||
|
||||
if (text_data is None):
|
||||
|
@ -3,7 +3,19 @@ from .. import config
|
||||
class Ball:
|
||||
|
||||
def __init__(self) -> None:
|
||||
self.x: float = config.BALL_SPAWN_POS_X
|
||||
self.y: float = config.BALL_SPAWN_POS_Y
|
||||
self.speed: float = config.BALL_SPEED_START
|
||||
self.postion_x: float = config.BALL_SPAWN_POS_X
|
||||
self.postion_y: float = config.BALL_SPAWN_POS_Y
|
||||
self.velocity_x: float = config.BALL_SPEED_START
|
||||
self.velocity_y: float = config.BALL_SPEED_START
|
||||
|
||||
def to_dict(self):
|
||||
|
||||
data: dict = {
|
||||
"position_x": self.postion_x,
|
||||
"position_y": self.postion_y,
|
||||
"velocity_x": self.velocity_x,
|
||||
"velocity_y": self.velocity_y,
|
||||
}
|
||||
|
||||
return data
|
||||
|
@ -1,8 +1,53 @@
|
||||
from .Ball import Ball
|
||||
from .Paddle import Paddle
|
||||
from .Player import Player
|
||||
from .Wall import Wall
|
||||
|
||||
import math
|
||||
|
||||
from .. import config
|
||||
|
||||
from ..models import GameModel
|
||||
|
||||
class Game:
|
||||
|
||||
def __init__(self, paddles: [Paddle], ball: Ball) -> None:
|
||||
self.ball: Ball = ball
|
||||
self.paddles: [paddles] = paddles
|
||||
def __init__(self, game_id: int) -> None:
|
||||
self.ball: Ball = Ball()
|
||||
game: GameModel = GameModel.objects.get(pk = game_id)
|
||||
players_id: [int] = game.get_players_id()
|
||||
|
||||
radius: float = min(config.MAP_SIZE_X, config.MAP_SIZE_Y) / 2 - 10
|
||||
|
||||
nb_sides = len(players_id) * 2
|
||||
|
||||
self.polygon = []
|
||||
|
||||
for i in range(nb_sides):
|
||||
|
||||
angle: float = (i * 2 * math.pi / nb_sides) + (math.pi * 3 / 4)
|
||||
|
||||
x: float = config.MAP_CENTER_X + radius * math.cos(angle)
|
||||
y: float = config.MAP_CENTER_Y + radius * math.sin(angle)
|
||||
|
||||
self.polygon.append((x, y))
|
||||
|
||||
self.players: list(Player) = []
|
||||
self.walls: list(Wall) = []
|
||||
|
||||
for i in range(nb_sides):
|
||||
if (i % 2 == 0):
|
||||
self.players.append(Player(players_id[ i // 2], *self.polygon[i], *self.polygon[(i + 1) % nb_sides]))
|
||||
else:
|
||||
self.walls.append(Wall(*self.polygon[i], *self.polygon[(i + 1) % nb_sides]))
|
||||
|
||||
self.game_id: int = game_id
|
||||
|
||||
def to_dict(self):
|
||||
|
||||
data: dict = {"ball": self.ball.to_dict(),
|
||||
"players": [player.to_dict() for player in self.players],
|
||||
"walls": [wall.to_dict() for wall in self.walls],
|
||||
}
|
||||
|
||||
print(data)
|
||||
|
||||
return data
|
22
games/objects/GameManager.py
Normal file
22
games/objects/GameManager.py
Normal file
@ -0,0 +1,22 @@
|
||||
|
||||
from .Game import Game
|
||||
from ..models import GameModel
|
||||
|
||||
class GameManager():
|
||||
|
||||
def __init__(self) -> None:
|
||||
self._game_list: [Game] = []
|
||||
|
||||
def get(self, game_id: int):
|
||||
|
||||
if (not GameModel.objects.filter(pk = game_id, started = True, finished = False).exists()):
|
||||
return None
|
||||
|
||||
for game in self._game_list:
|
||||
game: Game
|
||||
if (game.game_id == game_id):
|
||||
return game
|
||||
|
||||
return Game(game_id)
|
||||
|
||||
|
@ -44,7 +44,7 @@ class GameMember(AbstractRoomMember):
|
||||
|
||||
new_position.position = data.get("position")
|
||||
|
||||
if (new_position is None):
|
||||
if (new_position.position is None):
|
||||
self.send_error("missing new_position")
|
||||
return
|
||||
|
||||
|
@ -2,12 +2,27 @@
|
||||
|
||||
class Player:
|
||||
|
||||
def __init__(self, user_id, pos, nb_goal, rail_start_x, rail_start_y, rail_stop_x, rail_stop_y) -> None:
|
||||
def __init__(self, user_id, rail_start_x, rail_start_y, rail_stop_x, rail_stop_y) -> None:
|
||||
self.user_id = user_id
|
||||
self.pos = pos
|
||||
self.nb_goal = nb_goal
|
||||
self.position = 0.5
|
||||
self.nb_goal = 0
|
||||
|
||||
self.rail_start_x = rail_start_x
|
||||
self.rail_start_y = rail_start_y
|
||||
self.rail_stop_x = rail_stop_x
|
||||
self.rail_stop_y = rail_stop_y
|
||||
self.rail_stop_y = rail_stop_y
|
||||
|
||||
def to_dict(self):
|
||||
|
||||
data = {
|
||||
"user_id": self.user_id,
|
||||
"position": self.position,
|
||||
"nb_goal": self.nb_goal,
|
||||
|
||||
"rail_start_x": self.rail_start_x,
|
||||
"rail_start_y": self.rail_start_y,
|
||||
"rail_stop_x": self.rail_stop_x,
|
||||
"rail_stop_y": self.rail_stop_y,
|
||||
}
|
||||
|
||||
return data
|
20
games/objects/Wall.py
Normal file
20
games/objects/Wall.py
Normal file
@ -0,0 +1,20 @@
|
||||
|
||||
|
||||
class Wall:
|
||||
|
||||
def __init__(self, rail_start_x, rail_start_y, rail_stop_x, rail_stop_y) -> None:
|
||||
self.rail_start_x = rail_start_x
|
||||
self.rail_start_y = rail_start_y
|
||||
self.rail_stop_x = rail_stop_x
|
||||
self.rail_stop_y = rail_stop_y
|
||||
|
||||
def to_dict(self):
|
||||
|
||||
data = {
|
||||
"rail_start_x": self.rail_start_x,
|
||||
"rail_start_y": self.rail_start_y,
|
||||
"rail_stop_x": self.rail_stop_x,
|
||||
"rail_stop_y": self.rail_stop_y,
|
||||
}
|
||||
|
||||
return data
|
Reference in New Issue
Block a user