Menu
CoddyTech

גררו את הארגז

חלק מהיחידה לולאת המשחק במסלול ה-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, כדי שרק אחד מהם יגיב ללחיצה.

challenge icon

אתגר

בינוני
  1. לפני הלולאה, צרו crate = pygame.Rect(40, 230, 60, 60) ואת dragging = False.
  2. בעת MOUSEBUTTONDOWN, הגדירו dragging = True כשהלחיצה מתבצעת על הארגז; אחרת (elif), בדקו את היהלום כמו קודם.
  3. הגדירו dragging = False בעת MOUSEBUTTONUP. בזמן MOUSEMOTION וכשהארגז נגרר, הזיזו את הארגז לפי event.rel.
  4. אחרי קווי המתאר של היהלום, ציירו את הארגז בצבע חום (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 אונליין