fix: game: routine

This commit is contained in:
starnakin 2024-04-09 13:12:51 +02:00
parent 90d179eb72
commit fd3e807136

View File

@ -3,7 +3,6 @@ from __future__ import annotations
from typing import TYPE_CHECKING from typing import TYPE_CHECKING
if TYPE_CHECKING: if TYPE_CHECKING:
from .objects.pong.PongSpectator import PongSpectator
from .objects.pong.PongPlayer import PongPlayer from .objects.pong.PongPlayer import PongPlayer
from .objects.pong.PongGame import PongGame from .objects.pong.PongGame import PongGame
from .objects.pong.Ball import Ball from .objects.pong.Ball import Ball
@ -13,15 +12,11 @@ from .objects.pong.Segment import Segment
from . import config from . import config
from . import config
import math import math
import asyncio import asyncio
from asgiref.sync import SyncToAsync from asgiref.sync import SyncToAsync
from time import sleep
VERTICALLY = 1 VERTICALLY = 1
NORMAL = 2 NORMAL = 2
@ -116,9 +111,9 @@ def get_impact_data(segments: list[Segment], ball: Ball) -> dict:
inc_x: float = (-1) * get_sign(cos) * (config.STROKE_THICKNESS + config.BALL_SIZE / 2) inc_x: float = (-1) * get_sign(cos) * (config.STROKE_THICKNESS + config.BALL_SIZE / 2)
inc_y: float = get_sign(sin) * (config.STROKE_THICKNESS + config.BALL_SIZE / 2) inc_y: float = get_sign(sin) * (config.STROKE_THICKNESS + config.BALL_SIZE / 2)
point: Point = Point(ball.position.x + cos, ball.position.y - sin) point: Point = Point(ball.position.location.x + cos, ball.position.location.y - sin)
ball_segment = Segment(ball.position, point) ball_segment = Segment(ball.position.location, point)
closest: dict = None closest: dict = None
@ -137,21 +132,23 @@ def get_impact_data(segments: list[Segment], ball: Ball) -> dict:
if (impact is None): if (impact is None):
continue continue
diff_x: float = ball.position.x - impact.x diff_x: float = ball.position.location.x - impact.x
if (get_sign(diff_x) == get_sign(cos) and cos != 0): if (get_sign(diff_x) == get_sign(cos) and cos != 0):
continue continue
diff_y: float = (ball.position.y - impact.y) diff_y: float = (ball.position.location.y - impact.y)
if (get_sign(diff_y) != get_sign(sin) and sin != 0): if (get_sign(diff_y) != get_sign(sin) and sin != 0):
continue continue
if (closest is None or impact.distance(ball.position) < closest.get("distance")): distance: float = impact.distance(ball.position.location)
if (closest is None or distance < closest.get("distance")):
closest = { closest = {
"inc_x": inc_x, "inc_x": inc_x,
"inc_y": inc_y, "inc_y": inc_y,
"impact": impact, "impact": impact,
"segment": segment, "segment": segment,
"distance": impact.distance(ball.position), "distance": distance,
} }
return closest return closest
@ -171,18 +168,18 @@ def wall_collision(ball_angle: float, wall: Segment) -> float:
return reflection_angle return reflection_angle
async def paddle_collision(game: Game, impact: Point, player: Player, inc_x: float, inc_y: float): async def paddle_collision(game: PongGame, impact: Point, player: PongPlayer, inc_x: float, inc_y: float):
diff_x: float = player.rail.stop.x - player.rail.start.x diff_x: float = player.rail.stop.x - player.rail.start.x
diff_y: float = player.rail.stop.y - player.rail.start.y diff_y: float = player.rail.stop.y - player.rail.start.y
paddle_center_x: float = player.rail.start.x + diff_x * player.position.position paddle_center_x: float = player.rail.start.x + diff_x * player.position.location
paddle_center_y: float = player.rail.start.y + diff_y * player.position.position paddle_center_y: float = player.rail.start.y + diff_y * player.position.location
paddle_center: Point = Point(paddle_center_x, paddle_center_y) paddle_center: Point = Point(paddle_center_x, paddle_center_y)
rail_length: float = player.rail.length() rail_length: float = player.rail.length()
paddle_length: float = rail_length * config.PADDLE_RATIO; paddle_length: float = rail_length * config.PADDLE_RATIO
start_x: float = paddle_center.x - (diff_x * (paddle_length / 2 / rail_length)) start_x: float = paddle_center.x - (diff_x * (paddle_length / 2 / rail_length))
start_y: float = paddle_center.y - (diff_y * (paddle_length / 2 / rail_length)) start_y: float = paddle_center.y - (diff_y * (paddle_length / 2 / rail_length))
@ -215,7 +212,7 @@ async def paddle_collision(game: Game, impact: Point, player: Player, inc_x: flo
return new_angle return new_angle
async def collision(game: Game, impact_data: dict) -> bool: async def collision(game: PongGame, impact_data: dict) -> bool:
segment: Segment = impact_data.get("segment") segment: Segment = impact_data.get("segment")
@ -242,7 +239,7 @@ async def collision(game: Game, impact_data: dict) -> bool:
return True return True
async def update_ball(game: Game, impact_data: dict) -> None: async def update_ball(game: PongGame, impact_data: dict) -> None:
distance: float = impact_data.get("distance") distance: float = impact_data.get("distance")
@ -260,7 +257,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_ball(game: Game): async def render_ball(game: PongGame):
while True: while True:
@ -270,7 +267,7 @@ async def render_ball(game: Game):
await update_ball(game, impact_data) await update_ball(game, impact_data)
async def render_players(game: Game): async def render_players(game: PongGame):
while True: while True:
@ -281,7 +278,7 @@ async def render_players(game: Game):
await asyncio.sleep(1 / config.SERVER_TPS) await asyncio.sleep(1 / config.SERVER_TPS)
async def render(game: Game): async def render(game: PongGame):
routine_ball = asyncio.create_task(render_ball(game)) routine_ball = asyncio.create_task(render_ball(game))
routine_players = asyncio.create_task(render_players(game)) routine_players = asyncio.create_task(render_players(game))
@ -293,6 +290,6 @@ async def render(game: Game):
return return
await asyncio.sleep(0.3) await asyncio.sleep(0.3)
def routine(game: Game): def routine(game: PongGame):
asyncio.run(render(game)) asyncio.run(render(game))