player pos is checked

This commit is contained in:
2024-01-16 17:47:31 +01:00
parent a1e732f167
commit 58c0df447c
10 changed files with 180 additions and 52 deletions

View File

@ -1,4 +1,5 @@
PADDLE_SPEED_PER_SECOND_MAX = 0.6
PADDLE_SPEED_PER_SECOND_TOLERANCE = 1.01
PADDLE_RATIO = 0.3
MAP_SIZE_X = 700

View File

@ -11,35 +11,41 @@ game_room_manager: GameRoomManager = GameRoomManager()
class GameWebSocket(WebsocketConsumer):
def __init__(self, *args, **kwargs):
super().__init__(*args, **kwargs)
self.channel_name = "games"
self.group_name = "games"
def __init__(self, *args, **kwargs):
super().__init__(*args, **kwargs)
self.channel_name = "games"
self.group_name = "games"
def connect(self):
def connect(self):
self.user: User = self.scope["user"]
if (self.user.is_anonymous or not self.user.is_authenticated):
return
self.user: User = self.scope["user"]
if (self.user.is_anonymous or not self.user.is_authenticated):
return
self.channel_layer.group_add(self.group_name, self.channel_name)
self.channel_layer.group_add(self.group_name, self.channel_name)
self.game_id = int(self.scope['url_route']['kwargs']['game_id'])
self.game_id = int(self.scope['url_route']['kwargs']['game_id'])
self.room = game_room_manager.get(self.game_id)
self.room = game_room_manager.get(self.game_id)
if (self.room is None):
self.send("Game not found.")
self.disconnect(1017)
self.member = GameMember(self.user.pk, self)
self.room.append(self.member)
if (self.room is None):
self.send("Game not found.")
self.disconnect(1017)
def receive(self, text_data: str = None, bytes_data: bytes = None):
self.member.receive(text_data)
self.member = GameMember(self.user.pk, self, self.room)
def disconnect(self, close_code):
member = self.room.get_member_by_socket(self)
if (member is not None):
self.room.remove(self.member, close_code)
self.room.append(self.member)
def receive(self, text_data: str = None, bytes_data: bytes = None):
if (text_data is None):
return
data: dict = json.loads(text_data)
self.member.receive(data)
def disconnect(self, close_code):
member = self.room.get_member_by_socket(self)
if (member is not None):
self.room.remove(self.member, close_code)

View File

@ -16,7 +16,7 @@ class GameModel(models.Model):
return self.pk
def get_players_id(self):
return [game_member.member_id for game_member in GameMembersModel.objects.filter(game_id = self.pk)]
return [game_player.player_id for game_player in GameMembersModel.objects.filter(game_id = self.pk)]
class GameMembersModel(models.Model):
game_id = models.IntegerField()

View File

@ -5,4 +5,5 @@ 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

View File

@ -2,17 +2,96 @@ from channels.generic.websocket import AsyncWebsocketConsumer
from transcendence.abstract.AbstractRoomMember import AbstractRoomMember
from .Position import Position
import time
from .. import config
from ..models import GameModel
MIN_POSITION: float = config.PADDLE_RATIO / 2
MAX_POSITION: float = 1 - MIN_POSITION
class GameMember(AbstractRoomMember):
def __init__(self, user_id: int, socket: AsyncWebsocketConsumer):
super().__init__(user_id, socket)
self.is_a_player = False
def receive(self, data: dict):
if (not self.is_a_player):
self.send("You are not a player.")
return
def __init__(self, user_id: int, socket: AsyncWebsocketConsumer, room):
super().__init__(user_id, socket)
self.position: Position = Position(0.5, int(time.time() * 1000.0))
self.room = room
self.is_a_player = user_id in GameModel.objects.get(pk = self.room.game_id).get_players_id()
def receive(self, data: dict):
detail: str = data.get("detail")
if (detail is None):
return
if (detail == "update_my_paddle_pos"):
self.update_position(data)
def send_error(self, error_message: str):
self.send("error", {"error_message": error_message})
def update_position(self, data: dict):
if (not self.is_a_player):
return
new_position: Position = Position()
new_position.position = data.get("position")
if (new_position is None):
self.send_error("missing new_position")
return
new_position.time = data.get("time")
if (new_position.time is None):
self.send_error("missing time")
return
if (self.position.time > new_position.time):
self.send_error("time error")
return
distance: float = abs(self.position.position - new_position.position)
sign = 1 if self.position.position >= new_position.position else -1
time_difference = (new_position.time - self.position.time) / 1000
max_distance = config.PADDLE_SPEED_PER_SECOND_MAX * (time_difference) * config.PADDLE_SPEED_PER_SECOND_TOLERANCE
new_position_verified: Position = new_position.copy()
def send_ball(self, ball):
self.send("update_ball_pos", {"x": ball.x,
"y": ball.y})
if (distance > max_distance):
print(max_distance, distance, time_difference, self.position.position, new_position.position)
new_position_verified.position = self.position.position + max_distance * sign
if (not MIN_POSITION <= new_position_verified.position <= MAX_POSITION):
new_position_verified.position = max(new_position_verified.position, MIN_POSITION)
new_position_verified.position = min(new_position_verified.position, MAX_POSITION)
if (new_position.position != new_position_verified.position):
self.send("update_paddles", {
"players": [
{
"position": new_position_verified.position,
"time": new_position_verified.time,
"id": self.user_id,
},
],
})
print("trop vite")
self.position = new_position
def send_ball(self, ball):
self.send("update_ball_pos", {"x": ball.x,
"y": ball.y})

10
games/objects/Position.py Normal file
View File

@ -0,0 +1,10 @@
from typing import Union
class Position:
def __init__(self, position = 0, time: int = 0) -> None:
self.time = time
self.position = position
def copy(self):
return Position(self.position, self.time)