Pygame中实现方块的反弹的流程如图1所示。
![](https://i-blog.csdnimg.cn/blog_migrate/3612a00b3f8aa1d04e87b178d750ea33.png)
图1 方块反弹流程
从图1中可以看出,通过不断改变方块的位置达到方块移动的效果,当方块碰到屏幕边界,则通过改变方块移动的方向来实现反弹效果。
1屏幕的创建
使用如下代码创建屏幕。
import pygame
from pygame.locals import *
pygame.init()
screen = pygame.display.set_mode((600,500))
其中,变量screen为创建的屏幕
2 方块的移动
2.1 定义变量
在移动方块的时候,需要定义方块的位置变量和移动的速度,代码如下所示。
pos_x = 300
pos_y = 250
vel_x = 2
vel_y = 1
其中,变量pos_x和pos_y表示方块的起始位置,即横坐标和纵坐标。代码中的取值表示方块从屏幕的中心位置开始移动。变量vel_x和vel_y表示方块在横向和纵向移动的速度。
2.2 移动方块
使用如下代码移动方块。
while True:
pos_x += vel_x
pos_y += vel_y
其中,方块在横轴和纵轴方向上移动的速度为定义的vel_x和vel_y。
3 是否碰到屏幕边界的判断
判断方块是否碰到屏幕边界,实际上就是判断方块的位置是否已经到了边界,代码如下所示。
#在while循环内部
if pos_x > 600-rect_width or pos_x<0:
vel_x = -vel_x
if pos_y > 500-rect_height or pos_y<0:
vel_y = -vel_y
其中600和500是在“1屏幕的创建”中定义的屏幕宽度和高度;变量rect_width和rect_height表示创建的方块的宽度和高度,这两个变量在while循环的外部定义。
#在while循环外部
rect_width = 50
rect_height = 50
从以上代码可知,当方块的位置(方块的左上角坐标)距离屏幕边界差方块的宽度或高度时表示方块与屏幕的右侧或底部碰撞;当方块的位置(方块的左上角坐标)小于0时,表示方块与屏幕左侧或顶部碰撞,此时将方块移动的速度改变方向,即将速度值变为原来值的相反数。
4 方块的绘制
在Pygame中,通过pygame.draw.rect()函数来绘制方块。该函数的有两种使用方法:基本型和扩展型。
4.1 pygame.draw.rect()函数的基本型
pygame.draw.rect()函数的基本型语法如下所示:
rect(surface, color, rect)
其中,参数surface表示要画方块的表面,该参数是Surface类的对象;参数color使用的颜色,该参数可以是整型或者元组;参数rect是Rect类的对象,表示方块的位置以及大小。该函数的返回值是Rect类的对象,表示画出来的方块。
4.2 pygame.draw.rect()函数的扩展型
pygame.draw.rect()函数的扩展型语法如下所示:
rect(surface, color, rect, width=0, border_radius=0, border_top_left_radius=-1, border_top_right_radius=-1, border_bottom_left_radius=-1, border_bottom_right_radius=-1)
其中,前三个参数与基本型的参数相同;参数width表示画方块线的粗细程度,当width的值是0时,参数color表示圆的填充颜色,当width的值大于0时,参数color表示画圆的线的颜色,width表示线的粗细,当width的值小于0时,忽略color和width参数;参数border_radius表示所画方块的四个角是否是圆角,该参数的取值范围是0~min(方块的高度,方块的宽度)/2,如果取值是0,则表示方块四个角不是圆角;接下来的四个参数border_top_left_radius、border_top_right_radius、border_bottom_left_radius和border_bottom_right_radius分别表示方块左上、右上、左下和右下角是否使用圆角,如果这四个参数的值小于1,则表示对应的角不是圆角,如果没有设置该值(默认值是-1),则表示对应的角与参数border_radius一致。
4.3 填充窗口
在每次循环中,需要重新将窗口填色,否则方块每次移动的轨迹都会显示在窗口中。为窗口填色的代码如下所示:
#在while循环外
screen_color = (0,0,200)
#在while循环中
screen.fill(screen_color)
其中,screen是“1屏幕的创建”中创建的屏幕。
4.4 绘制方块
绘制方块的代码如下所示:
#在while循环外
rect_color = (255,255,0)
width = 0
#在while循环中
pos = Rect((pos_x,pos_y),(rect_width, rect_height))
pygame.draw.rect(screen, rect_color, pos, width)
pygame.display.update()
其中,pos是Rect类的对象,包含了所画方块左上角坐标和方块宽度和高度;之后调用pygame.draw.rect()函数画方块,screen是“1屏幕的创建”中创建的屏幕,width的值是0,则color表示填充颜色;最后调用pygame.display.update()函数显示所画的方块。
图2显示的是程序的效果。
![](https://i-blog.csdnimg.cn/blog_migrate/27d9c789e296af31a1d4f9388e52d236.png)
图2 方块反弹