מכשולים
חלק מהיחידה חוקי המשחק במסלול ה-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 ms. - בעת
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()
השיעור הזה כולל חידון קצר. התחילו את השיעור כדי לענות עליו ולעקוב אחרי ההתקדמות.
כל השיעורים ביחידה חוקי המשחק
תרגלו בעצמכם: Pygame אונליין