L3-Bataille-Navale/source/gui/scene/Game.py

204 lines
5.4 KiB
Python

import socket
from typing import TYPE_CHECKING
import pyglet
from source.gui.scene.abc import Scene
from source.gui import widget, texture
from source.gui.widget.grid import GameGridAlly, GameGridEnemy
from source import core
from source.network.packet import PacketChat, PacketBombPlaced, PacketBoatPlaced
from source.type import Point2D
if TYPE_CHECKING:
from source.gui.window import Window
class Game(Scene):
def __init__(self, window: "Window", connection: socket.socket, **kwargs):
super().__init__(window, **kwargs)
self.connection = connection
self.batch_label = pyglet.graphics.Batch()
self.batch_button_background = pyglet.graphics.Batch()
self.batch_input_background = pyglet.graphics.Batch()
self.batch_grid_background = pyglet.graphics.Batch()
self.batch_grid_line = pyglet.graphics.Batch()
self.batch_grid_cursor = pyglet.graphics.Batch()
self.batch_grid_boat = pyglet.graphics.Batch()
self.batch_grid_bomb = pyglet.graphics.Batch()
self.background = self.add_widget(
widget.Image,
x=0, y=0, width=1.0, height=1.0,
image=texture.Background.game,
)
self.grid_ally = self.add_widget(
GameGridAlly,
x=75, y=0.25, width=0.35, height=0.5,
boats_length=[5, 5, 4, 3, 2],
grid_style=texture.Grid.Style1,
boat_style=texture.Grid.Boat.Style1,
rows=8, columns=8,
background_batch=self.batch_grid_background,
line_batch=self.batch_grid_line,
cursor_batch=self.batch_grid_cursor,
boat_batch=self.batch_grid_boat,
)
def board_ally_ready():
PacketBoatPlaced().send_connection(connection)
self.grid_ally.add_listener("on_all_boats_placed", board_ally_ready)
self.grid_enemy = self.add_widget(
GameGridEnemy,
x=lambda widget: widget.scene.window.width - 75 - widget.width, y=0.25, width=0.35, height=0.5,
grid_style=texture.Grid.Style1,
bomb_style=texture.Grid.Bomb.Style1,
rows=8, columns=8,
background_batch=self.batch_grid_background,
line_batch=self.batch_grid_line,
cursor_batch=self.batch_grid_cursor,
bomb_batch=self.batch_grid_bomb
)
def board_enemy_bomb(cell: Point2D):
PacketBombPlaced(position=cell).send_connection(connection)
self.grid_enemy.add_listener("on_request_place_bomb", board_enemy_bomb)
self.name_ally = self.add_widget(
widget.Text,
x=0.27, y=0.995,
text="Raphael",
font_size=20,
anchor_x="center", anchor_y="center",
batch=self.batch_label,
)
self.name_enemy = self.add_widget(
widget.Text,
x=0.73, y=0.995,
text="Leo",
font_size=20,
anchor_x="center", anchor_y="center",
batch=self.batch_label,
)
self.score_ally = self.add_widget(
widget.Text,
x=0.44, y=0.995,
text="7",
font_size=25,
anchor_x="center", anchor_y="center",
batch=self.batch_label,
)
self.score_enemy = self.add_widget(
widget.Text,
x=0.56, y=0.995,
text="5",
font_size=25,
anchor_x="center", anchor_y="center",
batch=self.batch_label,
)
self.chat_log = self.add_widget(
widget.Text,
x=10, y=35, width=0.5,
text="",
anchor_x="left",
multiline=True,
batch=self.batch_label,
)
self.chat_input = self.add_widget(
widget.Input,
x=10, y=10, width=0.5, height=30,
style=texture.Button.Style1,
background_batch=self.batch_input_background,
label_batch=self.batch_label,
)
def send_chat():
text = self.chat_input.text
self.chat_input.text = ""
self.chat_log.text += "\n" + text
self.chat_log.label.y = self.chat_log.y + self.chat_log.label.content_height
PacketChat(message=text).send_connection(connection)
self.chat_input.add_listener("on_enter", send_chat)
self.button_save = self.add_widget(
widget.Button,
x=0.7, y=0, width=0.15, height=0.1,
label_text="Sauvegarder",
style=texture.Button.Style1,
background_batch=self.batch_button_background,
label_batch=self.batch_label,
)
self.button_quit = self.add_widget(
widget.Button,
x=0.85, y=0, width=0.15, height=0.1,
label_text="Quitter",
style=texture.Button.Style1,
background_batch=self.batch_button_background,
label_batch=self.batch_label,
)
self.board_ally = core.Board(rows=8, columns=8)
self.board_enemy = core.Board(rows=8, columns=8)
def on_draw(self):
self.background.draw()
self.batch_button_background.draw()
self.batch_input_background.draw()
self.batch_grid_background.draw()
self.batch_grid_boat.draw()
self.batch_grid_bomb.draw()
self.batch_grid_line.draw()
self.batch_grid_cursor.draw()
self.batch_label.draw()