نقاط الارتكاز
جزء من قسم قواعد اللعبة في رحلة 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.
التحدي
متوسط- أضف
PLATE = (60, 60, 90). - ضع النقاط عند
topright=(470, 10)وارسم مستطيلاً بلونPLATEخلفها: اجعل Rect الخاص بها ممددًا بمقدار (12, 8). - في القائمة، ارسم مستطيلاً بلون
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()
يتضمن هذا الدرس اختبارًا قصيرًا. ابدأ الدرس للإجابة عليه وتتبّع تقدمك.
جميع دروس قواعد اللعبة
تدرّب بنفسك: Playground لـ Pygame