pygamepygame入门


备注

Pygame是一个用于SDLPython包装器 - 一个用于控制多媒体的跨平台C库 - 由Pete Shinners编写。这意味着,使用pygame,您可以用Python编写视频游戏或其他多媒体应用程序,这些应用程序将在任何SDL支持的平台(Windows,Unix,Mac,beOS等)上运行。


本节概述了pygame是什么,以及开发人员为什么要使用它。

它还应该提到pygame中的任何大型主题,并链接到相关主题。由于pygame的文档是新的,您可能需要创建这些相关主题的初始版本。

版本

|版本| ==============> |发布日期|
| Pygame 1.9.0 | ========> | 2009年8月1日|
| Pygame 1.8.1 | ========> | 2008年7月30日|
| Pygame 1.8.0 | ========> | 2008年3月29日|
| Pygame 1.7.1 | ========> | 2005年8月16日|
| Pygame 1.6.2 | ========> | - |
| Pygame 1.6 | =========> | 2003年10月23日|
| Pygame 1.5 | =========> | 2002年5月30日|
| Pygame 1.4 | =========> | 2002年1月30日|
| Pygame 1.3 | =========> | 2001年12月19日|
| Pygame 1.2 | =========> | 2001年9月4日|
| Pygame 1.1 | =========> | 2001年6月23日|
| Pygame 1.0 | =========> | 2001年4月5日|
| Pygame 0.9 | =========> | 2001年2月13日|
| Pygame 0.5 | =========> | 2001年1月6日,星期四
| Pygame 0.4 | =========> | 2000年12月14日|
| Pygame 0.3 | =========> | 2000年11月20日|
| Pygame 0.2 | =========> | 2000年11月3日|
| Pygame 0.1 | =========> | 2000年10月28日|

一个简单的'游戏'


导入并初始化

每个模块都需要导入,pygame也不例外。虽然我们需要调用函数pygame.init() 来正确初始化pygame中的所有导入模块。如果我们忘记这一点,一些模块将无法工作。该函数还返回所有成功和失败的初始化的元组(如果模块初始化失败,则不会引发错误)。

import pygame
successes, failures = pygame.init()
print("{0} successes and {1} failures".format(successes, failures))
 

创造必需品

我们还需要创建一个显示器。 Pygame已经创建了一个(隐藏)显示,所以我们需要做的就是设置显示模式(在这个例子中我们只设置分辨率)。创建一个时钟以确保我们的程序以固定的速度更新也是一个好主意(否则它会以不同的速度运行,具体取决于计算机的速度)。

screen = pygame.display.set_mode((720, 480))  # Notice the tuple! It's not 2 arguments.
clock = pygame.time.Clock()
FPS = 60  # This variable will define how many frames we update per second.
 

为了稍后在我们的代码中可读性,我们将创建两个颜色常量,它们代表红色,绿色和蓝色(RGB)的元组。值从0(无光)到255(全光)。

BLACK = (0, 0, 0)
WHITE = (255, 255, 255)
 

在pygame中,我们通常使用Surface来表示对象的外观,使用Rect (矩形)来表示对象的位置。 表面就像一张包含颜色或图像的空白纸。如果您正在创建一个类,您应该将属性命名为imagerect,因为许多函数将查找并使用这些属性。这些类可以通过继承pygame.sprite.Sprite 类而受益,原因可以在这里阅读。

rect = pygame.Rect((0, 0), (32, 32))  # First tuple is position, second is size.
image = pygame.Surface((32, 32))  # The tuple represent size.
image.fill(WHITE)  # We fill our surface with a nice white color (by default black).
 

游戏循环

现在我们为游戏循环设置了所有内容。这是一个为整个游戏运行的循环,我们处理事件并更新屏幕和对象的位置。

首先,我们将确保我们的循环在给定的FPS下执行。我们定义了FPS并在程序开始时创建了我们的时钟。以下代码将确保我们的程序有足够的时间来使循环重复我们定义FPS的量。在这个例子中,每秒60次。

clock.tick(FPS)
 

然后我们将处理事件。事件基本上是用户操作,例如移动鼠标或按键。 Pygame会将所有这些事件注册到我们通过调用pygame.event.get() 得到的队列中。我们可以迭代这个并检查是否有我们想要处理的事件。事件有一个type属性,我们可以检查pygame模块中的常量来确定它是什么类型的事件。

for event in pygame.event.get():
    if event.type == pygame.QUIT:  # The user pressed the close button in the top corner of the window.
        quit()
        # Close the program. Other methods like 'raise SystemExit' or 'sys.exit()'.
        # Calling 'pygame.quit()' won't close the program! It will just uninitialize the modules.
 

我们还可以检查if event.type == pygame.KEYDOWN 以查看用户是否按下了键。在这种情况下,事件有一个属性 ,我们可以检查它以查看它代表的键。

for event in pygame.event.get():
    if event.type == pygame.QUIT:
        quit()
    elif event.type == pygame.KEYDOWN:
        if event.key == pygame.K_w:
            rect.move_ip(0, -2)  # Changes the rect's position.
        elif event.key == pygame.K_s:
            rect.move_ip(0, 2)
        elif event.key == pygame.K_a:
            rect.move_ip(-2, 0)
        elif event.key == pygame.K_d:
            rect.move_ip(2, 0)
 

现在我们需要显示我们的图像。首先,我们可能希望从之前的渲染中清除屏幕。我们通过用黑色填充整个屏幕来做到这一点(删除代码以了解我们为什么要清除它)。然后我们需要将图像 blit到屏幕上。 Blitting实际上意味着将图像复制到另一个表面(在我们的例子中是屏幕)。最后我们翻转更新屏幕。

当我们进行blitting时,我们实际上并没有向用户显示任何内容。想象一下它是一边的计算机而另一边是用户。计算机在屏幕的一侧绘制( blits ),将其翻转向用户,然后重复。

screen.fill(BLACK)
screen.blit(image, rect)
pygame.display.update()  # Or 'pygame.display.flip()'.
 

现在我们有一个基本的游戏!非常无聊,是的,但必需品在那里!结合您当前的Python知识,您应该能够创建出色的东西。


完整的代码

import pygame
successes, failures = pygame.init()
print("{0} successes and {1} failures".format(successes, failures))


screen = pygame.display.set_mode((720, 480))
clock = pygame.time.Clock()
FPS = 60  # Frames per second.

BLACK = (0, 0, 0)
WHITE = (255, 255, 255)
# RED = (255, 0, 0), GREEN = (0, 255, 0), BLUE = (0, 0, 255).

rect = pygame.Rect((0, 0), (32, 32))
image = pygame.Surface((32, 32))
image .fill(WHITE)  

while True:
    clock.tick(FPS)

    for event in pygame.event.get():
        if event.type == pygame.QUIT:
            quit()
        elif event.type == pygame.KEYDOWN:
            if event.key == pygame.K_w:
                rect.move_ip(0, -2)
            elif event.key == pygame.K_s:
                rect.move_ip(0, 2)
            elif event.key == pygame.K_a:
                rect.move_ip(-2, 0)
            elif event.key == pygame.K_d:
                rect.move_ip(2, 0)

    screen.fill(BLACK)
    screen.blit(image, rect)
    pygame.display.update()  # Or pygame.display.flip()
 

稍微改进了游戏机制

请注意,程序会检查我们何时按下按键,而不是当我们按住按键时。为了解决这个问题,我们可以引入速度变量。我们可以创建一个播放器类来保持它更有条理。为了避免与帧相关的移动(如果我们将FPS更改为30,对象将以一半的速度移动),我们通过将时间间隔传递给可移动对象来引入时间相关的移动。

import pygame

successes, failures = pygame.init()
print("Initializing pygame: {0} successes and {1} failures.".format(successes, failures))

screen = pygame.display.set_mode((720, 480))
clock = pygame.time.Clock()
FPS = 60

BLACK = (0, 0, 0)
WHITE = (255, 255, 255)


class Player(pygame.sprite.Sprite):
    def __init__(self):
        super().__init__()
        self.image = pygame.Surface((32, 32))
        self.image.fill(WHITE)
        self.rect = self.image.get_rect()  # Get rect of some size as 'image'.
        self.velocity = [0, 0]

    def update(self):
        self.rect.move_ip(*self.velocity)


player = Player()
running = True
while running:
    dt = clock.tick(FPS) / 1000  # Returns milliseconds between each call to 'tick'. The convert time to seconds.
    screen.fill(BLACK)  # Fill the screen with background color.

    for event in pygame.event.get():
        if event.type == pygame.QUIT:
            running = False
        elif event.type == pygame.KEYDOWN:
            if event.key == pygame.K_w:
                player.velocity[1] = -200 * dt  # 200 pixels per second
            elif event.key == pygame.K_s:
                player.velocity[1] = 200 * dt
            elif event.key == pygame.K_a:
                player.velocity[0] = -200 * dt
            elif event.key == pygame.K_d:
                player.velocity[0] = 200 * dt
        elif event.type == pygame.KEYUP:
            if event.key == pygame.K_w or event.key == pygame.K_s:
                player.velocity[1] = 0
            elif event.key == pygame.K_a or event.key == pygame.K_d:
                player.velocity[0] = 0

    player.update()

    screen.blit(player.image, player.rect)
    pygame.display.update()  # Or pygame.display.flip()

print("Exited the game loop. Game will quit...")
quit()  # Not actually necessary since the script will exit anyway.
 

关于此代码,仍有许多事情需要改进。我建议你阅读pygame 教程和理查德琼斯的演讲,以获得更深入的内容。

在显示器上导入pygame和绘图

入门

您必须执行以下操作才能开始使用Pygame:

import pygame
 

这将打开一个大小为640,480的窗口,并将其存储在名为screen的变量中。

设置窗口名称

为pygame窗口设置名称需要以下语法:

pygame.display.set_caption('Name')
 

关于屏幕

  • 点(0,0)位于屏幕的左上角。
  • x坐标从左到右增加,y坐标从上到下增加。这就是笛卡尔平面上的右侧坐标是正的,左侧是负的。但是,笛卡尔平面上的上侧坐标在顶部是正的并且是正的在底部。( 注意 :如果点是从原点获取的,则考虑这一点。)

更新屏幕

您对屏幕所做的更改 - 例如用颜色填充或在其上绘图 - 不会立即显示!
那怎么办呢?
你必须调用这个函数:

pygame.display.update()
 

颜色

pygame中的着色适用于RGB模式。
着色的代码是:

color_Name = (r,g,b)
 
  • R代表红色。
  • G代表绿色
  • B代表蓝色。
  • 所有三个都应该是0到255之间的整数,其中255是最亮的,0是最暗的

画画

  1. 画线

    pygame.draw.lines(screen, color, closed, pointlist, thickness)
     
  2. 绘制矩形

    pygame.draw.rect(screen, color, (x,y,width,height), thickness)
     
  3. 绘制圆圈

    pygame.draw.circle(screen, color, (x,y), radius, thickness)
     

将所有内容设置为循环

要创建循环,请使用以下代码:

running = True
while running:
  for event in pygame.event.get():
    if event.type == pygame.QUIT:
      running = False
      pygame.quit()
 

在pygame窗口上绘制一个矩形(代码)

import pygame
background_colour = (255,255,255) # White color
(width, height) = (300, 200) # Screen size
color=(0,0,0) #For retangle
screen = pygame.display.set_mode((width, height)) #Setting Screen
pygame.display.set_caption('Drawing') #Window Name
screen.fill(background_colour)#Fills white to screen
pygame.draw.rect(screen, color, (100,50,30,40), 1) #Drawing the rectangle
pygame.display.update()

#Loop
running = True
while running:
  for event in pygame.event.get():
    if event.type == pygame.QUIT:
      running = False
      pygame.quit()
 

安装pygame

在窗户上

  1. 导航到http://www.lfd.uci.edu/~gohlke/pythonlibs/#pygame - 一个非官方站点,为Christoph Gohlke官方CPython发行版提供开源python包的windows二进制文件。

  2. 根据您安装的python版本下载相应的pygame .whl 文件。 (该文件的名称类似于pygame - <pygame version> - <python version> - win32.whl

  3.  pip install your-pygame-package.whl
     

    在你的终端,bash或consol里面。
    注意:如果pip 中找不到PATH 尝试运行python -m pip install your-pygame-package.whl

  4. 检查是否可以将pygame导入为python模块

    import pygame
     

    如果你没有收到错误,你已经在你的计算机上正确安装了pygame :)

在linux上

  1. 打开终端并运行

    sudo apt-get install python-pygame
     

    注意:这将为python2安装pygame

  2. 尝试在里面导入pygame

    import pygame
     

    如果你没有收到错误,你已经在linux系统上正确安装了pygame :)

在macOS上

有两种方法可以在mac上安装它:

方法1

转到Pygame下载页面并下载mac安装程序。运行它,它应该在你的Mac上安装Pygame。

方法2

安装Homebrew

/usr/bin/ruby -e "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/master/install)"
 

然后使用Homebrew安装Python 2.7.12和Pygame:

brew install python; brew install homebrew/python/pygame
 

现在在终端中运行Python并尝试import pygame 。如果它没有说什么,它已成功安装。