Menu
CoddyTech

شاشة قائمة

جزء من قسم قواعد اللعبة في رحلة Pygame على Coddy. الدرس 2 من 29.

تبدأ معظم الألعاب بقائمة: عنوان وسطر يخبرك بكيفية البدء. القائمة حالة إضافية. ابدأ بـ state = "menu" وارسم شاشة مختلفة ما دامت هذه الحالة قائمة.

بدء اللعبة لا يتطلب سوى ضغطة مفتاح واحدة، لذا اقرأها من الأحداث. يقع حدث KEYDOWN مرة واحدة عند كل ضغطة، ويخبرك event.key بالمفتاح الذي ضُغط:

if event.type == pygame.KEYDOWN:
    if event.key == pygame.K_RETURN and state == "menu":
        state = "play"

الجزء state == "menu" مهم: يعني مفتاح Enter البدء فقط عندما تكون القائمة معروضة. لاحقًا، لن يفعل الضغط على Enter شيئًا على شاشة أخرى.

يعتمد الرسم الآن على الحالة أيضًا:

screen.fill((30, 30, 46))
if state == "menu":
    # العنوان واضغط على Enter للعب
else:
    # اللاعب، والصخرة، والنتيجة، وانتهاء اللعبة

يظل كود التحديث داخل if state == "play":، لذا لا يتحرك أي شيء أثناء عرض القائمة.

challenge icon

التحدي

سهل
  1. ابدأ بـ state = "menu".
  2. في حلقة الأحداث، عند الضغط على مفتاح الإدخال وكانت الحالة "menu"، غيّرها إلى "play".
  3. ما دامت الحالة "menu"، ارسم فقط Meteor Dodge في المنتصف عند (240, 140) وPress Enter to play في المنتصف عند (240, 200) على الخلفية الداكنة.
  4. وإلا، فارسم اللعبة كما في السابق.

جرّب بنفسك

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(None, 32)

player = pygame.Rect(220, 300, 40, 40)
rock = pygame.Rect(random.randint(0, 456), -24, 24, 24)
score = 0
state = "play"

running = True
while running:
    for event in pygame.event.get():
        if event.type == pygame.QUIT:
            running = False

    if state == "play":
        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"

    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, (240, 240, 240))
    screen.blit(score_text, (10, 10))
    if state == "over":
        message = font.render("Game over", True, (240, 240, 240))
        screen.blit(message, message.get_rect(center=(240, 160)))
    pygame.display.flip()
    clock.tick(60)

pygame.quit()
quiz iconاختبر نفسك

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

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

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