pygame入门3
Posted 临风而眠
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了pygame入门3相关的知识,希望对你有一定的参考价值。
pygame入门(3)
- 在上一篇文章中,我们介绍了图片的基本导入,并且让图片自己动起来了,但是不是感觉上一篇文章里面的冰火人化身闪电侠,让人眼花缭乱
- 还有前面是冰火人自己动的,那我们怎样实现用键盘控制冰火人呢,那就一起来学习吧😉
一.控制屏幕帧率(窗口刷新速度)
我们之前的代码是这样子的
while True:
for event in pygame.event.get():
if event.type == pygame.QUIT:
sys.exit()
fireboy_rect =fireboy_rect.move(speed1[0],speed1[1])
watergirl_rect = watergirl_rect.move(speed2[0], speed2[1])
if fireboy_rect.left < 0 or fireboy_rect.right > width:
speed1[0] = -speed1[0]
if fireboy_rect.top <0 or fireboy_rect.bottom>height:
speed1[1] = -speed1[1]
if watergirl_rect.left < 0 or watergirl_rect.right>width:
speed2[0] = -speed2[0]
if watergirl_rect.top <0 or watergirl_rect.bottom>height:
speed2[1] = -speed2[1]
每一次while循环Rect对象就会立刻移动,而每两次while循环的时间间隔很小,所以坐标改变的非常快,那么我们就要设置循环的间隔。
初始化
首先,我们在程序的初始化部分增加如下代码:
fps = 100 #每秒帧率参数
fclock = pygame.time.Clock() #用 pygame.time.Clock()创建一个可以操作时间的对象
刷新屏幕
其次,我们在刷新屏幕部分增加如下代码
fclock.tick(fps)
tick在英文中有(钟表的)滴答声,发出滴答声,滴答地走时 的意思
tick()方法可表述为 clock.tick(framerate)
该方法用于控制帧速率(窗口刷新速度),如上面把fps设置为100,那么就是每秒钟100次帧刷新
帧率(Frame rate)是以帧称为单位的位图图象连续出现在显示器上的频率(速率)。该术语同样适用于计算机图形,每秒的帧数(fps)或者说帧率表示图形处理器处理场时每秒钟能够更新的次数
视频中每次展示的静态图像称为帧,游戏中每次冰火人停下的那个静态图像就是帧
完整代码
import pygame
import sys
pygame.init()
size = width, height = 600, 400
speed1 = [1,2]
speed2 = [2,3]
BLACK = 0, 0, 0 #背景是黑色
screen = pygame.display.set_mode(size)
pygame.display.set_caption("飞舞的冰火人")
fireboy = pygame.image.load("./img/火娃静.png")
watergirl = pygame.image.load("./img/冰娃静.png")
fireboy_rect = fireboy.get_rect()
watergirl_rect = watergirl.get_rect()
#屏幕帧率设置
fps = 100 #一秒钟可以运动fps个像素
fclock =pygame.time.Clock()
while True:
for event in pygame.event.get():
if event.type == pygame.QUIT:
sys.exit()
fireboy_rect =fireboy_rect.move(speed1[0],speed1[1])
watergirl_rect = watergirl_rect.move(speed2[0], speed2[1])
if fireboy_rect.left < 0 or fireboy_rect.right > width:
speed1[0] = -speed1[0]
if fireboy_rect.top <0 or fireboy_rect.bottom>height:
speed1[1] = -speed1[1]
if watergirl_rect.left < 0 or watergirl_rect.right>width:
speed2[0] = -speed2[0]
if watergirl_rect.top <0 or watergirl_rect.bottom>height:
speed2[1] = -speed2[1]
screen.fill(BLACK)
screen.blit(fireboy, fireboy_rect)
screen.blit(watergirl, watergirl_rect)
pygame.display.update()
fclock.tick(fps) #控制刷新,计算每两次刷新应有时间间隔,并设定时间
效果如下图所示:明显比之前慢了
二.键盘控制
在没有加入自己的控制之前,这个程序更像是一个屏幕保护程序😂😂,下面就来实现通过键盘控制冰火人的运动速度
WASD控制冰娃,上下左右键控制火娃
键盘操作也是事件的一种,所以放在获取事件并响应的部分
pygame.KEYDOWN是pygame的键盘敲击的事件定义,键盘每个键对应一个具体定义
其中↑键为:pygame.K_UP ↓为pygame.K_DOWN ←为pygame.K_LEFT →为pygame.K_RIGHT
w、a、s、d分别为pygame.K_w,pygame.K_a,pygame.K_s,pygame.K_d
完整代码
import pygame
import sys
pygame.init()
size = width, height = 600, 400
speed1 = [1,2] #火娃
speed2 = [2,3] #冰娃
BLACK = 0, 0, 0 #背景是黑色
screen = pygame.display.set_mode(size)
pygame.display.set_caption("飞舞的冰火人")
fireboy = pygame.image.load("./img/火娃静.png")
watergirl = pygame.image.load("./img/冰娃静.png")
fireboy_rect = fireboy.get_rect()
watergirl_rect = watergirl.get_rect()
#屏幕帧率设置
fps = 100
fclock =pygame.time.Clock()
while True:
for event in pygame.event.get():
if event.type == pygame.QUIT:
sys.exit()
# 添加按键控制
elif event.type == pygame.KEYDOWN:
if event.key == pygame.K_LEFT:
speed1[0] = speed1[0] if speed1[0] == 0 else (abs(speed1[0]) - 1) * int(speed1[0] / abs(speed1[0]))
elif event.key == pygame.K_RIGHT:
speed1[0] = speed1[0] + 1 if speed1[0] > 0 else speed1[0] - 1
elif event.key == pygame.K_UP:
speed1[1] = speed1[1] + 1 if speed1[1] > 0 else speed1[1] - 1
elif event.key == pygame.K_DOWN:
speed1[1] = speed1[1] if speed1[1] == 0 else (abs(speed1[1]) - 1) * int(speed1[1] / abs(speed1[1]))
elif event.key == pygame.K_a:
speed2[0] = speed2[0] if speed2[0] == 0 else (abs(speed2[0]) - 1) * int(speed2[0] / abs(speed2[0]))
elif event.key == pygame.K_d:
speed2[0] = speed2[0] + 1 if speed2[0] > 0 else speed2[0] - 1
elif event.key == pygame.K_w:
speed2[1] = speed2[1] + 1 if speed2[1] > 0 else speed2[1] - 1
elif event.key == pygame.K_s:
speed2[1] = speed2[1] if speed2[1] == 0 else (abs(speed2[1]) - 1) * int(speed2[1] / abs(speed2[1]))
fireboy_rect =fireboy_rect.move(speed1[0],speed1[1])
watergirl_rect = watergirl_rect.move(speed2[0], speed2[1])
if fireboy_rect.left < 0 or fireboy_rect.right > width:
speed1[0] = -speed1[0]
if fireboy_rect.top <0 or fireboy_rect.bottom>height:
speed1[1] = -speed1[1]
if watergirl_rect.left < 0 or watergirl_rect.right>width:
speed2[0] = -speed2[0]
if watergirl_rect.top <0 or watergirl_rect.bottom>height:
speed2[1] = -speed2[1]
screen.fill(BLACK)
screen.blit(fireboy, fireboy_rect)
screen.blit(watergirl, watergirl_rect)
pygame.display.update()
fclock.tick(fps)
其中speed1[0] = speed1[0] if speed1[0] == 0 else (abs(speed1[0]) - 1) * int(speed1[0] / abs(speed1[0]))的写法解释如下:
经过若干次调节之后,他们的速度变成了这样
以上是关于pygame入门3的主要内容,如果未能解决你的问题,请参考以下文章