Menu
CoddyTech

Bir Menü Ekranı

Coddy'nin Pygame Journey'sinin Oyun Kuralları bölümünün bir parçası. Ders 2 / 29.

Çoğu oyun bir menüyle açılır: bir başlık ve nasıl başlayacağını söyleyen bir satır. Menü, bir başka durumdur. state = "menu" ile başla ve bu durum devam ederken farklı bir ekran çiz.

Oyunu başlatmak için tek bir tuşa basmak yeterlidir; bu yüzden tuşu olaylardan oku. Bir KEYDOWN olayı her basışta bir kez gerçekleşir ve event.key hangi tuşa basıldığını söyler:

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

state == "menu" kısmı önemlidir: Enter yalnızca menüdeyken başlatır. Daha sonra başka bir ekrandayken Enter'a basmak hiçbir şey yapmaz.

Artık çizim de duruma bağlıdır:

screen.fill((30, 30, 46))
if state == "menu":
    # başlık ve oynamak için Enter tuşuna basın
else:
    # oyuncu, kaya, skor, oyun bitti

Güncelleme kodu hâlâ if state == "play": bloğunun altında olduğundan menü görünürken hiçbir şey hareket etmez.

challenge icon

Görev

Kolay
  1. state = "menu" ile başla.
  2. Olay döngüsünde, Enter tuşuna basıldığında ve durum "menu" olduğunda, durumu "play" olarak ayarla.
  3. Durum "menu" iken, koyu arka plan üzerinde yalnızca (240, 140) konumunda ortalanmış Meteor Dodge ve (240, 200) konumunda ortalanmış Press Enter to play metinlerini çiz.
  4. Aksi hâlde oyunu önceki gibi çiz.

Kendin dene

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 iconKendini test et

Bu ders kısa bir quiz içerir. Soruları yanıtlamak ve ilerlemeni kaydetmek için derse başla.

Oyun Kuralları bölümündeki tüm dersler

Kendi başına pratik yap: Pygame playground