一、引言
前面的用pygame开发自己的游戏-1. 基础与入门文章中,我们学习了如何画出一个方块,今天我们来学习如何让方块运动起来。
二、让方块自行移动
我们将前面文章出现的代码进行修改,我们将方块的x坐标改成变量x,while循环语句里每次将x的变量值增加5,运行程序后仔细看屏幕,会看到有个红色方块一闪而过(第一次看不清,尝试多运行几次)。这里对前面代码的理解很重要,虽然我们一直看到的图像是静止的,但实际上每次都是整个屏幕重新被填充成白色(代码SCREEN.fill((255, 255, 255))所做的事情),然后再重新画了个新的矩形(代码pygame.draw.rect(SCREEN, (255, 0, 0), (40, 30, 100, 50))所做的事情)。本节的代码也是类似,在每次循环中x的值都是不一样,所以矩形的位置也一直在变化,但由于x的范围很快超过屏幕的坐标,所以后面就看不到红色方块了。
import pygame, sys
# 初始化
pygame.init()
# 设置屏幕的宽度,高度
SCREEN = pygame.display.set_mode((400, 300))
# 设置窗口的标题
pygame.display.set_caption('Hello World!')
x = 10
# 游戏主循环
while True: # main game loop
for event in pygame.event.get():
# 处理退出事件
if event.type == pygame.QUIT:
pygame.quit()
sys.exit()
# 将屏幕的背景填充成白色,了解下RGB三原色
SCREEN.fill((255, 255, 255))
# 调用 pygame.display.update() 方法更新整个屏幕的显示
x = x + 5
pygame.draw.rect(SCREEN, (255, 0, 0), (x, 30, 100, 50))
pygame.display.update()
为了控制屏幕刷新的速度,我们在每次屏幕刷新后, 用pygame.time.delay函数进行延时,使程序稍微停一小会,运行后,我们就可以看到红色方块运行的速度比较慢些。
import pygame, sys
# 初始化
pygame.init()
# 设置屏幕的宽度,高度
SCREEN = pygame.display.set_mode((400, 300))
# 设置窗口的标题
pygame.display.set_caption('Hello World!')
x = 10
# 游戏主循环
while True: # main game loop
for event in pygame.event.get():
# 处理退出事件
if event.type == pygame.QUIT:
pygame.quit()
sys.exit()
# 将屏幕的背景填充成白色,了解下RGB三原色
SCREEN.fill((255, 255, 255))
# 调用 pygame.display.update() 方法更新整个屏幕的显示
x = x + 5
pygame.draw.rect(SCREEN, (255, 0, 0), (x, 30, 100, 50))
pygame.display.update()
pygame.time.delay(50)
pygame.time.delay() 暂停程序一段时间
delay(milliseconds) -> time, delay函数需要给一个int类型参数,表示延时多少毫秒
三、让方块来回移动
在上述代码里,目前的方块是永远往右边走的,我们尝试增加这么个功能,让方块走到右边后,让方块改变方向,往左边走。写/看代码前一定先用自己的话把事情描述清楚,我们用自己的话描述下要做的事情:
- 开始后,方块一直在右走
- 走到右边边界后,方块一直在左走
我们先看如何判断方块走到右边边界,整个屏幕的宽度应该是多少呢?前面的代码pygame.display.set_mode((400, 300))把屏幕的宽度设置为400。所以我们可以看当x的坐标为400时,方块奇左边刚好跟屏幕右边重叠,我们认为方块出界,我们可以用x的坐标是否大于400来判断方块是否走出界。
接着我们来解决方块向左走的功能。思考下方块向右走跟向左有什么区别?一个是x不断加5,一个是x减5。
我们可以写成x = x + dx,当向右走时dx为5,当向左时,dx为-5。代码如下:
import pygame, sys
# 初始化
pygame.init()
# 设置屏幕的宽度,高度
SCREEN = pygame.display.set_mode((400, 300))
# 设置窗口的标题
pygame.display.set_caption('Hello World!')
x = 10
dx = 5
# 游戏主循环
while True: # main game loop
for event in pygame.event.get():
# 处理退出事件
if event.type == pygame.QUIT:
pygame.quit()
sys.exit()
# 将屏幕的背景填充成白色,了解下RGB三原色
SCREEN.fill((255, 255, 255))
# 调用 pygame.display.update() 方法更新整个屏幕的显示
# 方块刚好走出左屏幕
if x >= 400:
dx = -5
x = x + dx
pygame.draw.rect(SCREEN, (255, 0, 0), (x, 30, 100, 50))
pygame.display.update()
pygame.time.delay(50)
四、 练习题
- 原来的方块是要完全走出屏幕右边后才反弹,尝试改成方块右边碰到屏幕右边就反弹。
- 目前方块走到左边不会反弹,增加代码,使方块回到左边后,碰到屏幕左边边界反弹往右走。
- 把方块横向运动改成上下移动。