[[:oktatas:programozás:python|< Python]] ====== PyGame ====== * **Szerző:** Sallai András * Copyright (c) 2020, Sallai András * Licenc: [[https://creativecommons.org/licenses/by-sa/4.0/|CC BY-SA 4.0]] * Web: https://szit.hu ===== PyGame kezdés ===== import pygame import time pygame.init() display = pygame.display.set_mode((400, 250)) pygame.display.set_caption('Teszt') time.sleep(5) pygame.quit() quit() ===== Események ===== import pygame pygame.init() display = pygame.display.set_mode((400, 250)) pygame.display.set_caption('Teszt') gameEnd = False while not gameEnd: for event in pygame.event.get(): if event.type == pygame.QUIT: pygame.quit() quit() ===== Kurzormozgatók ===== import pygame pygame.init() display = pygame.display.set_mode((400, 250)) pygame.display.set_caption('Teszt') gameEnd = False while not gameEnd: for event in pygame.event.get(): if event.type == pygame.QUIT: pygame.quit() quit() if event.type == pygame.KEYDOWN: if event.key == pygame.K_LEFT: print("Balra") if event.key == pygame.K_RIGHT: print("Jobb") if event.key == pygame.K_UP: print("Fel") if event.key == pygame.K_DOWN: print("Le") ===== Események megtekintése ===== import pygame pygame.init() display = pygame.display.set_mode((640, 480)) pygame.display.set_caption('Teszt') clock = pygame.time.Clock() while True: for event in pygame.event.get(): if event.type == pygame.QUIT: pygame.quit() quit() print(event) pygame.display.update() clock.tick(1) ===== Osztály használata ===== import pygame class Jatek(object): def main(self, kepernyo): while True: for event in pygame.event.get(): if event.type == pygame.QUIT: return if event.type == pygame.KEYDOWN and \ event.key == pygame.K_ESCAPE: return if __name__ == '__main__': pygame.init() kepernyo = pygame.display.set_mode((640, 480)) Jatek().main(kepernyo) ===== Rajzolás a képernyőre ===== 0 -> X 640 0 |------------------| | | | | | v | | | | | | Y | | | | 480 |------------------| ===== Kép beillesztése ===== import pygame class Jatek(object): def main(self, kepernyo): kep = pygame.image.load('kep.png') while True: for event in pygame.event.get(): if event.type == pygame.QUIT: return if event.type == pygame.KEYDOWN and \ event.key == pygame.K_ESCAPE: return kepernyo.fill((200, 200, 200)) # A képernyő színezése kepernyo.blit(kep, (100, 100)) # A kép elhelyezése pygame.display.flip() # A puffer megjelenítése if __name__ == '__main__': pygame.init() kepernyo = pygame.display.set_mode((640, 480)) Jatek().main(kepernyo) ===== Kevesebb processzoridő beállítása ===== import pygame class Jatek(object): def main(self, kepernyo): clock = pygame.time.Clock() kep = pygame.image.load('kep.png') while True: clock.tick(30) for event in pygame.event.get(): if event.type == pygame.QUIT: return if event.type == pygame.KEYDOWN and \ event.key == pygame.K_ESCAPE: return kepernyo.fill((200, 200, 200)) kepernyo.blit(kep, (100, 100)) pygame.display.flip() if __name__ == '__main__': pygame.init() kepernyo = pygame.display.set_mode((640, 480)) Jatek().main(kepernyo) ===== Animáció ===== import pygame class Jatek(object): def main(self, kepernyo): clock = pygame.time.Clock() kep = pygame.image.load('kep.png') kep_x = 250 kep_y = 150 while True: clock.tick(30) for event in pygame.event.get(): if event.type == pygame.QUIT: return if event.type == pygame.KEYDOWN and \ event.key == pygame.K_ESCAPE: return kep_x += 10 kepernyo.fill((200, 200, 200)) # ~ kepernyo.blit(kep, (100, 100)) kepernyo.blit(kep, (kep_x, kep_y)) pygame.display.flip() if __name__ == '__main__': pygame.init() kepernyo = pygame.display.set_mode((640, 480)) Jatek().main(kepernyo) ===== Kurzormozgatók figyelése ===== import pygame class Jatek(object): def main(self, kepernyo): clock = pygame.time.Clock() kep = pygame.image.load('kep.png') kep_x = 250 kep_y = 150 while True: clock.tick(30) for event in pygame.event.get(): if event.type == pygame.QUIT: return if event.type == pygame.KEYDOWN and \ event.key == pygame.K_ESCAPE: return # ~ kep_x += 10 key = pygame.key.get_pressed() if key[pygame.K_LEFT]: kep_x -= 10 if key[pygame.K_RIGHT]: kep_x += 10 if key[pygame.K_UP]: kep_y -= 10 if key[pygame.K_DOWN]: kep_y += 10 kepernyo.fill((200, 200, 200)) # ~ kepernyo.blit(kep, (100, 100)) kepernyo.blit(kep, (kep_x, kep_y)) pygame.display.flip() if __name__ == '__main__': pygame.init() kepernyo = pygame.display.set_mode((640, 480)) Jatek().main(kepernyo) ===== Egéresemények ===== * MOUSEBUTTONDOWN * MOUSEBUTTONUP * MOUSEMOTION ===== Jatekos osztály ===== import pygame class Jatekos(pygame.sprite.Sprite): def __init__(self, *groups): super(Jatekos, self).__init__(*groups) self.image = pygame.image.load('jatekos.png') self.rect = pygame.rect.Rect((320, 240), self.image.get_size()) def update(self): key = pygame.key.get_pressed() if key[pygame.K_LEFT]: self.rect.x -= 10 if key[pygame.K_RIGHT]: self.rect.x += 10 if key[pygame.K_UP]: self.rect.y -= 10 if key[pygame.K_DOWN]: self.rect.y += 10 class Jatek(object): def main(self, kepernyo): clock = pygame.time.Clock() sprites = pygame.sprite.Group() self.player = Jatekos(sprites) while True: clock.tick(30) for event in pygame.event.get(): if event.type == pygame.QUIT: return if event.type == pygame.KEYDOWN and \ event.key == pygame.K_ESCAPE: return sprites.update() kepernyo.fill((200, 200, 200)) sprites.draw(kepernyo) pygame.display.flip() if __name__ == '__main__': pygame.init() kepernyo = pygame.display.set_mode((640, 480)) Jatek().main(kepernyo) ===== Háttér ===== import pygame class Jatekos(pygame.sprite.Sprite): def __init__(self, *groups): super(Jatekos, self).__init__(*groups) self.image = pygame.image.load('jatekos.png') self.rect = pygame.rect.Rect((320, 240), self.image.get_size()) def update(self, dt): key = pygame.key.get_pressed() if key[pygame.K_LEFT]: self.rect.x -= 300 * dt if key[pygame.K_RIGHT]: self.rect.x += 300 * dt if key[pygame.K_UP]: self.rect.y -= 300 * dt if key[pygame.K_DOWN]: self.rect.y += 300 * dt class Jatek(object): def main(self, kepernyo): clock = pygame.time.Clock() background = pygame.image.load('hatter.png') sprites = pygame.sprite.Group() self.player = Jatekos(sprites) while True: dt = clock.tick(30) for event in pygame.event.get(): if event.type == pygame.QUIT: return if event.type == pygame.KEYDOWN and \ event.key == pygame.K_ESCAPE: return sprites.update(dt / 1000.) # ~ kepernyo.fill((200, 200, 200)) kepernyo.blit(background, (0, 0)) sprites.draw(kepernyo) pygame.display.flip() if __name__ == '__main__': pygame.init() kepernyo = pygame.display.set_mode((640, 480)) Jatek().main(kepernyo) ===== Finom időzítés ===== import pygame class Jatekos(pygame.sprite.Sprite): def __init__(self, *groups): super(Jatekos, self).__init__(*groups) self.image = pygame.image.load('jatekos.png') self.rect = pygame.rect.Rect((320, 240), self.image.get_size()) def update(self, dt): key = pygame.key.get_pressed() if key[pygame.K_LEFT]: self.rect.x -= 300 * dt if key[pygame.K_RIGHT]: self.rect.x += 300 * dt if key[pygame.K_UP]: self.rect.y -= 300 * dt if key[pygame.K_DOWN]: self.rect.y += 300 * dt class Jatek(object): def main(self, kepernyo): clock = pygame.time.Clock() sprites = pygame.sprite.Group() self.player = Jatekos(sprites) while True: dt = clock.tick(30) for event in pygame.event.get(): if event.type == pygame.QUIT: return if event.type == pygame.KEYDOWN and \ event.key == pygame.K_ESCAPE: return sprites.update(dt / 1000.) kepernyo.fill((200, 200, 200)) sprites.draw(kepernyo) pygame.display.flip() if __name__ == '__main__': pygame.init() kepernyo = pygame.display.set_mode((640, 480)) Jatek().main(kepernyo) ===== Ütközésfigyelés ===== import pygame class Jatekos(pygame.sprite.Sprite): def __init__(self, *groups): super(Jatekos, self).__init__(*groups) self.image = pygame.image.load('jatekos.png') self.rect = pygame.rect.Rect((320, 240), self.image.get_size()) def update(self, dt, game): last = self.rect.copy() key = pygame.key.get_pressed() if key[pygame.K_LEFT]: self.rect.x -= 300 * dt if key[pygame.K_RIGHT]: self.rect.x += 300 * dt if key[pygame.K_UP]: self.rect.y -= 300 * dt if key[pygame.K_DOWN]: self.rect.y += 300 * dt for cell in pygame.sprite.spritecollide(self, game.walls, False): self.rect = last class Jatek(object): def main(self, kepernyo): clock = pygame.time.Clock() background = pygame.image.load('hatter.png') sprites = pygame.sprite.Group() self.player = Jatekos(sprites) self.walls = pygame.sprite.Group() szikla = pygame.image.load('szikla.png') for x in range(0, 640, 32): for y in range(0, 480, 32): if x in (0, 640-32) or y in (0, 480-32): wall = pygame.sprite.Sprite(self.walls) wall.image = szikla wall.rect = pygame.rect.Rect((x, y), wall.image.get_size()) sprites.add(self.walls) while True: dt = clock.tick(30) for event in pygame.event.get(): if event.type == pygame.QUIT: return if event.type == pygame.KEYDOWN and \ event.key == pygame.K_ESCAPE: return sprites.update(dt / 1000., self) kepernyo.blit(background, (0, 0)) sprites.draw(kepernyo) pygame.display.flip() if __name__ == '__main__': pygame.init() kepernyo = pygame.display.set_mode((640, 480)) Jatek().main(kepernyo) ===== Gravitáció ugró játékossal ===== import pygame class Jatekos(pygame.sprite.Sprite): def __init__(self, *groups): super(Jatekos, self).__init__(*groups) self.image = pygame.image.load('jatekos.png') self.rect = pygame.rect.Rect((320, 240), self.image.get_size()) self.resting = False self.dy = 0 def update(self, dt, game): last = self.rect.copy() key = pygame.key.get_pressed() if key[pygame.K_LEFT]: self.rect.x -= 300 * dt if key[pygame.K_RIGHT]: self.rect.x += 300 * dt # ~ if key[pygame.K_UP]: # ~ self.rect.y -= 300 * dt # ~ if key[pygame.K_DOWN]: # ~ self.rect.y += 300 * dt if self.resting and key[pygame.K_SPACE]: self.dy = -500 self.dy = min(400, self.dy + 40) self.rect.y += self.dy * dt new = self.rect self.resting = False for cell in pygame.sprite.spritecollide(self, game.walls, False): # ~ self.rect = last cell = cell.rect if last.right <= cell.left and new.right > cell.left: new.right = cell.left if last.left >= cell.right and new.left < cell.right: new.left = cell.right if last.bottom <= cell.top and new.bottom > cell.top: self.resting = True new.bottom = cell.top self.dy = 0 if last.top >= cell.bottom and new.top < cell.bottom: new.top = cell.bottom self.dy = 0 class Jatek(object): def main(self, kepernyo): clock = pygame.time.Clock() background = pygame.image.load('hatter.png') sprites = pygame.sprite.Group() self.player = Jatekos(sprites) self.walls = pygame.sprite.Group() szikla = pygame.image.load('szikla.png') for x in range(0, 640, 32): for y in range(0, 480, 32): if x in (0, 640-32) or y in (0, 480-32): wall = pygame.sprite.Sprite(self.walls) wall.image = szikla wall.rect = pygame.rect.Rect((x, y), wall.image.get_size()) sprites.add(self.walls) while True: dt = clock.tick(30) for event in pygame.event.get(): if event.type == pygame.QUIT: return if event.type == pygame.KEYDOWN and \ event.key == pygame.K_ESCAPE: return sprites.update(dt / 1000., self) kepernyo.blit(background, (0, 0)) sprites.draw(kepernyo) pygame.display.flip() if __name__ == '__main__': pygame.init() kepernyo = pygame.display.set_mode((640, 480)) Jatek().main(kepernyo) ===== PyGame és OpenGL ===== ==== Telepítés ==== pip3 install pygame Szükséges még a OpenGL: pip3 install pyopengl pyopengl-accelerate ==== Ellenőrzés ==== Indítsuk el az IDLE programot. Mondjuk írjuk be parancssorba: idle Majd python értelmezőbe írjuk be: import pygame import OpenGL Ha nem kapunk hibaüzenetet, akkor rendben telepítve van. ==== Kezdés ==== Egy tipikus PyGame programot így szokás kezdeni: import pygame from pygame.locals import * from OpenGL.GL import * from OpenGL.GLU import * Importáljuk a pygame modult és a pygame.locals-t. Ezt követően a OpenGL.GL, és az OpenGL.GLU modulokra lesz szükségünk. ==== Vonal ==== #!/usr/bin/python3 import pygame from pygame.locals import * from OpenGL.GL import * from OpenGL.GLU import * def Haromszog(): glBegin(GL_LINES) glVertex3f(-0.5, 0.5, 0) glVertex3f(0.5, 0, 0) glVertex3f(-0.5, -0.5, 0) glEnd() def main(): pygame.init() display = (800, 600) pygame.display.set_mode(display, DOUBLEBUF|OPENGL) gluPerspective(45, (display[0]/display[1]), 0.1, 50.0) glTranslatef(0.0, 0.0, -5) while True: for event in pygame.event.get(): if event.type == pygame.QUIT: pygame.quit() quit() glRotatef(1, 3, 1, 1) glClear(GL_COLOR_BUFFER_BIT|GL_DEPTH_BUFFER_BIT) Haromszog() pygame.display.flip() pygame.time.wait(10) main() ===== Források ===== * https://pythonprogramming.net/opengl-rotating-cube-example-pyopengl-tutorial/ (2020) * https://pythonprogramming.net/pygame-python-3-tutorial-series/ (2020) * Richard Jones: Introduction to game programming - PyCon 2014 * https://www.youtube.com/watch?v=bMt47wvK6u0&feature=emb_err_woyt