本教程是《Python游戏编程》系列的第5节,如果您还没有学习第4节,请看这里:Python游戏编程之事件监听(四)
对于我们的赛车游戏,现在的车辆还太少了,只有我们自己一辆,是时候需要添加更多的车辆了,开始吧!
我们前面讲过,每辆赛车都是一个对象,是从Car类中实例化出来的。
在主程序中,我们还将创建额外的四辆赛车,并将它们添加到名为“all_comming_cars”的列表中。每辆车将被赋予不同的颜色、速度和不同的起始位置(根据x和y坐标来控制),下面将列出完整的代码,你可以根据代码来比对学习。
这四辆车将从屏幕顶部开始运行,驶向屏幕底部,刚好与我们控制的小车方向相反。当它们到达屏幕底部时,将在屏幕顶部设置上新的颜色、速度和起始位置,这就会给你有一种各种各样源源不断的汽车的“幻象”。
游戏的整体速度将被存储在一个变量,新的事件处理程序将检测用户何时按下键盘上的上方向键或下方向键,从而使速度变量增加或减少0.05。
pygame
游戏完整代码
这是我们最新的Car类代码:
import pygameWHITE = (255, 255, 255)class Car(pygame.sprite.Sprite): def __init__(self, color, width, height, speed): super().__init__() self.image = pygame.Surface([width, height]) self.image.fill(WHITE) self.width = width self.height = height self.color = color self.speed = speed pygame.draw.rect(self.image, self.color, [0, 0, self.width, self.height]) self.rect = self.image.get_rect() def moveRight(self, pixels): self.rect.x += pixels def moveLeft(self, pixels): self.rect.x -= pixels def moveForward(self, speed): self.rect.y += self.speed * speed / 20 def moveBackward(self, speed): self.rect.y -= self.speed * speed / 20 def changeSpeed(self, speed): self.speed = speed def repaint(self, color): self.color = color pygame.draw.rect(self.image, self.color, [0, 0, self.width, self.height])
这是最新的主程序代码:
import pygame, random, sysfrom car import Carpygame.init()GREEN = (20, 255, 140)GREY = (210, 210, 210)WHITE = (255, 255, 255)RED = (255, 0, 0)PURPLE = (255, 0, 255)YELLOW = (255, 255, 0)CYAN = (0, 255, 255)BLUE = (100, 100, 255)speed = 1colorList = (RED, GREEN, PURPLE, YELLOW, CYAN, BLUE)SCREENWIDTH = 800SCREENHEIGHT = 600size = (SCREENWIDTH, SCREENHEIGHT)screen = pygame.display.set_mode(size)pygame.display.set_caption("F1赛车游戏")all_sprites_list = pygame.sprite.Group()playerCar = Car(RED, 60, 80, 70)playerCar.rect.x = 160playerCar.rect.y = SCREENHEIGHT - 100car1 = Car(PURPLE, 60, 80, random.randint(50, 100))car1.rect.x = 60car1.rect.y = -100car2 = Car(YELLOW, 60, 80, random.randint(50, 100))car2.rect.x = 160car2.rect.y = -600car3 = Car(CYAN, 60, 80, random.randint(50, 100))car3.rect.x = 260car3.rect.y = -300car4 = Car(BLUE, 60, 80, random.randint(50, 100))car4.rect.x = 360car4.rect.y = -900all_sprites_list.add(playerCar)all_sprites_list.add(car1)all_sprites_list.add(car2)all_sprites_list.add(car3)all_sprites_list.add(car4)all_coming_cars = pygame.sprite.Group()all_coming_cars.add(car1)all_coming_cars.add(car2)all_coming_cars.add(car3)all_coming_cars.add(car4)clock = pygame.time.Clock()while True: for event in pygame.event.get(): if event.type == pygame.QUIT: pygame.quit() sys.exit() elif event.type == pygame.KEYDOWN: if event.key == pygame.K_x: playerCar.moveRight(10) keys = pygame.key.get_pressed() if keys[pygame.K_LEFT]: playerCar.moveLeft(5) if keys[pygame.K_RIGHT]: playerCar.moveRight(5) if keys[pygame.K_UP]: speed += 0.05 if keys[pygame.K_DOWN]: speed -= 0.05 for car in all_coming_cars: car.moveForward(speed) if car.rect.y > SCREENHEIGHT: car.changeSpeed(random.randint(50, 100)) car.repaint(random.choice(colorList)) car.rect.y = -200 all_sprites_list.update() screen.fill(GREEN) pygame.draw.rect(screen, GREY, [40, 0, 400, SCREENHEIGHT]) pygame.draw.line(screen, WHITE, [140, 0], [140, SCREENHEIGHT], 5) pygame.draw.line(screen, WHITE, [240, 0], [240, SCREENHEIGHT], 5) pygame.draw.line(screen, WHITE, [340, 0], [340, SCREENHEIGHT], 5) all_sprites_list.draw(screen) pygame.display.flip() clock.tick(60)
下面是我们游戏的运行效果:
游戏作品运行效果
检测碰撞(彩蛋!)
最后,给你一个作业,我们现在的游戏,在碰到其他汽车后还没有反应,这可不行,多危险啊!像其他游戏一样,我们需要添加碰撞检测功能:目的是检查一个角色何时与其他角色发生碰撞,如果碰撞后,就需要扣分或者Game Over了!
汽车碰撞可不是好事
你需要在主程序循环的“游戏逻辑”部分中添加下面的代码,快去试试吧,祝你好远!
car_collision_list = pygame.sprite.spritecollide(playerCar,all_coming_cars,False) for car in car_collision_list: print("Car crash!")
好了,目前为止,我们已经完成了Pygame的F1赛车游戏,谢谢你的一路陪伴和学习,后面我会推出更多的精彩系列作品,快动手练习起来吧!
如果你喜欢我的文章,欢迎您关注我的头条号:@科技时代聊编程,也欢迎观看我的《跟我学Python,创意编程之旅》的系列原创编程视频,每天都有精彩视频等你喔!