ציד אבני חן
חלק מהיחידה לולאת המשחק במסלול ה-Pygame של Coddy. שיעור 17 מתוך 32.
עכשיו הארגז הופך למשחק. כל אבן חן מופיעה מתחת לארגז: גררו את הארגז הצידה ולחצו על אבן החן, והארגז יעבור לאבן החן הבאה. סבב נמשך 30 שניות.
הציבו את הארגז על אבן החן על ידי הגדרת המרכז שלו למרכז אבן החן: crate.center = gem.center. עשו זאת לפני הלולאה ובכל פעם שמופיעה אבן חן חדשה.
מדדו את הזמן בפריימים. בקצב של 60 פריימים בשנייה, 30 שניות הן 1800 פריימים:
time_left = 1800
while running:
# אירועים
if time_left > 0:
time_left -= 1כאשר time_left מגיע ל-0, המשחק מפסיק לקבל לחיצות וגרירות, ושורת הניקוד מציגה את התוצאה. הוסיפו and time_left > 0 לבדיקות של MOUSEBUTTONDOWN ושל MOUSEMOTION.
פס בחלק העליון מציג את הזמן שנותר. הרוחב שלו מייצג את החלק שנותר מהסבב: 480 * time_left // 1800 הוא 480 בתחילת הסבב, 240 באמצע ו-0 בסופו.
אתגר
בינוני- לאחר יצירת התיבה, הגדר
crate.center = gem.center. בצע את אותו הדבר לאחר שלפנינה שנאספה נקבע מיקום חדש. - לפני הלולאה, הגדר
time_left = 1800. בלולאה, אחרי האירועים, הפחת ממנו 1 כל עוד הוא גדול מ־0. - טפל ב־
MOUSEBUTTONDOWNוב־MOUSEMOTIONרק כאשרtime_left > 0. - אחרי שורת הניקוד, צייר את סרגל הזמן: בירוק
(120, 200, 120)במיקום(0, 0, 480 * time_left // 1800, 6).
נסו בעצמכם
import random
import pygame
pygame.init()
screen = pygame.display.set_mode((480, 360))
pygame.display.set_caption("Gem Hunt")
clock = pygame.time.Clock()
gem = pygame.Rect(225, 165, 30, 30)
crate = pygame.Rect(40, 230, 60, 60)
dragging = False
score = 0
running = True
while running:
for event in pygame.event.get():
if event.type == pygame.QUIT:
running = False
elif event.type == pygame.MOUSEBUTTONDOWN:
if crate.collidepoint(event.pos):
dragging = True
elif gem.collidepoint(event.pos):
score += 1
gem.x = random.randint(15, 435)
gem.y = random.randint(55, 315)
elif event.type == pygame.MOUSEBUTTONUP:
dragging = False
elif event.type == pygame.MOUSEMOTION and dragging:
crate.move_ip(event.rel)
screen.fill((30, 30, 46))
gem_points = [gem.midtop, gem.midright, gem.midbottom, gem.midleft]
pygame.draw.polygon(screen, (80, 220, 255), gem_points)
if gem.collidepoint(pygame.mouse.get_pos()):
pygame.draw.rect(screen, (255, 196, 0), gem.inflate(10, 10), 2)
pygame.draw.rect(screen, (150, 100, 50), crate)
pygame.draw.rect(screen, (110, 70, 35), crate, 3)
for i in range(score):
pygame.draw.rect(screen, (240, 110, 180), (10 + 10 * i, 14, 8, 8))
mouse_x, mouse_y = pygame.mouse.get_pos()
pygame.draw.circle(screen, (240, 240, 240), (mouse_x, mouse_y), 10, 2)
pygame.display.flip()
clock.tick(60)
pygame.quit()
השיעור הזה כולל חידון קצר. התחילו את השיעור כדי לענות עליו ולעקוב אחרי ההתקדמות.
כל השיעורים ביחידה לולאת המשחק
תרגלו בעצמכם: Pygame אונליין