Menu
CoddyTech

נקודות עיגון

חלק מהיחידה חוקי המשחק במסלול ה-Pygame של Coddy. שיעור 7 מתוך 29.

ניקוד שמצויר בנקודה (10, 10) מתחיל בקצה השמאלי. כדי לסיים בקצה הימני במקום זאת, צריך את הרוחב שלו, והרוחב משתנה ככל שהמספר גדל. Rect מבצע בשבילך את החישובים.

text.get_rect() מקבלת ארגומנטים של מילות מפתח לכל אחת מנקודותיה: center, topleft, topright, midtop, midbottom ועוד. ה-Rect ממוקם כך שהנקודה תהיה במקום שציינת:

score_rect = score_text.get_rect(topright=(470, 10))
screen.blit(score_text, score_rect)

כעת הקצה הימני של הניקוד נשאר ב-470, בין אם מוצג בו 0 ובין אם 1000.

קל יותר לקרוא טקסט על רקע עמוס כשהוא מונח על לוחית. inflate(12, 8) מחזירה עותק של ה-Rect שרוחבו גדול ב-12 פיקסלים וגובהו גדול ב-8 פיקסלים, עם אותו מרכז. צייר אותה תחילה, ואז את הטקסט מעליה:

pygame.draw.rect(screen, PLATE, score_rect.inflate(12, 8))

הקצה הימני של הלוחית נמצא 6 פיקסלים אחרי הטקסט, בנקודה 476, והחלק העליון שלה נמצא 4 פיקסלים מעליו, בנקודה 6.

challenge icon

אתגר

בינוני
  1. הוסיפו PLATE = (60, 60, 90).
  2. מקמו את הניקוד בעזרת topright=(470, 10) וציירו מאחוריו מלבן PLATE: ה-Rect שלו מוגדל ב-(12, 8).
  3. בתפריט, ציירו מלבן PLATE מאחורי Meteor Dodge: ה-Rect של הכותרת, ממורכז ב-(240, 140) ומוגדל ב-(24, 12).

נסו בעצמכם

import random
import pygame

pygame.init()
screen = pygame.display.set_mode((480, 360))
pygame.display.set_caption("Meteor Dodge")
clock = pygame.time.Clock()
font = pygame.font.Font("assets/fonts/pixel.ttf", 24)
big_font = pygame.font.Font("assets/fonts/pixel.ttf", 48)
WHITE = (240, 240, 240)


def reset():
    global player, rock, score
    player = pygame.Rect(220, 300, 40, 40)
    rock = pygame.Rect(random.randint(0, 456), -24, 24, 24)
    score = 0


def draw_menu():
    screen.fill((30, 30, 46))
    title = big_font.render("Meteor Dodge", True, WHITE)
    screen.blit(title, title.get_rect(center=(240, 140)))
    hint = font.render("Press Enter to play", True, WHITE)
    screen.blit(hint, hint.get_rect(center=(240, 200)))


def draw_game():
    screen.fill((30, 30, 46))
    pygame.draw.rect(screen, (255, 196, 0), player)
    pygame.draw.rect(screen, (235, 80, 80), rock)
    score_text = font.render(f"Score: {score}", True, WHITE)
    screen.blit(score_text, (10, 10))


def play_frame():
    global score, state
    keys = pygame.key.get_pressed()
    if keys[pygame.K_LEFT]:
        player.x -= 6
    if keys[pygame.K_RIGHT]:
        player.x += 6
    player.clamp_ip(screen.get_rect())

    rock.y += 4
    if rock.top > 360:
        rock.y = -24
        rock.x = random.randint(0, 456)
        score += 1
    if rock.colliderect(player):
        state = "over"
    draw_game()


def draw_over():
    draw_game()
    message = big_font.render("Game over", True, WHITE)
    screen.blit(message, message.get_rect(center=(240, 160)))
    hint = font.render("Press R to play again", True, WHITE)
    screen.blit(hint, hint.get_rect(center=(240, 200)))


reset()
state = "menu"

running = True
while running:
    for event in pygame.event.get():
        if event.type == pygame.QUIT:
            running = False
        if event.type == pygame.KEYDOWN:
            if event.key == pygame.K_RETURN and state == "menu":
                state = "play"
            elif event.key == pygame.K_r and state == "over":
                reset()
                state = "play"

    if state == "menu":
        draw_menu()
    elif state == "play":
        play_frame()
    else:
        draw_over()
    pygame.display.flip()
    clock.tick(60)

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

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

כל השיעורים ביחידה חוקי המשחק

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