淘先锋技术网

首页 1 2 3 4 5 6 7

第一课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 像素的窗口。当你运行时,会有一个窗口一闪而过。这是因为程序已经运行完毕。

设置游戏循环

游戏循环是一个无限循环,只有在接收到关闭窗口事件时才会停止。

游戏循环流程

  1. 事件处理
  2. 游戏状态处理
  3. 绘制游戏对象到屏幕
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()

确保先绘制背景,然后再进行其他操作。如果先画正方形,再画背景,正方形就会被覆盖。