Menu
CoddyTech

סיבוב מהמקור

חלק מהיחידה ספרייטים ותמונות במסלול ה-Pygame של Coddy. שיעור 9 מתוך 36.

כדור קוצים שמסתובב כל הזמן מסתובב מעט בכל פריים. יש דרך מפתה לכתוב את זה, והיא גורמת לבעיה:

ball = pygame.transform.rotate(ball, 2)  # שגוי

בכל פריים מסובבים את התמונה שסובבה בפריים הקודם. כל סיבוב מוסיף מסגרת שקופה, ולכן ה-Surface גדל בכ-3 אחוזים בכל פריים: פי שניים בגודלו לאחר חצי שנייה, וכמעט 1,800 פיקסלים ברוחב לאחר שתי שניות. הפיקסלים גם נמרחים מעט יותר בכל סיבוב. המשחק מאט במהרה עד כדי זחילה.

שמרו את המקור ואת הזווית בנפרד, וצרו את התמונה המסובבת מהמקור בכל פריים:

angle += 2
spun = pygame.transform.rotate(ball, angle)
screen.blit(spun, spun.get_rect(center=(320, 240)))

כעת spun מסובבת פעם אחת ביחס לקובץ המקורי, ללא קשר לזווית: היא לעולם לא גדולה מ-67 על 67 פיקסלים, ולעולם לא מטושטשת יותר מאשר לאחר סיבוב אחד. אותו כלל חל על כל טרנספורמציה: עבדו מהמקור, ולא מהעותק האחרון.

challenge icon

אתגר

בינוני
  1. לפני הלולאה, הגדירו angle = 0.
  2. בכל פריים, הוסיפו 2 ל-angle.
  3. סובבו את ball המקורי בזווית angle וציירו את התוצאה כך שמרכזה יהיה ב-(320, 240). לעולם אל תשנו את ball עצמו.

נסו בעצמכם

import pygame

pygame.init()
screen = pygame.display.set_mode((640, 480))
pygame.display.set_caption("Spinning Spikes")
clock = pygame.time.Clock()

ball = pygame.image.load("assets/images/spike_ball.png").convert_alpha()

running = True
while running:
    for event in pygame.event.get():
        if event.type == pygame.QUIT:
            running = False

    screen.fill((20, 22, 40))
    screen.blit(ball, ball.get_rect(center=(320, 240)))
    pygame.display.flip()
    clock.tick(60)

pygame.quit()
quiz iconבחנו את עצמכם

השיעור הזה כולל חידון קצר. התחילו את השיעור כדי לענות עליו ולעקוב אחרי ההתקדמות.

כל השיעורים ביחידה ספרייטים ותמונות

תרגלו בעצמכם: Pygame אונליין