كاميرا سلسة
جزء من قسم الصوت وإحساس اللعب في رحلة Pygame على Coddy. الدرس 17 من 23.
في لعبة الطريق هذه، تكون الكاميرا ملتصقة باللاعب: مهما فعل اللاعب، يظل في وسط الشاشة وينزلق العالم من تحته. هذا يعمل، لكن كل انطلاق وتوقف يهزّ المشهد بأكمله.
اجعل الكاميرا تتبع اللاعب بالتدرّج نفسه الذي تتبعه الدائرة. هدفها هو الموضع الذي سيجعل اللاعب في الوسط:
camera_x += (player.centerx - 240 - camera_x) * 0.1
camera_x = max(0, min(camera_x, WORLD_WIDTH - 480))يتحرك اللاعب كما في السابق؛ وحدها الرؤية تتدرّج. عندما يبدأ اللاعب بالجري، تتأخر الكاميرا قليلًا، فيسبق اللاعبُ مركزَ الشاشة. وعندما يتوقف، تنساب الكاميرا لتلحق به وتستقر مجددًا واللاعب في الوسط. وما زال السطر الثاني يُبقي الكاميرا داخل العالم.
يُرسَم العالم عند -int(camera_x) كما في السابق. أصبحت camera_x الآن عددًا عشريًا؛ وتُبقي int() الرسمَ على إحداثيات البكسلات الصحيحة، بينما يحتفظ المتغير بقيمته الدقيقة للإطار التالي.
يمكن لأي شيء ينتقل إلى قيمة جديدة أن يتدرّج بالطريقة نفسها: لوحة قائمة تنزلق إلى الداخل، أو شريط صحة يتناقص، أو نتيجة ترتفع تدريجيًا.
التحدي
متوسطاجعل الكاميرا تتبع بسلاسة: استبدل camera_x = player.centerx - 240 بسطر يحرّك camera_x عُشر المسافة نحو player.centerx - 240 في كل إطار. أبقِ على السطر الذي يقيّد قيمته.
جرّب بنفسك
import pygame
pygame.init()
screen = pygame.display.set_mode((480, 360))
pygame.display.set_caption("Long Road")
clock = pygame.time.Clock()
WORLD_WIDTH = 1440
player = pygame.Rect(220, 240, 40, 40)
camera_x = 0
running = True
while running:
for event in pygame.event.get():
if event.type == pygame.QUIT:
running = False
keys = pygame.key.get_pressed()
if keys[pygame.K_LEFT]:
player.x -= 6
if keys[pygame.K_RIGHT]:
player.x += 6
player.left = max(player.left, 0)
player.right = min(player.right, WORLD_WIDTH)
camera_x = player.centerx - 240
camera_x = max(0, min(camera_x, WORLD_WIDTH - 480))
screen.fill((30, 30, 46))
pygame.draw.rect(screen, (80, 80, 100), (0, 280, 480, 80))
for post_x in range(0, WORLD_WIDTH, 120):
pygame.draw.rect(screen, (80, 160, 255), (post_x - int(camera_x), 220, 20, 60))
pygame.draw.rect(screen, (90, 200, 120), player.move(-int(camera_x), 0))
pygame.display.flip()
clock.tick(60)
pygame.quit()
يتضمن هذا الدرس اختبارًا قصيرًا. ابدأ الدرس للإجابة عليه وتتبّع تقدمك.
جميع دروس الصوت وإحساس اللعب
تدرّب بنفسك: Playground لـ Pygame