【Python】使用Pygame做一个Flappy bird小游戏(二)

时间:2022-07-23
本文章向大家介绍【Python】使用Pygame做一个Flappy bird小游戏(二),主要内容包括其使用实例、应用技巧、基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下。

做一个Flappy bird游戏的第二步就是按键检测。Flappy bird只需要用一个按键控制小鸟的飞行就可以了。

1.0 实现效果

1.1 需要的函数

  1. 获取事件。
pygame.event.get()
  1. 事件类型判断,这个函数在之前就被用来检测是否退出程序。这里我们用它来检测是否有按键被按下。
event.type == KETDOWN
  1. 获取按下的键值,返回一个元组,这个元组的索引就是键值,用K_a,K_b...表示
pygame.key.get_pressed()

1.2 检测空格键

首先需要对获取的事件进行类型判断,如果类型是KEYDOWN,需要获取按下的键值并则进一步对键值进行判断。

for event in pygame.event.get():	#获取事件
	if event.typr == KEYDOWN:		#判断事件类型
		press_keys = pygame.key,get_pressed()	#获取键值
		if press_keys[K_SPACE]:		#对键值进行判断
			...						#如果按下的是空格,则...

这样,我们就实现了对空格键的检测。

1.3 优化程序

在对小鸟程序进行改写前,我们需要对之前的程序进行改写一下,以方便之后的操作。

首先是绘制图像,欢迎界面的元素不一定全都是游戏界面中的,所以我们需要将它们分别写在不同函数中。

def welcome():
    screen.blit(background,(0,0))
    screen.blit(green_base,(base_x,400))
    screen.blit(welcome1,(52,52))

其次是实现小鸟翅膀扇动的功能,为了让程序进一步模块化,我也将他拿出来编写成了函数。

#换图
def drawbird(count):
    count +=change_speed*time_passed_seconds
    if 0<=(count)<=50:
        screen.blit(mid_bird,(52,base_y))
    elif 50<(count)<=100:
        screen.blit(up_bird,(52,base_y))
    elif 100<(count)<=150:
        screen.blit(down_bird,(52,base_y))
    if count>140:
        count -= 140
    return count

最后是小鸟运动的功能,这一部分在游戏界面和开始界面是不同的,游戏界面可以在此基础上更改。

#开始界面的小鸟、绿砖运动
def updatexy(time_passed_seconds,base_x,base_y,dirx):
    distance_moved = time_passed_seconds * speed
    bird_distance = time_passed_seconds * bird_speed
    base_y = base_y + dirx*bird_distance
    base_x -= distance_moved
    if base_x<-40:
        base_x += 40
    if base_y >235:#base_y+10:
        dirx = -1
    if base_y <215:#base_y-10:
        dirx = 1         
    return base_x,base_y,dirx

这样,就完成了对之前程序的调整,下一步就开始实现游戏需要的功能。

1.4 控制小鸟

控制为了实现控制小鸟功能,我们首先需要进入游戏界面,其次是让小鸟对空格键做出反应,最后对小鸟的飞行范围做限制。

1.4.1 制作游戏界面

游戏界面与开始界面最大的不同就是游戏界面少了下面这个图像,所以我们需要在游戏界面的元素中去掉它。

def start():
    screen.blit(background,(0,0))
    screen.blit(green_base,(base_x,400))

1.4.2 游戏界面小鸟的运动

游戏界面小鸟的运动和开始界面的小鸟运动有所区别。主要是游戏界面小鸟在不按空格时会不断向下坠并且飞行范围为整个游戏界面。为了实现这一功能,我对原来的updatexy()函数做了一些更改。首先是让小鸟飞行方向一直向下(dirx>0),并且让向下飞的速度为原来的两倍(dirx=2)。其次对小鸟的飞行范围做出限制,让小鸟一直处于0~490之间飞行。

def start_updatexy(time_passed_seconds,base_x,base_y,dirx):
    distance_moved = time_passed_seconds * speed
    bird_distance = time_passed_seconds * bird_speed
    base_y = base_y + dirx*bird_distance
    base_x -= distance_moved
    if base_x<-40:
        base_x += 40
    if 490>base_y >20:
        dirx = 2
    elif base_y >490:
        base_y = 490         
    elif base_y <0:
        base_y = 0
    return base_x,base_y,dirx

1.4.3 控制小鸟

最后也是最重要的,小鸟需要被控制,控制的方式就是通过空格键。每按一下空格键,小鸟就需要向上飞一些。但这个飞的距离,同样容易收到机器性能和程序运行时间的影响。为了消除这个影响,我仍然使用上一节提到的基于时间的速度控制,以保证在每一段时间里,小鸟飞行的距离相同。

基于时间的速度控制:设定一个速度值,并记录每一次循环运行的时间(时间长的循环飞的距离大些,时时间短的循环飞的距离小一些),这样就可以保证在同一段时间里,飞行的距离相同。

def moved(base_y,bird_speed1):
    press_key1 = pygame.key.get_pressed()
    if press_key1[K_SPACE]:
        #base_y -= 2
        bird_distance = time_passed_seconds * bird_speed1
        base_y = base_y - bird_distance
    return base_y

1.5 进入游戏

上面都是进入游戏后,需要实现的功能。对于进入游戏功能的实现,我引入了一个标志位变量(start_flag)并将他初始化为0,这样不仅可以进入游戏,还可以返回开始界面,当检测到空格被按下时,该变量被置1。

    if press_keys[K_SPACE]:	#按空格进入游戏
        start_flag = 1
    if press_keys[K_a]:		#按a退出游戏
        start_flag = 0
    if start_flag == 1:		#实现游戏功能
        time_passed = clock.tick()
        time_passed_seconds = time_passed / 1000 
        start()
        base_y = moved(base_y,500)
        count = drawbird(count)
        base_x,base_y,dirx = start_updatexy(time_passed_seconds,base_x,base_y,dirx)

至此,我们实现了通过按键进入游戏界面并控制小鸟。