العقبات
جزء من قسم قواعد اللعبة في رحلة Pygame على Coddy. الدرس 26 من 29.
والآن نضيف شيئًا للقفز فوقه. العائق هو كائن رسومي يبدأ بعد الحافة اليمنى بقليل، على الأرض، ويتحرك إلى اليسار:
class Obstacle(pygame.sprite.Sprite):
def __init__(self):
super().__init__()
self.image = random.choice(obstacle_images)
self.rect = self.image.get_rect(midbottom=(664, GROUND_Y))
def update(self):
self.rect.x -= speed
if self.rect.right < 0:
self.kill()تحتوي obstacle_images على كرة الأشواك والكتلة، وقد حُمّلتا مرة واحدة، لذا يختار كل عائق صورة من دون قراءة ملف. تُخرج kill() الكائن الرسومي من كل مجموعة ينتمي إليها، لذا تُحذف العوائق التي تغادر من اليسار.
أبقِها في مجموعة: تحرّك obstacles.update() كل العوائق، وترسمها obstacles.draw(screen) كلها. ويضيفها مؤقّت. في كل مرة يعمل فيها، أعد تشغيله بفاصل عشوائي، حتى لا يتمكن اللاعب من القفز على إيقاع منتظم:
if event.type == SPAWN:
obstacles.add(Obstacle())
pygame.time.set_timer(SPAWN, random.randint(1000, 2000))لا يستطيع العدّاء الاصطدام بها بعد. سنتناول ذلك لاحقًا.
التحدي
متوسط- أضف
SPAWN = pygame.USEREVENT + 1وspeed = 6وقائمةobstacle_imagesالتي تحتوي علىspike_ball.pngوblob.png. - اكتب الكائن الرسومي
Obstacleكما هو موضّح. - أنشئ مجموعة باسم
obstaclesوابدأ مؤقّتSPAWNعند 1500 مللي ثانية. - عند حدوث
SPAWN، أضف عائقًا وأعِد تشغيل المؤقّت باستخدامrandom.randint(1000, 2000). - حدّث المجموعة وارسمها في كل إطار.
جرّب بنفسك
import pygame
pygame.init()
screen = pygame.display.set_mode((640, 320))
pygame.display.set_caption("Sky Runner")
clock = pygame.time.Clock()
SKY = (140, 200, 240)
GROUND = (90, 160, 80)
GROUND_Y = 260
GRAVITY = 1
class Runner(pygame.sprite.Sprite):
def __init__(self):
super().__init__()
self.frames = [
pygame.image.load("assets/images/player.png").convert_alpha(),
pygame.image.load("assets/images/player_walk.png").convert_alpha(),
]
self.image = self.frames[0]
self.step = 0
self.rect = self.image.get_rect(midbottom=(100, GROUND_Y))
self.vy = 0
def jump(self):
if self.rect.bottom == GROUND_Y:
self.vy = -16
def update(self):
self.vy += GRAVITY
self.rect.y += self.vy
if self.rect.bottom >= GROUND_Y:
self.rect.bottom = GROUND_Y
self.vy = 0
if self.rect.bottom == GROUND_Y:
self.step += 1
self.image = self.frames[self.step // 8 % 2]
else:
self.image = self.frames[1]
runner = Runner()
running = True
while running:
for event in pygame.event.get():
if event.type == pygame.QUIT:
running = False
if event.type == pygame.KEYDOWN and event.key in (pygame.K_SPACE, pygame.K_UP):
runner.jump()
runner.update()
screen.fill(SKY)
pygame.draw.rect(screen, GROUND, (0, GROUND_Y, 640, 60))
screen.blit(runner.image, runner.rect)
pygame.display.flip()
clock.tick(60)
pygame.quit()
يتضمن هذا الدرس اختبارًا قصيرًا. ابدأ الدرس للإجابة عليه وتتبّع تقدمك.
جميع دروس قواعد اللعبة
تدرّب بنفسك: Playground لـ Pygame