Menu
CoddyTech

דף עזר pygame

עודכן לאחרונה

התקנה ולולאת המשחק

כל תוכנית pygame פותחת חלון, ואז חוזרת על לולאה אחת עד שהשחקן יוצא.

פעולהקוד
התקנת pygame-cepython3 -m pip install pygame-ce
ייבוא והפעלה של pygameimport 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()
המסך כ-Rectscreen.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 שומר מיקום וגודל כמספרים שלמים.

פעולהקוד
יצירת Rectplayer = 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()
מילישניות מאז initpygame.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() לפעולות שנמשכות כל עוד המקש לחוץ, כמו הליכה.
איור של שפות התכנות ב-Coddy

ללמוד Pygame עם Coddy

להתחיל