第一课Pygame简介
Pygame 是一个游戏库,通常用于在 Python 中创建 2-D 游戏。它具有许多重要功能,例如碰撞检测、声音和音乐、图形、事件系统等等。
Pygame安装
在我们向您介绍任何 Pygame 代码之前,您需要做的第一件事就是下载并安装它。最简单和最常见的方法是通过下面的 pip 命令。
pip install pygame
创建 Pygame 窗口
在任何 Pygame 应用程序中,我们需要做的第一件事就是创建一个窗口。
#导入pygame模块
import pygame
#退出窗口程序时用到,帮助程序成功退出
import sys
#初始化Pygame引擎,所有 pygame 应用程序中都是必须
pygame.init()
#配置窗口大小
SCREEN_SIZE = WIDTH,HEIGHT = 400,300
#创建一个“屏幕”或“Surface”对象
screen = pygame.display.set_mode(SCREEN_SIZE)
pygame.display.set_mode()方法原型:
set_mode(size=(0, 0), flags=0, depth=0, display=0, vsync=0) -> Surface
上面的代码创建了一个宽 400 像素、高 300 像素的窗口。当你运行时,会有一个窗口一闪而过。这是因为程序已经运行完毕。
设置游戏循环
游戏循环是一个无限循环,只有在接收到关闭窗口事件时才会停止。
游戏循环流程:
- 事件处理
- 游戏状态处理
- 绘制游戏对象到屏幕
while True:
## 事件处理
## 游戏状态处理
## 绘制游戏对象到屏幕
pygame.display.update()
事件处理
运行以下代码,当你想关闭窗口时,会出现 关闭不了的问题。
import pygame
import sys
pygame.init()
SCREEN_SIZE = WIDTH,HEIGHT = 400,300
screen = pygame.display.set_mode(SCREEN_SIZE )
while True:
## 事件处理
## 游戏状态处理
## 绘制游戏对象到屏幕
pygame.display.update()
这是因为我们还没有编写处理事件。
使用pygame.event.get()返回所有事件,并遍历事件,检测是否有QUIT事件产生。
while True:
for event in pygame.event.get():
if event.type == pygame.QUIT:
pygame.quit()
sys.exit()
pygame.display.update()
在上面的代码中,我们通过检查每个事件的类型属性成功检测到 QUIT 事件。然后我们调用干净关闭所必需的两个函数,pygame.quit() 和 sys.exit()。(一定要先打调用pygame.quit())
在屏幕上绘画
接下来我们将在屏幕上绘制一个绿色的正方形。使用到pygame.Surface对象。
Surface构造函数
Surface((width, height), flags=0, depth=0, masks=None) -> Surface
Surface((width, height), flags=0, Surface) -> Surface
Surface的fill()方法
Surface.fill(color, rect=None, special_flags=0) -> Rect
#1.创建一个宽度=50 ,高度=50的Surface对象
surface = pygame.Surface((50, 50))
#2.调用fill() 方法填充Surface对象,color参数是一个(R,G,B)元组,元组中的每个值都在 0 – 255 之间
surface.fill((0,255,0))
这是完整的代码:
import pygame
import sys
pygame.init()
SCREEN_SIZE = WIDTH,HEIGHT = 400,300
GREEN = ( 0, 255, 0)
screen = pygame.display.set_mode(SCREEN_SIZE )
surface = pygame.Surface((50, 50))
surface.fill(GREEN)
while True:
events = pygame.event.get()
for event in events:
if event.type == pygame.QUIT:
pygame.quit()
sys.exit()
#将绘制的surface对象绘制到screen指定位置上
screen.blit(surface, (175, 125))
pygame.display.update()
了解屏幕的工作原理
这里需要注意的是,游戏循环的每次迭代都会将此Surface对象绘制到屏幕上。在这种情况下这不是强制性的,因为我们只绘制了一个静止的对象。
但在大多数情况下,我们有适当的背景和移动的精灵,我们需要在每次迭代中重新渲染所有内容。
Pygame 窗口就像一个画板。如果你把正方形画在中间,然后向左移动 100 像素,就会有两个正方形。这是因为您两次将正方形绘制到屏幕上。
下面的代码说明了这一点。(不要担心键盘事件代码,这将在键盘事件教程中解释)
import pygame
import sys
pygame.init()
SCREEN_SIZE = WIDTH,HEIGHT = 400,300
GREEN = (0,255,0)
screen = pygame.display.set_mode(SCREEN_SIZE )
surface = pygame.Surface((50, 50))
surface.fill(GREEN)
x = 100
y = 100
while True:
events = pygame.event.get()
for event in events:
if event.type == pygame.QUIT:
pygame.quit()
sys.exit()
if event.type == pygame.KEYDOWN:
if event.key == pygame.K_RIGHT:
x += 20
screen.blit(surface, (x,y))
pygame.display.update()
如果你多次按下“右箭头键”,屏幕上就会出现多个正方形叠加的效果。
解决方法:我们重新将窗口背景色填充成原来的黑色,相当于将原来的画板上的图像擦除掉,就可以解决这个问题
import pygame
import sys
pygame.init()
SCREEN_SIZE = WIDTH,HEIGHT = 400,300
GREEN = (0,255,0)
screen = pygame.display.set_mode(SCREEN_SIZE )
surface = pygame.Surface((10, 10))
surface.fill((0,255,0))
x = 100
y = 100
while True:
events = pygame.event.get()
for event in events:
if event.type == pygame.QUIT:
pygame.quit()
sys.exit()
if event.type == pygame.KEYDOWN:
if event.key == pygame.K_RIGHT:
x += 20
#填充窗口颜色
screen.fill((0,0, 0))
#绘制正方形
screen.blit(surface, (x,y))
pygame.display.update()
确保先绘制背景,然后再进行其他操作。如果先画正方形,再画背景,正方形就会被覆盖。