تزايد السرعة مع الوقت
جزء من قسم حلقة اللعبة في رحلة Pygame على Coddy. الدرس 32 من 32.
تزداد صعوبة اللعبة مع استمرارها. هنا تسقط الكتل بسرعة أكبر قليلًا كل 10 ثوانٍ.
تُرسل pygame.time.set_timer(event_type, ms) حدثًا من ذلك النوع كل ms مللي ثانية. أنشئ نوع حدث خاصًا بك باستخدام pygame.USEREVENT، وهو رقم يتركه pygame متاحًا لك:
SPEED_UP = pygame.USEREVENT + 1
pygame.time.set_timer(SPEED_UP, 10000)
fall_speed = 3
for event in pygame.event.get():
if event.type == SPEED_UP:
fall_speed += 1يصل الحدث إلى حلقة الأحداث مع الأحداث الأخرى، مرة كل 10 ثوانٍ. بعد ذلك تسقط الكتلة باستخدام block.y += fall_speed بدلًا من سرعة ثابتة مقدارها 3. تبدأ اللعبة الجديدة ببطء مجددًا، لذا تعيّن إعادة التشغيل أيضًا fall_speed = 3.
التحدي
متوسط- أسفل الخط، عيّن
SPEED_UP = pygame.USEREVENT + 1وابدأ مؤقّتًا له كل 10000 مللي ثانية. - عيّن
fall_speed = 3قبل الحلقة واستخدمه للسقوط. - أضف 1 إلى
fall_speedعند وصول حدث SPEED_UP. - أعِده إلى 3 عندما يبدأ المفتاح R لعبة جديدة.
جرّب بنفسك
import random
import pygame
pygame.init()
screen = pygame.display.set_mode((480, 360))
pygame.display.set_caption("Catch the Blocks")
clock = pygame.time.Clock()
font = pygame.font.Font(None, 32)
basket = pygame.Rect(200, 330, 80, 16)
block = pygame.Rect(220, 0, 20, 20)
score = 0
lives = 3
paused = False
running = True
while running:
for event in pygame.event.get():
if event.type == pygame.QUIT:
running = False
elif event.type == pygame.KEYDOWN:
if event.key == pygame.K_p:
paused = not paused
elif event.key == pygame.K_r and (lives == 0 or score == 10):
score = 0
lives = 3
basket.x = 200
block.y = -20
block.x = random.randint(0, 460)
if lives > 0 and score < 10 and not paused:
keys = pygame.key.get_pressed()
if keys[pygame.K_LEFT]:
basket.x -= 8
if keys[pygame.K_RIGHT]:
basket.x += 8
basket.clamp_ip(screen.get_rect())
block.y += 3
if block.top > 360:
block.y = -20
block.x = random.randint(0, 460)
lives -= 1
if block.colliderect(basket):
block.y = -20
block.x = random.randint(0, 460)
score += 1
screen.fill((30, 30, 46))
pygame.draw.rect(screen, (80, 160, 255), basket)
pygame.draw.rect(screen, (235, 80, 80), block)
score_text = font.render(f"Score: {score}", True, (240, 240, 240))
screen.blit(score_text, (10, 10))
lives_text = font.render(f"Lives: {lives}", True, (240, 240, 240))
screen.blit(lives_text, (370, 10))
if lives == 0:
message = font.render("Game over", True, (240, 240, 240))
screen.blit(message, message.get_rect(center=(240, 160)))
elif score == 10:
message = font.render("You win!", True, (240, 240, 240))
screen.blit(message, message.get_rect(center=(240, 160)))
if lives == 0 or score == 10:
again = font.render("Press R to play again", True, (240, 240, 240))
screen.blit(again, again.get_rect(center=(240, 200)))
if paused:
message = font.render("Paused", True, (240, 240, 240))
screen.blit(message, message.get_rect(center=(240, 160)))
pygame.display.flip()
clock.tick(60)
pygame.quit()
يتضمن هذا الدرس اختبارًا قصيرًا. ابدأ الدرس للإجابة عليه وتتبّع تقدمك.
جميع دروس حلقة اللعبة
5التقط الكتل
السلةكتلة ساقطةتدرّب بنفسك: Playground لـ Pygame