Menu
CoddyTech

מכשולים

חלק מהיחידה חוקי המשחק במסלול ה-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))

הרץ עדיין לא יכול לפגוע בהם. זה יגיע בהמשך.

challenge icon

אתגר

בינוני
  1. הוסף SPAWN = pygame.USEREVENT + 1, את speed = 6 ורשימה בשם obstacle_images עם spike_ball.png ו-blob.png.
  2. כתוב את הספרייט Obstacle כפי שמוצג.
  3. צור קבוצה בשם obstacles והפעל את הטיימר SPAWN למשך 1500 ms.
  4. בעת SPAWN, הוסף מכשול והפעל מחדש את הטיימר עם random.randint(1000, 2000).
  5. עדכן וצייר את הקבוצה בכל פריים.

נסו בעצמכם

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()
quiz iconבחנו את עצמכם

השיעור הזה כולל חידון קצר. התחילו את השיעור כדי לענות עליו ולעקוב אחרי ההתקדמות.

כל השיעורים ביחידה חוקי המשחק

תרגלו בעצמכם: Pygame אונליין