גררו את הארגז
חלק מהיחידה לולאת המשחק במסלול ה-Pygame של Coddy. שיעור 16 מתוך 32.
גרירה מורכבת משלושה אירועים. לוחצים על הכפתור כשהמצביע מעל הארגז (MOUSEBUTTONDOWN), המצביע זז (MOUSEMOTION, פעמים רבות), ומשחררים את הכפתור (MOUSEBUTTONUP). משתנה זוכר אם מתבצעת גרירה בין האירועים:
elif event.type == pygame.MOUSEBUTTONDOWN:
if crate.collidepoint(event.pos):
dragging = True
elif event.type == pygame.MOUSEBUTTONUP:
dragging = False
elif event.type == pygame.MOUSEMOTION and dragging:
crate.move_ip(event.rel)הערך event.rel באירוע MOUSEMOTION מציין כמה רחוק זז המצביע מאז האירוע הקודם, כ-(x, y). הפקודה crate.move_ip(event.rel) מזיזה את הארגז באותה מידה, כך שהנקודה שאחזת בה נשארת מתחת למצביע.
הארגז מצויר אחרי אבן החן, ולכן הוא יכול להסתיר אותה. לכן לחיצה על הארגז לא אמורה לאסוף את אבן החן שמתחתיו: בדקו קודם את הארגז, ואז את אבן החן עם elif, כדי שרק אחד מהם יגיב ללחיצה.
אתגר
בינוני- לפני הלולאה, צרו
crate = pygame.Rect(40, 230, 60, 60)ואתdragging = False. - בעת
MOUSEBUTTONDOWN, הגדירוdragging = Trueכשהלחיצה מתבצעת על הארגז; אחרת (elif), בדקו את היהלום כמו קודם. - הגדירו
dragging = FalseבעתMOUSEBUTTONUP. בזמןMOUSEMOTIONוכשהארגז נגרר, הזיזו את הארגז לפיevent.rel. - אחרי קווי המתאר של היהלום, ציירו את הארגז בצבע חום
(150, 100, 50), עם מסגרת בצבע(110, 70, 35)ובעובי 3 פיקסלים.
נסו בעצמכם
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)
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 gem.collidepoint(event.pos):
score += 1
gem.x = random.randint(15, 435)
gem.y = random.randint(55, 315)
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)
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 אונליין