game: add: close game when nobody in
This commit is contained in:
parent
35af766c2b
commit
b6936751b1
@ -16,6 +16,11 @@ class GameModel(models.Model):
|
|||||||
def start(self):
|
def start(self):
|
||||||
self.started = True
|
self.started = True
|
||||||
|
|
||||||
|
def finish(self, winner_id):
|
||||||
|
self.winner_id = winner_id
|
||||||
|
self.finished = True
|
||||||
|
self.save()
|
||||||
|
|
||||||
def get_players_id(self):
|
def get_players_id(self):
|
||||||
return [game_player.player_id for game_player in GameMembersModel.objects.filter(game_id = self.pk)]
|
return [game_player.player_id for game_player in GameMembersModel.objects.filter(game_id = self.pk)]
|
||||||
|
|
||||||
|
@ -22,15 +22,22 @@ from ..routine import routine
|
|||||||
|
|
||||||
import threading
|
import threading
|
||||||
|
|
||||||
|
from typing import TYPE_CHECKING
|
||||||
|
|
||||||
|
if TYPE_CHECKING:
|
||||||
|
from .GameManager import GameManager
|
||||||
|
|
||||||
class Game(AbstractRoom):
|
class Game(AbstractRoom):
|
||||||
|
|
||||||
def __init__(self, game_id):
|
def __init__(self, game_id: int, game_manager):
|
||||||
super().__init__(None)
|
super().__init__(None)
|
||||||
|
|
||||||
|
self.game_manager: GameManager = game_manager
|
||||||
|
|
||||||
self.ball: Ball = Ball()
|
self.ball: Ball = Ball()
|
||||||
self.model: GameModel = GameModel.objects.get(pk = game_id)
|
self.model: GameModel = GameModel.objects.get(pk = game_id)
|
||||||
|
|
||||||
self.started = False
|
self.stopped: bool = False
|
||||||
|
|
||||||
radius: float = min(config.MAP_SIZE_X, config.MAP_SIZE_Y) / 2 - 10
|
radius: float = min(config.MAP_SIZE_X, config.MAP_SIZE_Y) / 2 - 10
|
||||||
|
|
||||||
@ -105,6 +112,12 @@ class Game(AbstractRoom):
|
|||||||
return False
|
return False
|
||||||
return True
|
return True
|
||||||
|
|
||||||
|
def nobody_is_here(self):
|
||||||
|
for player in self.players:
|
||||||
|
if player.is_connected():
|
||||||
|
return False
|
||||||
|
return len(self.spectators) == 0
|
||||||
|
|
||||||
def _player_join(self, user_id: int, socket: WebsocketConsumer):
|
def _player_join(self, user_id: int, socket: WebsocketConsumer):
|
||||||
|
|
||||||
player = self.get_player_by_user_id(user_id)
|
player = self.get_player_by_user_id(user_id)
|
||||||
@ -127,7 +140,14 @@ class Game(AbstractRoom):
|
|||||||
def _update_player(self, player: Player):
|
def _update_player(self, player: Player):
|
||||||
self._updated_players.append(player)
|
self._updated_players.append(player)
|
||||||
|
|
||||||
|
def finish(self, winner: Player):
|
||||||
|
self.model.finish(winner.user_id)
|
||||||
|
|
||||||
def _player_leave(self, player: Player):
|
def _player_leave(self, player: Player):
|
||||||
|
if (self.nobody_is_here()):
|
||||||
|
if (self.model.started):
|
||||||
|
self.finish(player)
|
||||||
|
return
|
||||||
self._update_player(player)
|
self._update_player(player)
|
||||||
|
|
||||||
def _spectator_join(self, user_id: int, socket: WebsocketConsumer):
|
def _spectator_join(self, user_id: int, socket: WebsocketConsumer):
|
||||||
@ -149,9 +169,8 @@ class Game(AbstractRoom):
|
|||||||
return member
|
return member
|
||||||
|
|
||||||
def start(self):
|
def start(self):
|
||||||
if (self.started == True):
|
if (self.model.started == True):
|
||||||
return
|
return
|
||||||
self.started = True
|
|
||||||
self.model.start()
|
self.model.start()
|
||||||
|
|
||||||
def leave(self, member: AbstractRoomMember):
|
def leave(self, member: AbstractRoomMember):
|
||||||
@ -159,6 +178,10 @@ class Game(AbstractRoom):
|
|||||||
self._player_leave(member)
|
self._player_leave(member)
|
||||||
elif (isinstance(member, Spectator)):
|
elif (isinstance(member, Spectator)):
|
||||||
self._spectator_leave(member)
|
self._spectator_leave(member)
|
||||||
|
if (self.nobody_is_here()):
|
||||||
|
self.stopped = True
|
||||||
|
self.thread.join(10)
|
||||||
|
self.game_manager.remove(self)
|
||||||
|
|
||||||
def to_dict(self):
|
def to_dict(self):
|
||||||
|
|
||||||
|
@ -1,12 +1,15 @@
|
|||||||
|
from ..models import GameModel
|
||||||
|
|
||||||
from .Game import Game
|
from .Game import Game
|
||||||
from ..models import GameModel
|
|
||||||
|
|
||||||
class GameManager():
|
class GameManager():
|
||||||
|
|
||||||
def __init__(self) -> None:
|
def __init__(self) -> None:
|
||||||
self._game_list: list[Game] = []
|
self._game_list: list[Game] = []
|
||||||
|
|
||||||
|
def remove(self, game: Game):
|
||||||
|
self._game_list.remove(game)
|
||||||
|
|
||||||
def get(self, game_id: int) -> Game:
|
def get(self, game_id: int) -> Game:
|
||||||
|
|
||||||
if (not GameModel.objects.filter(pk = game_id, finished = False).exists()):
|
if (not GameModel.objects.filter(pk = game_id, finished = False).exists()):
|
||||||
@ -17,7 +20,7 @@ class GameManager():
|
|||||||
if (game.game_id == game_id):
|
if (game.game_id == game_id):
|
||||||
return game
|
return game
|
||||||
|
|
||||||
game: Game = Game(game_id)
|
game: Game = Game(game_id, self)
|
||||||
|
|
||||||
self._game_list.append(game)
|
self._game_list.append(game)
|
||||||
|
|
||||||
|
@ -253,7 +253,7 @@ async def update_ball(game: Game, impact_data: dict) -> None:
|
|||||||
|
|
||||||
await SyncToAsync(game.broadcast)("update_ball", game.ball.to_dict())
|
await SyncToAsync(game.broadcast)("update_ball", game.ball.to_dict())
|
||||||
|
|
||||||
async def render(game: Game):
|
async def render_ball(game: Game):
|
||||||
|
|
||||||
while True:
|
while True:
|
||||||
|
|
||||||
@ -262,16 +262,30 @@ async def render(game: Game):
|
|||||||
impact_data: dict = get_impact_data(segments, game.ball)
|
impact_data: dict = get_impact_data(segments, game.ball)
|
||||||
|
|
||||||
await update_ball(game, impact_data)
|
await update_ball(game, impact_data)
|
||||||
|
|
||||||
|
async def render_players(game: Game):
|
||||||
def routine(game: Game):
|
|
||||||
|
|
||||||
asyncio.run(render(game))
|
|
||||||
|
|
||||||
while True:
|
while True:
|
||||||
|
|
||||||
for player in game._updated_players:
|
for player in game._updated_players:
|
||||||
game.broadcast("update_paddle", player.to_dict(), [player])
|
game.broadcast("update_paddle", player.to_dict(), [player])
|
||||||
|
|
||||||
game._updated_players.clear()
|
game._updated_players.clear()
|
||||||
|
|
||||||
sleep(1 / config.SERVER_TPS)
|
await asyncio.sleep(1 / config.SERVER_TPS)
|
||||||
|
|
||||||
|
async def render(game: Game):
|
||||||
|
|
||||||
|
routine_ball = asyncio.create_task(render_ball(game))
|
||||||
|
routine_players = asyncio.create_task(render_players(game))
|
||||||
|
|
||||||
|
while(True):
|
||||||
|
if (game.stopped):
|
||||||
|
routine_ball.cancel()
|
||||||
|
routine_players.cancel()
|
||||||
|
return
|
||||||
|
await asyncio.sleep(0.3)
|
||||||
|
|
||||||
|
def routine(game: Game):
|
||||||
|
|
||||||
|
asyncio.run(render(game))
|
||||||
|
Loading…
Reference in New Issue
Block a user