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) #控制刷新,计算每两次刷新应有时间间隔,并设定时间

效果如下图所示:明显比之前慢了

1

二.键盘控制

​ 在没有加入自己的控制之前,这个程序更像是一个屏幕保护程序😂😂,下面就来实现通过键盘控制冰火人的运动速度

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]))的写法解释如下:

image-20210602133726871

经过若干次调节之后,他们的速度变成了这样

2

以上是关于pygame入门3的主要内容,如果未能解决你的问题,请参考以下文章

用python2.7编的小游戏

pygame入门

pygame入门

python入门教程python 3.4 安装 pygame 和 wxPython教程

Pygame 入门基本指南

Pygame入门 2022