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