דף עזר pygame
עודכן לאחרונה
התקנה ולולאת המשחק
כל תוכנית pygame פותחת חלון, ואז חוזרת על לולאה אחת עד שהשחקן יוצא.
| פעולה | קוד |
|---|---|
| התקנת pygame-ce | python3 -m pip install pygame-ce |
| ייבוא והפעלה של pygame | import pygame
pygame.init() |
| פתיחת חלון | screen = pygame.display.set_mode((640, 480)) |
| קביעת כותרת החלון | pygame.display.set_caption("My Game") |
| יצירת שעון | clock = pygame.time.Clock() |
| לולאת המשחק | running = True
while running:
for event in pygame.event.get():
if event.type == pygame.QUIT:
running = False
screen.fill("black")
pygame.display.flip()
clock.tick(60) |
| סגירה אחרי הלולאה | pygame.quit() |
מסך
המסך הוא Surface, ושום דבר לא מוצג עד שקוראים ל-flip.
| פעולה | קוד |
|---|---|
| הצגת הפריים המוכן | pygame.display.flip() |
| עדכון אזורים מסוימים בלבד | pygame.display.update([rect1, rect2]) |
| ניקוי המסך | screen.fill((30, 30, 46)) |
| גודל החלון | screen.get_size(), screen.get_width() |
| המסך כ-Rect | screen.get_rect() |
| חלון שאפשר לשנות את גודלו | pygame.display.set_mode((640, 480), pygame.RESIZABLE) |
| מסך מלא בגודל שולחן העבודה | pygame.display.set_mode((0, 0), pygame.FULLSCREEN) |
צבעים וציור
פונקציות pygame.draw מקבלות משטח, צבע ומיקום. width=0 ממלא את הצורה.
| פעולה | קוד |
|---|---|
| צבע כ-RGB | (255, 140, 0) |
| צבע לפי שם או בהקסדצימלי | "tomato", "#ff8c00", pygame.Color("gold") |
| מלבן | pygame.draw.rect(screen, "red", (x, y, w, h)) |
| מסגרת ופינות מעוגלות | pygame.draw.rect(screen, "red", rect, width=2, border_radius=8) |
| עיגול (לפי המרכז שלו) | pygame.draw.circle(screen, "blue", (cx, cy), radius) |
| קו | pygame.draw.line(screen, "white", (x1, y1), (x2, y2), 3) |
| מצולע | pygame.draw.polygon(screen, "green", [(0, 0), (40, 0), (20, 30)]) |
| אליפסה בתוך מלבן | pygame.draw.ellipse(screen, "purple", (x, y, w, h)) |
Rect
Rect שומר מיקום וגודל כמספרים שלמים.
| פעולה | קוד |
|---|---|
| יצירת Rect | player = pygame.Rect(x, y, width, height) |
| מיקום לפי כל נקודה | player.center = (320, 240), player.bottom = 400 |
| קצוות ופינות | left, right, top, bottom, topleft, midbottom |
| הזזה במקום | player.move_ip(dx, dy) |
| עותק מוזז | moved = player.move(dx, dy) |
| השארה בתוך המסך | player.clamp_ip(screen.get_rect()) |
| הגדלה סביב המרכז | bigger = player.inflate(20, 20) |
| מיקומים עשרוניים (pygame-ce) | pygame.FRect(10.5, 20.25, 40, 40) |
תמונות, Surface ו-blit
טוענים תמונות פעם אחת, לפני הלולאה, ומציירים אותן עם blit בכל פריים.
| פעולה | קוד |
|---|---|
| טעינת תמונה עם שקיפות | img = pygame.image.load("player.png").convert_alpha() |
| טעינת תמונה אטומה | bg = pygame.image.load("sky.png").convert() |
| ציור תמונה | screen.blit(img, (x, y)) |
| ציור במרכז | screen.blit(img, img.get_rect(center=(320, 240))) |
| Surface ריק חדש | panel = pygame.Surface((200, 100)) |
| Surface שקוף | layer = pygame.Surface((200, 100), pygame.SRCALPHA) |
| שקיפות חלקית ל-Surface שלם | img.set_alpha(128) |
| חיתוך פריים מגיליון ספרייטים | frame = sheet.subsurface((0, 0, 32, 32)) |
| שמירת צילום מסך | pygame.image.save(screen, "shot.png") |
טרנספורמציות
כל פונקציה מחזירה Surface חדש. בצעו את השינוי על המקור, לא על התוצאה האחרונה.
| פעולה | קוד |
|---|---|
| שינוי גודל | pygame.transform.scale(img, (64, 64)) |
| שינוי גודל לפי מקדם | pygame.transform.scale_by(img, 2) |
| שינוי גודל חלק | pygame.transform.smoothscale(img, (64, 64)) |
| סיבוב (נגד כיוון השעון, במעלות) | pygame.transform.rotate(img, 45) |
| סיבוב סביב המרכז | rotated = pygame.transform.rotate(original, angle)
rect = rotated.get_rect(center=rect.center) |
| היפוך אופקי | pygame.transform.flip(img, True, False) |
אירועים ומקלדת
השתמשו באירועים ללחיצות בודדות וב-get_pressed() למקשים שנשארים לחוצים.
| פעולה | קוד |
|---|---|
| קריאת האירועים של הפריים הזה | for event in pygame.event.get(): |
| החלון נסגר | event.type == pygame.QUIT |
| מקש נלחץ | event.type == pygame.KEYDOWN and event.key == pygame.K_SPACE |
| מקש שוחרר | event.type == pygame.KEYUP |
| התו שהוקלד | event.unicode |
| המקשים הלחוצים עכשיו | keys = pygame.key.get_pressed()
if keys[pygame.K_LEFT]:
x -= 5 |
| כיוון משני מקשים | dx = keys[pygame.K_RIGHT] - keys[pygame.K_LEFT] |
| מקשים שנלחצו בפריים הזה (pygame-ce) | pygame.key.get_just_pressed()[pygame.K_SPACE] |
| קבועי מקשים | K_a...K_z, K_0...K_9, K_UP, K_RETURN, K_ESCAPE, K_LSHIFT |
| שם של מקש | pygame.key.name(event.key) |
| אירוע מותאם אישית | HIT = pygame.event.custom_type()
pygame.event.post(pygame.event.Event(HIT)) |
עכבר
כפתורים: 1 שמאלי, 2 אמצעי, 3 ימני.
| פעולה | קוד |
|---|---|
| כפתור נלחץ | event.type == pygame.MOUSEBUTTONDOWN and event.button == 1 |
| איפה הוא נלחץ | event.pos |
| מיקום הסמן עכשיו | x, y = pygame.mouse.get_pos() |
| הכפתורים הלחוצים עכשיו | left, middle, right = pygame.mouse.get_pressed() |
| העכבר זז | event.type == pygame.MOUSEMOTION, event.rel |
| הגלגלת הסתובבה | event.type == pygame.MOUSEWHEEL, event.y |
| לחיצה בתוך כפתור | button_rect.collidepoint(event.pos) |
| הסתרת הסמן | pygame.mouse.set_visible(False) |
ספרייטים וקבוצות
ספרייט מחזיק image ו-rect, וקבוצה מעדכנת ומציירת הרבה ספרייטים יחד.
| פעולה | קוד |
|---|---|
| מחלקת ספרייט | class Coin(pygame.sprite.Sprite):
def __init__(self, pos):
super().__init__()
self.image = coin_img
self.rect = self.image.get_rect(center=pos) |
| יצירת קבוצה | coins = pygame.sprite.Group() |
| הוספה לקבוצה | coins.add(Coin((100, 50))) |
| עדכון כל הספרייטים | coins.update() |
| ציור כל הספרייטים | coins.draw(screen) |
| הסרת ספרייט מכל הקבוצות | coin.kill() |
| קבוצה שמחזיקה ספרייט אחד | player = pygame.sprite.GroupSingle(Player()) |
התנגשויות
אובייקטי Rect מתנגשים כשהם חופפים. קצוות שרק נוגעים זה בזה לא נחשבים.
| פעולה | קוד |
|---|---|
| שני מלבנים | a.colliderect(b) |
| נקודה בפנים | rect.collidepoint(x, y) |
| הראשון מתוך כמה | rect.collidelist(walls) # index or -1 |
| ספרייט מול קבוצה | hits = pygame.sprite.spritecollide(player, coins, True) |
| האם יש פגיעה כלשהי | pygame.sprite.spritecollideany(player, enemies) |
| קבוצה מול קבוצה | pygame.sprite.groupcollide(bullets, enemies, True, True) |
| ברמת הפיקסל | pygame.sprite.spritecollide(a, group, False, pygame.sprite.collide_mask) |
| עיגולים | pygame.Vector2(a).distance_to(b) < r1 + r2 |
טקסט וגופנים
מרנדרים את הטקסט ל-Surface, ואז מציירים אותו עם blit.
| פעולה | קוד |
|---|---|
| גופן ברירת המחדל | font = pygame.font.Font(None, 36) |
| גופן מערכת | font = pygame.font.SysFont("arial", 24) |
| קובץ גופן | font = pygame.font.Font("pixel.ttf", 32) |
| רינדור טקסט | text = font.render("Score: 10", True, "white") |
| ציור במרכז | screen.blit(text, text.get_rect(center=(320, 40))) |
| גלישת טקסט ארוך (pygame-ce) | font.render(story, True, "white", None, 400) |
| גודל בלי לרנדר | font.size("Hello") |
| גופנים מותקנים | pygame.font.get_fonts() |
סאונד ומוזיקה
טוענים צלילים פעם אחת. מוזיקה מוזרמת מהקובץ שלה, רצועה אחת בכל פעם.
| פעולה | קוד |
|---|---|
| טעינת צליל | jump = pygame.mixer.Sound("jump.ogg") |
| השמעה | jump.play() |
| עוצמת הצליל | jump.set_volume(0.5) |
| טעינת מוזיקה | pygame.mixer.music.load("theme.ogg") |
| מוזיקה בלולאה אינסופית | pygame.mixer.music.play(-1) |
| השהיה והמשך | pygame.mixer.music.pause(), pygame.mixer.music.unpause() |
| עצירת המוזיקה | pygame.mixer.music.stop() |
זמן וטיימרים
ה-ticks נמדדים במילישניות.
| פעולה | קוד |
|---|---|
| הגבלת קצב הפריימים | clock.tick(60) |
| דלתא זמן בשניות | dt = clock.tick(60) / 1000 |
| קצב הפריימים הנוכחי | clock.get_fps() |
| מילישניות מאז init | pygame.time.get_ticks() |
| אירוע טיימר חוזר | SPAWN = pygame.event.custom_type()
pygame.time.set_timer(SPAWN, 1000) |
| טיימר חד-פעמי | pygame.time.set_timer(SPAWN, 2000, loops=1) |
| עצירת טיימר | pygame.time.set_timer(SPAWN, 0) |
Vector2
מספרים עשרוניים למיקומים ולמהירויות.
| פעולה | קוד |
|---|---|
| יצירת וקטור | pos = pygame.Vector2(100, 200) |
| תזוזה לפי מהירות | pos += velocity * dt |
| אורך | velocity.length() |
| אותה מהירות באלכסון | if direction.length() > 0:
direction = direction.normalize() |
| מרחק בין נקודות | pos.distance_to(target) |
| סיבוב | velocity.rotate(90) |
| צעד לעבר נקודה (pygame-ce) | pos.move_towards_ip(target, 5) |
קוד ה-pygame שמשתמשים בו כשבונים משחק דו-ממדי ב-Python, מסודר לפי משימה: לולאת המשחק, המסך, צבעים וציור, Rect, תמונות ו-blit, שינוי גודל וסיבוב, קלט ממקלדת ומעכבר, ספרייטים וקבוצות, התנגשויות, טקסט, סאונד, טיימרים ו-Vector2. בכל שורה יש קטע קוד קצר להדבקה, ולצדו מה שהוא עושה.
הכול כאן נכתב עבור pygame-ce 2.5, גרסת הקהילה של pygame, שעדיין מייבאים אותה עם import pygame. שורות שמסומנות pygame-ce משתמשות בתוספות שלה, וכל שאר השורות עובדות גם ב-pygame המקורית. אפשר לנסות כל קטע בסביבת התרגול של pygame, שמריצה pygame בדפדפן בלי להתקין כלום. חדשים ב-Python עצמה? התחילו עם דף העזר של Python.
שאלות נפוצות על דף העזר של pygame
האם דף העזר הזה של pygame חינמי?
כן. הוא חינמי ובלי הרשמה. שמרו אותו בסימניות, או הדפיסו אותו ל-PDF מהדפדפן, וחזרו אליו בכל פעם שאתם צריכים את הקריאה המדויקת לקבוצת ספרייטים, לצליל או לבדיקת התנגשות.
האם דף העזר עובד עם pygame ועם pygame-ce?
import pygame, וכמעט כל ה-API משותף להן. השורות שמסומנות pygame-ce (FRect, scale_by, get_just_pressed, גלישת טקסט ו-move_towards_ip) דורשות pygame-ce, וכל השאר עובד בשתיהן.למה חלון ה-pygame שלי לא מגיב?
pygame.event.get() פעם אחת בכל פריים, גם אם אתם מתעלמים מהאירועים, וסיימו כל פריים עם pygame.display.flip() ו-clock.tick(60).להשתמש באירועים או ב-key.get_pressed() לקלט?
KEYDOWN לפעולות שקורות פעם אחת בכל לחיצה, כמו קפיצה או פתיחת תפריט. השתמשו ב-pygame.key.get_pressed() לפעולות שנמשכות כל עוד המקש לחוץ, כמו הליכה.