Pygame Wallball 壁球小游戏初步学习1
- 相关引入库的术语
- 初步建立的程序框架1
- 进一步建立的程序框架2
- 改变框架中图标的程序框架3
- 防止程序后台运行的程序框架4
- 防止小球卡在边框,并且使小球的位置受鼠标操控的程序(鼠标型壁球小游戏)5
- 让框图背景颜色随小球位置变化的程序6
- 最后的文字版壁球小游戏7
相关引入库的术语
注意:应用代码片时要声明代码类型(如Python)
import pygame, sys
pygame 库:Pygame是一个利用SDL库的写就的游戏库, 是一组用来开发游戏软件的 Python 程序模块。SDL,全名Simple DirectMedia Layer,SDL是用C写的,不过它也可以使用C++进行开发,当然还有很多其它的语言,Pygame就是Python中使用它的一个库。pygame允许你在 Python 程序中创建功能丰富的游戏和多媒体程序,是一个高可移植性的模块可以支持多个操作系统,用它来开发小游戏非常适合。
安装方法:cmd->pip install pygame
sys 库:python 应用程序的标准库,无需手动安装。一般在程序开头声明即可正常使用相关功能。
sys是system的缩写,用来获取操作系统和编译器的一些配置,设置及操作。如判断文件和文件夹是否存在,创建文件文件夹,获取系统版本之类的操作。
初步建立的程序框架1
代码如下:
# pygame WallBall version 1
import pygame, sys
pygame.init()
screen = pygame.display.set_mode((600,400))
pygame.display.set_caption("Pygame壁球")
while True:
for event in pygame.event.get():
if event.type == pygame.QUIT:
sys.exit()
pygame.display.update()
程序运行后会出现以下框图:
进一步建立的程序框架2
# pygame WallBall version 2
import pygame, sys
pygame.init()
vInfo = pygame.display.Info()
# size = width, height = vInfo.current_w, vInfo.current_h
size = width, height = 600, 400
speed = [2, 2]
BLACK = 0, 0, 0
# screen = pygame.display.set_mode(size)
screen = pygame.display.set_mode(size, pygame.RESIZABLE)
# screen = pygame.display.set_mode(size, pygame.NOFRAME)
# screen = pygame.display.set_mode(size, pygame.FULLSCREEN)
pygame.display.set_caption("Pygame壁球")
ball = pygame.image.load("PYG02-ball.gif")
ballrect = ball.get_rect()
fps = 300
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:
speed[0] = speed[0]if speed[0] == 0 else (abs(speed[0])-1) * int(speed[0]/abs(speed[0]))
elif event.key == pygame.K_RIGHT:
speed[0] = speed[0]+1 if speed[0] > 0 else speed[0] - 1
elif event.key == pygame.K_DOWN:
speed[1] = speed[1]if speed[1] == 0 else (abs(speed[1])-1) * int(speed[1]/abs(speed[1]))
elif event.key == pygame.K_UP:
speed[1] = speed[1] + 1 if speed[1] > 0 else speed[1] - 1
elif event.key == pygame.K_ESCAPE:
sys.exit()
elif event.type == pygame.VIDEORESIZE:
size = width, height = event.size[0], event.size[1]
screen = pygame.display.set_mode(size, pygame.RESIZABLE)
ballrect = ballrect.move(speed[0], speed[1])
if ballrect.left < 0 or ballrect.right > width:
speed[0] = -speed[0]
if ballrect.top < 0 or ballrect.bottom > height:
speed[1] = -speed[1]
screen.fill(BLACK)
screen.blit(ball, ballrect)
pygame.display.update()
fclock.tick(fps)
此时的代码经过大量的添加与整理,初步完成了壁球小游戏的构建。
对新代码中的内容进行解析:
pygame.init()
初始化导入python的所有模块。相当于初始化你的pygame程序。
vInfo = pygame.display.Info()
创建视频显示信息对象,此时才有在显示屏上显示的窗口。
# size = width, height = vInfo.current_w, vInfo.current_h
将初始窗口的参数(宽、高)赋值给size参数。
size = width, height = 600, 400
手动将值赋给size。
speed = [2, 2]
设定壁球运动的初速度(以向下、向右为正方向)为向右2,向下2
BLACK = 0, 0, 0
不能在Pygame中直接使用RGB色彩的名称,将黑色对应RGB的坐标(0,0,0)参数赋值给BLACK,便于之后使用。
# screen = pygame.display.set_mode(size)
screen = pygame.display.set_mode(size, pygame.RESIZABLE)
# screen = pygame.display.set_mode(size, pygame.NOFRAME)
# screen = pygame.display.set_mode(size, pygame.FULLSCREEN)
这里列出了四种初始化窗口类型的方法,从上到下依次为:
1.按照size的参数对窗口进行初始化;
2.按照size的参数对窗口进行初始化,并且设置窗口为可改变大小型(可用鼠标自由放缩大小);
3.按照size的参数对窗口进行初始化,并且设置窗口为无边框型;
4.按照size的参数对窗口进行初始化,并且设置窗口为默认全屏。
ball = pygame.image.load("PYG02-ball.gif")
创建一个对象ball,也即为壁球的图片参数。
用pygame.image.load()函数,将对应地址的图片(建议将程序要用到的相关图片之类的东西放到程序对应的文件夹中,可简化调用地址)与其相关联。
ballrect = ball.get_rect()
rect是rectangle的缩写,代表用一个矩形将ballrect对应的图像框起来,并在窗口上运动。pygame传统艺能
fps = 300
接上,刷新有一个固定的频率,创建并将其设置为300.
fclock = pygame.time.Clock()
pygame.time.Clock()是计时用的函数,可以控制帧速率。将其赋给fclock,与fps对象在之后的代码中控制帧速率。
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:
speed[0] = speed[0]if speed[0] == 0 else (abs(speed[0])-1) * int(speed[0]/abs(speed[0]))
elif event.key == pygame.K_RIGHT:
speed[0] = speed[0]+1 if speed[0] > 0 else speed[0] - 1
elif event.key == pygame.K_DOWN:
speed[1] = speed[1]if speed[1] == 0 else (abs(speed[1])-1) * int(speed[1]/abs(speed[1]))
elif event.key == pygame.K_UP:
speed[1] = speed[1] + 1 if speed[1] > 0 else speed[1] - 1
此处为循环的大致框架。
为防止程序直接结束,设计了循环结构:
根据pygame.event.get()返回的对应活动,对其作出不同的反应:
如果用户点击了窗口右上角的“×”,此时终止程序,并退出;
如果用户按下了键盘上的“上下左右”四个键,则对应改变小球的速度大小:
左、下:速度逐步减少,并在速度减到0以下时反向;
右、上:无论左右,增加对应方向的速度。
注意此处的速度表示方法:
speed[0] 和speed[1]分别表示不同方向上的速度(上下、左右);
左、下键速度反向的方法是理解的小难点。
elif event.key == pygame.K_ESCAPE:
sys.exit()
为防止上述代码将窗口设置成无边框从而导致无法关闭窗口问题的发生,这里输入这样的代码,使得用户可以通过敲击“Esc”键退出程序。
elif event.type == pygame.VIDEORESIZE:
size = width, height = event.size[