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اختبر نفسك

يتضمن هذا الدرس اختبارًا قصيرًا. ابدأ الدرس للإجابة عليه وتتبّع تقدمك.

جميع دروس قواعد اللعبة

تدرّب بنفسك: Playground لـ Pygame