self.prev_click_time = pygame.time.get_ticks() # Отлавливаем сбытие "Клик" на нашем объекте if event.type == pygame.MOUSEBUTTONDOWN or event.type == pygame.MOUSEBUTTONUP: if self.rect.collidepoint(event.pos): if self.last_mouse_event == pygame.MOUSEBUTTONDOWN and event.type == pygame.MOUSEBUTTONUP: clickevent = pygame.event.Event(CLICK, pos=event.pos, target = self) pygame.event.post(clickevent) self.last_mouse_event = event.type elif event.type == pygame.MOUSEMOTION: self.last_mouse_event = event.type def update(self, dt): """ Обновляем состояние(местоположение, угол поворота и т.п.) объекта Этот метод должен вызываться перед отрисовкой каждого кадра Как правило, из данного метода вызываются другие методы, которые изменяют нужное состояние объекта """ pass def render(self, screen): """ Отрисовываем объект на поверхность screen """ screen.blit(self.image, self.rect) if __name__ == "__main__": main = PyMain(width=800, height=600) main.add_render_object(Bar(pos=(50,50), size=(50,50))) main.add_render_object(Bar(pos=(120,150), size=(60,60))) main.MainLoop(FPS=120)
acceleration = "катимся" elif self.keys_state & mask_up == mask_up: acceleration = "газуем" elif self.keys_state & mask_down == mask_down: acceleration = "тормозим" else: acceleration = "катимся" print(dir, acceleration) def change_mask(self, event_key): """ Изменяем маску в зависимости от нажатых/отпущенных клавиш :param event_key: событие клавиши """ if event_key.key in self.keys: # Обрабатываем только нужные клавиши if event_key.type == KEYDOWN: self.keys_state |= 0b1000 >> self.keys.index(event_key.key) if event_key.type == KEYUP: self.keys_state ^= 0b1000 >> self.keys.index(event_key.key) # Учтите: большинство обычных клавиатур не могут одновременно обрабатывать больше определенного кол-ва # нажатых клавиш (это собенность работы контроллера клавиатуры) # Учтите: Маска 0b0010 отбражается на экране как 0b10. мы же не пишем 002, пишем 2 print(bin(self.keys_state)) if __name__ == "__main__": main = PyMain(width=800, height=600) main.add_none_render_object(Keys()) main.MainLoop(FPS=40)
def __init__(self, hero, width=640, height=480): PyMain.__init__(self, width, height) self.hero = hero
import pygame import json import os from pygame import * from Classes.PyMain import PyMain from Classes.Player import Player from Classes.Camera import Camera FPS = 30 WIN_WIDTH = 700 WIN_HEIGHT = 600 DISPLAY = (WIN_WIDTH, WIN_HEIGHT) BACKGROUND_COLOR = (0, 0, 0) pygame.init() f = open(os.path.join("Maps", "test_map.json")) json_map = json.load(f) f.close() f = open(os.path.join("Descriptions", "objects.json")) description = json.load(f) f.close() main = PyMain(json_map, description, width=WIN_WIDTH, height=WIN_HEIGHT) hero = Player(main.start_pos[0], main.start_pos[1]) main.mainloop(hero, fps=FPS) # Главный цикл
if event.type == pygame.MOUSEBUTTONDOWN or event.type == pygame.MOUSEBUTTONUP: if self.rect.collidepoint(event.pos): if self.last_mouse_event == pygame.MOUSEBUTTONDOWN and event.type == pygame.MOUSEBUTTONUP: clickevent = pygame.event.Event(CLICK, pos=event.pos, target=self) pygame.event.post(clickevent) self.last_mouse_event = event.type elif event.type == pygame.MOUSEMOTION: self.last_mouse_event = event.type def update(self, dt): """ Обновляем состояние(местоположение, угол поворота и т.п.) объекта Этот метод должен вызываться перед отрисовкой каждого кадра Как правило, из данного метода вызываются другие методы, которые изменяют нужное состояние объекта """ pass def render(self, screen): """ Отрисовываем объект на поверхность screen """ screen.blit(self.image, self.rect) if __name__ == "__main__": main = PyMain(width=800, height=600) main.add_render_object(Bar(pos=(50, 50), size=(50, 50))) main.add_render_object(Bar(pos=(120, 150), size=(60, 60))) main.MainLoop(FPS=120)
image_names, path='../Images/Buttons', pos=(0, 0), function=None, text='Simple Button'): super().__init__(image_names, path, pos, function, text) self.images["clicked"] = load_image(image_names[-1], path=path, alpha_channel=True) self.clicked = False def events(self, event): super().event(event) if self.status == 'click': self.clicked = True if self.status == 'normal' and self.clicked: self.status = 'clicked' if __name__ == "__main__": main = PyMain(width=800, height=600) main.add_render_object( OffButton(image_names=('button_on.png', 'button_hover.png', 'button_click.png', 'button_off.png'), pos=(50, 50))) main.add_render_object( Button(image_names=('button_on.png', 'button_hover.png', 'button_click.png'), pos=(350, 50))) main.MainLoop(FPS=120)
self.set_num(self.num - 1) elif rect_right.collidepoint(xy): self.set_num(self.num + 1) else: return False def num_scroll(self): """ Метод переводящий, цифру положения ползунка в текст, для рендера """ if self.max_num != 0: # если максимальное значение ползунка не равно 0 (чтобы не было деления на ноль) self.num_text = Text(self.num, self.x_scroll + 19, self.y + 25) # и получившееся значение в текст else: self.num = str(self.min_num) self.num_text = Text(str(self.num), self.x_scroll + 19, self.y + 25) change_scroll = pygame.event.Event(CHANGE_SCROLL, num=self.num, sender=self) pygame.event.post(change_scroll) def get_num(self): return self.num def update(self, dt): pass if __name__ == "__main__": main = PyMain() scroll = ScrollBar(50, 50, max_num=50, text="Demo Scrolling") btn = Button() main.add_render_object(scroll) main.MainLoop()
def render(self, screen): screen.blit(self.images[self.status], self.rect) # смещение текста на центр картинки кнопки rect_text_x = self.rect.x + self.rect.w / 2 - self.text.get_rect().w / 2 rect_text_y = self.rect.y + self.rect.h / 2 - self.text.get_rect().h / 2 screen.blit(self.text, (rect_text_x, rect_text_y)) # Расширенный класс кнопки, с "потухшим" состоянием после клика п ней. class OffButton(Button): def __init__(self, image_names, path='../Images/Buttons', pos=(0, 0), function=None, text='Simple Button'): super().__init__(image_names, path, pos, function, text) self.images["clicked"] = load_image(image_names[-1], path=path, alpha_channel=True) self.clicked = False def events(self, event): super().event(event) if self.status == 'click': self.clicked = True if self.status == 'normal' and self.clicked: self.status = 'clicked' if __name__ == "__main__": main = PyMain(width=800, height=600) main.add_render_object( OffButton(image_names=('button_on.png', 'button_hover.png', 'button_click.png', 'button_off.png'), pos=(50, 50))) main.add_render_object(Button(image_names=('button_on.png', 'button_hover.png', 'button_click.png'), pos=(350, 50))) main.MainLoop(FPS=120)
def render(self, screen): angle_of_rotate = math.degrees(math.acos(self.speed.normalize().x)) #print(angle_of_rotate) if self.speed.y>0: angle_of_rotate = 360-angle_of_rotate rotated_img = pygame.transform.rotate(self.image, angle_of_rotate) rect_img = rotated_img.get_rect() rect_img.center = self.coords.as_point() # центр картинки приравниваем вектору позиции screen.blit(rotated_img, rect_img) # блитуем все на скрин Game_Object.render(self, screen) if __name__ == "__main__": from Classes.PyMain import PyMain mainWindow = PyMain(800,600) #vector = Game_Object((200,120),(30,0)) car = Car((300,150),(30,0)) trace = OutPutWindow((10,10)) #mainWindow.add_render_object(vector) mainWindow.add_render_object(trace) mainWindow.add_render_object(car) #trace.add_attr(vector, "speed") #trace.add_attr(vector, "len_speed") #trace.add_attr(vector, "acsel",) #trace.add_attr(vector, "len_acsel") mainWindow.MainLoop()
return False def num_scroll(self): """ Метод переводящий, цифру положения ползунка в текст, для рендера """ if self.max_num != 0: # если максимальное значение ползунка не равно 0 (чтобы не было деления на ноль) self.num_text = Text(self.num, self.x_scroll + 19, self.y + 25) # и получившееся значение в текст else: self.num = str(self.min_num) self.num_text = Text(str(self.num), self.x_scroll + 19, self.y + 25) change_scroll = pygame.event.Event(CHANGE_SCROLL, num=self.num, sender=self) pygame.event.post(change_scroll) def get_num(self): return self.num def update(self, dt): pass if __name__ == "__main__": main = PyMain() scroll = ScrollBar(50, 50, max_num=50, text="Demo Scrolling") btn = Button() main.add_render_object(scroll) main.MainLoop()
import pygame from pygame import * from Utilities.load_image import load_image from Classes.PyMain import PyMain from Classes.Player import Player from Classes.StaticObject import StaticObject FPS = 30 WIN_WIDTH = 700 WIN_HEIGHT = 600 DISPLAY = (WIN_WIDTH, WIN_HEIGHT) BACKGROUND_COLOR = (0, 0, 0) HERO_POSITION_X = 300 HERO_POSITION_Y = 300 pygame.init() main = PyMain(width=WIN_WIDTH, height=WIN_HEIGHT) hero = Player(HERO_POSITION_X, HERO_POSITION_Y) locker = StaticObject(200, 200, 'lockerx2.png', height=24) main.add_render_object({"object": locker, "fucntion": None}) main.mainloop(hero, fps=FPS) # Главный цикл