Esempio n. 1
0
class Client:
    def __init__(self, size, fps, client_name):
        """ init block """
        pygame.init()
        pygame.font.init()
        pygame.joystick.init()
        """ display block """

        self.request_list = []

        self.resolution = size
        self.fps = fps
        self.icon = None
        self.caption = "Caster-Game"
        self.screen = pygame.display.set_mode(self.resolution,
                                              pygame.RESIZABLE)
        self.camera = Camera(self.resolution)

        self.camera_target = None
        self.is_camera_target = False

        self.name = client_name

        self.init()
        """ input block """

        # self.joys = [pygame.joystick.Joystick(i) for i in range(pygame.joystick.get_count())]
        # for j in self.joys:
        #     j.init()
        """ handlers block """

        self.keydown_handlers = defaultdict(list)
        self.keyup_handlers = defaultdict(list)
        self.mouse_handlers = []
        self.event_list = []
        """ game const block """

        self.play = True
        self.output = []
        """ interface block """

        self.buttons = ButtonGroup()
        """ ingame block """

        self.objects = GameGroup()
        self.background = pygame.Surface(self.resolution)
        self.background.fill((254, 65, 43))
        self.session = None

    def init(self):
        '''Нужно для загрузки изображений'''
        gameconsts.image_player = load_image("..//..//resources//green.png")
        gameconsts.image_brick = load_image("..//..//resources//brick.png")
        gameconsts.image_mob = load_image("..//..//resources//red.png")
        gameconsts.image_bullet = load_image("..//..//resources//blue8x8.png")
        gameconsts.init()
        self.camera_target = ClientGameObject(0, 0, 3, -1)

    def set_caption(self, caption):
        self.caption = caption
        pygame.display.set_caption(self.caption)

    def set_icon(self, img):
        self.icon = img
        pygame.display.set_icon(img)

    def load_icon(self, icon):
        self.icon = pygame.image.load(icon)

    def set_resolution(self, resolution):
        self.resolution = resolution
        self.screen = pygame.display.set_mode(resolution)
        self.camera.set_size(resolution)

    def handler(self):
        for event in pygame.event.get():
            if event.type == pygame.MOUSEMOTION:
                cam_pos = (self.camera.global_rect.x,
                           self.camera.global_rect.y)
                pos = (cam_pos[0] + event.pos[0], cam_pos[1] + event.pos[1])
                packet = [pygame.MOUSEMOTION, pos]
                self.output.append(packet)
            elif event.type in {pygame.KEYUP, pygame.KEYDOWN}:
                packet = [event.type, event.key]
                self.output.append(packet)
            elif event.type in {pygame.MOUSEBUTTONUP, pygame.MOUSEBUTTONDOWN}:
                packet = [event.type, event.button]
                self.output.append(packet)
            else:
                pass

    def update_display(self):
        self.screen.blit(self.background, (0, 0))
        self.camera.update(self.camera_target)
        self.camera.apply(self.objects)
        self.objects.draw(self.screen)
        self.buttons.draw(self.screen)
        pygame.display.flip()

    def connect_to_server(self, host, port):
        self.session = TCPClientConnection(host, port)
        self.session.connect()
        self.session.start()

    def create_object(self, packet):
        cl_obj = ClientGameObject(packet[3][0], packet[3][1], packet[1],
                                  packet[2])
        if (not self.is_camera_target) and (cl_obj.class_id == 3):
            self.camera_target = cl_obj
            self.is_camera_target = True
        self.objects[cl_obj.id] = cl_obj
        print('Object {} from packet {}'.format(object, packet))

    def move_object(self, packet):
        self.objects[packet[1]].x = packet[2][0]
        self.objects[packet[1]].y = packet[2][1]

    def remove_object(self, packet):
        del self.objects[packet[1]]
        print('deleted {}'.format(packet[1]))

    def send(self):
        """send information to server"""
        output = copy.copy(self.output)
        self.session.send(output)
        self.output.clear()
        self.request_list.clear()

    def receive(self):
        """receive information from server"""
        data = self.session.get_input()
        for packet in data:
            if packet[0] == 0:
                self.create_object(packet)
            elif packet[0] == 1:
                try:
                    self.move_object(packet)
                except KeyError:
                    request = ['request', packet[1]]
                    '''Проверка на то, что мы еще не отправляли этот запрос на данном тике'''
                    if packet[1] not in self.request_list:
                        self.request_list.append(packet[1])
                        print('request for {}'.format(packet[1]))
                        self.output.append(request)
            elif packet[0] == 2:
                try:
                    self.remove_object(packet)
                except KeyError:
                    print('Object with id {} doesn\'t exist'.format(packet[1]))
Esempio n. 2
0
class Caster:
    def __init__(self, resolution):
        '''Настройка pygame дисплея'''
        self.resolution = resolution
        self.background = pygame.Surface(self.resolution)
        self.background.fill((254, 65, 43))

        pygame.init()

        self.screen = pygame.display.set_mode(self.resolution,
                                              pygame.FULLSCREEN)
        self.init()
        '''Список хендлеров'''
        self.keydown_handlers = defaultdict(list)
        self.keyup_handlers = defaultdict(list)
        self.mouse_handlers = []
        '''Камера и объекты'''
        self.camera = Camera(self.resolution)
        self.objects = pygame.sprite.Group()
        self.mobs = pygame.sprite.Group()
        '''Создание игрока'''
        self.player = Player(80, 120, self)
        self.player.set_controller(self.keydown_handlers, self.keyup_handlers,
                                   self.mouse_handlers)
        self.objects.add(self.player)
        '''Мировые эффекты и события'''
        self.action_list = []
        '''Добавляю тест-объекты'''
        for i in range(2):
            brick = Brick(32 + config.width_brick * i * 2, 360, self)
            self.objects.add(brick)
            mob = Mob(32, 180 + config.width_mob * i * 2, self)
            self.objects.add(mob)
            self.mobs.add(mob)

        self.camera.apply(self.objects)

    def init(self):
        '''Нужно для загрузки изображений'''
        config.image_player = load_image("..//resources//green.png")
        config.image_brick = load_image("..//resources//brick.png")
        config.image_mob = load_image("..//resources//red.png")
        config.image_bullet = load_image("..//resources//blue8x8.png")

    def handler(self):
        '''Просто хендлер, внутренняя логика игры'''
        for event in pygame.event.get():
            if event.type == pygame.QUIT:
                pygame.quit()
            elif event.type == pygame.KEYDOWN:
                for handler in self.keydown_handlers[event.key]:
                    handler(event.key)
            elif event.type == pygame.KEYUP:
                for handler in self.keyup_handlers[event.key]:
                    handler(event.key)
            elif event.type in {pygame.MOUSEBUTTONDOWN, pygame.MOUSEBUTTONUP}:
                for handler in self.mouse_handlers:
                    handler(event.pos, event.button)
            elif event.type == pygame.MOUSEMOTION:
                pass
            elif event.type == config.event_spell:
                event.spell.cast_spell(self, event.pos)
            elif event.type == config.event_scroll:
                event.scroll.use_scroll(self, event.pos)
            elif event.type == config.event_calculate_behavior:
                pass

    def update(self, dt):
        for action in self.action_list:
            if not action.is_alive:
                action.kill(self.action_list)
                continue
            action.update(dt)

        for o in self.objects:
            collide_objects = collide_sprite(o, self.objects)
            for obj in collide_objects:
                obj.on_collision(o)

        for m in self.mobs:
            m.calculate_action(target=self.player)

        for o in self.objects:
            o.update(dt)

        self.camera.update(self.player)

    def render(self):
        self.screen.blit(self.background, (0, 0))
        self.camera.apply(self.objects)
        self.objects.draw(self.screen)
        pygame.display.flip()

    def start(self):
        clock = pygame.time.Clock()
        while True:
            self.handler()
            self.update(clock.get_time())
            self.render()
            clock.tick(60)
            print(1000 / clock.get_time())