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]))
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())