أقصى سرعة للسقوط
جزء من قسم العوالم في رحلة Pygame على Coddy. الدرس 13 من 35.
تستمر الجاذبية في زيادة سرعة السقوط. إذا سقط اللاعب من ارتفاع كافٍ، فإنه يتحرك 30 أو 40 بكسلًا في إطار واحد. يبلغ ارتفاع البلاطة 36 بكسلًا، لذا يمكن للاعب بهذه السرعة أن يمر مباشرة عبر منصة بين إطارين، من دون أن يتداخل معها مطلقًا.
للسقوط الحقيقي سرعة قصوى أيضًا. حدّد السرعة باستخدام min:
MAX_FALL = 12
# داخل الحلقة
vel_y = min(vel_y + GRAVITY, MAX_FALL)تعطي min الأصغر من العددين، لذا تزداد السرعة بمقدار 1 في كل إطار حتى تصل إلى 12، ثم تبقى عندها. تبدأ القفزة عند -15، أي أقل من الحد الأقصى، لذا لا تتغير القفزات.
اثنا عشر يساوي ثلث ارتفاع البلاطة: أيًّا كان ما يسقط اللاعب عليه، سيتداخل معه في أحد الإطارات، ويمكن لاختبار الهبوط اكتشاف ذلك.
التحدي
سهل- أضف
MAX_FALL = 12في الأعلى. - استبدل
vel_y += GRAVITYبـvel_y = min(vel_y + GRAVITY, MAX_FALL).
تبدأ الشخصية في الهواء، لذا يمكنك رؤيتها وهي تصل إلى السرعة القصوى.
جرّب بنفسك
import pygame
TILE = 36
FLOOR = 324
GRAVITY = 1
JUMP = -15
pygame.init()
screen = pygame.display.set_mode((576, 360))
pygame.display.set_caption("Falling Speed")
clock = pygame.time.Clock()
background = pygame.image.load("assets/backgrounds/clouds.png").convert_alpha()
grass_img = pygame.image.load("assets/images/grass.png").convert_alpha()
player_img = pygame.image.load("assets/images/player.png").convert_alpha()
player = player_img.get_rect(topleft=(264, 40))
vel_y = 0
on_ground = False
running = True
while running:
for event in pygame.event.get():
if event.type == pygame.QUIT:
running = False
elif event.type == pygame.KEYDOWN and event.key in (pygame.K_SPACE, pygame.K_UP):
if on_ground:
vel_y = JUMP
elif event.type == pygame.KEYUP and event.key in (pygame.K_SPACE, pygame.K_UP):
if vel_y < -4:
vel_y = -4
keys = pygame.key.get_pressed()
if keys[pygame.K_LEFT]:
player.x -= 4
if keys[pygame.K_RIGHT]:
player.x += 4
vel_y += GRAVITY
player.y += vel_y
on_ground = False
if player.bottom > FLOOR:
player.bottom = FLOOR
vel_y = 0
on_ground = True
for y in range(0, 360, 72):
for x in range(0, 576, 72):
screen.blit(background, (x, y))
for x in range(0, 576, TILE):
screen.blit(grass_img, (x, FLOOR))
screen.blit(player_img, player)
pygame.display.flip()
clock.tick(60)
pygame.quit()
جميع دروس العوالم
تدرّب بنفسك: Playground لـ Pygame