Exemple #1
0
class Client:
    def __init__(self, ip: str, port: str, player_name: str):
        self._url = f'http://{ip}:{port}'
        self._name = player_name
        self._map = None
        self._font_size = 13
        self._entities = {}
        self.connect()
        self._window = GraphWin('GAY', self._map.length, self._map.height)
        self._pressed = {}

    def post(self, request_type: str, request_body: Map = {}):
        request_body['player_name'] = self._name
        return requests.post(self._url, json={
            'request_type': request_type,
            'request_body': request_body
        }).json()

    def connect(self):
        # Try until the connection is up
        connected = False
        while not connected:
            try:
                requests.get(self._url)
                connected = True
            except:
                pass

        print(f'Connected to {self._url}')

        # Kick all other players
        #self.post('kick_all')
        response_json = self.post('add_player')

        # return {'rez': 'success', 'map_name': self._map.map_name, 'new_name': player_name}
        self._name = response_json['new_name']
        self._map = Map(response_json['map_name'])
        print(f'Name is {self._name}')
        print(f'Playing on map {self._map.map_name}')

    def draw(self):
        self._map.draw_stage(self._window)
        print('done drawing stage')
        while True:
            entity_info = None
            try:
                entity_info = requests.get(self._url).json()
            except:
                print('Problem with the server, shutting down')
            for player, player_info in entity_info.items():

                x, y = player_info['x_coord'], player_info['y_coord']
                height, width = player_info['height'], player_info['width']
                color = player_info['color']

                name_tag_x = x + width / 2
                name_tag_y = y - height - self._font_size
                if f'{player}_name' in self._entities:
                    item = self._entities[f'{player}_name']
                    item.move(name_tag_x - item.getAnchor().getX(),
                              name_tag_y - item.getAnchor().getY())
                else:
                    text = Text(Point(name_tag_x, name_tag_y), player)
                    text.setSize(self._font_size)
                    text.draw(self._window)
                    self._entities[f'{player}_name'] = text

                if player in self._entities:
                    item = self._entities[player]
                    item.move(x - item.getP1().getX(), y - item.getP1().getY())
                else:
                    rect = Rectangle(Point(x, y), Point(x + width, y - height))
                    rect.setFill(color)
                    rect.draw(self._window)
                    self._entities[player] = rect

            k = self._window.checkKey()
            if k == 'Left' or k == 'Right':
                self._pressed[k] = True
            elif k == '':
                self._pressed = {}
            if 'Left' in self._pressed:
                self.post('move_left')
            if 'Right' in self._pressed:
                self.post('move_right')
        self._window.getMouse()
        self._window.close()