Pygame 教程(2):重要的概念及对象

本章,将介绍 Pygame 中的重要概念及对象。

导航

上一章:创建第一个应用程序
下一章:绘制图形

像素坐标

Pygame 所创建的窗口,其实只是屏幕上的像素(pixel)组合而成的。最开始每个像素都是黑色的,但是可以在渲染过程中设置为不同的颜色。

大多数游戏框架,包括 Pygame,使用平面直角坐标系来表示特定的坐标。而在 Pygame 中,左上角的像素坐标记作 (0, 0),向右x坐标递增,向下y坐标递增,反之亦然。

Rect 对象

Pygame 中会经常用到pygame.Rect对象,它用于存储矩形坐标。在构造函数中,通常需要传入矩形的x坐标、y坐标、长和宽。

大多数以Rect对象作为参数的 Pygame 函数,都支持用其他的方式来表示矩形坐标。如pygame.Rect(10, 10, 20, 30)也可以用元组表示为(10, 10, 20, 30)((10, 10), (20, 30))等。

Pygame 为Rect对象定义了很多属性及方法,在此不做赘述,请参见官方文档

Color 对象

在 Pygame 中,使用 R(red) G(green) B(blue) 模式表示颜色,其中每个值都在 0~255 的范围内,特别地,当需要指定透明值 A(alpha) 时,使用 RGBA 表示颜色。在 RGB 模式下,(0, 0, 0) 表示黑色,(255, 255, 255) 表示白色。

Pygame 定义了pygame.Color对象。与pygame.Rect类似,pygame.Color也可以表示为三元(RGB)或四元(RGBA)元组。详见官方文档

Surface 对象

Pygame 中另一个常用的对象就是pygame.Surface对象,用于表示图像。可以在构造函数中传入一个元组以指定图像的大小。

Pygame 中很多 2D 元素都是Surface对象,如渲染的文本、加载的图片、Pygame 精灵等。

值得一提的是,其实显示屏幕,即pygame.display.set_mode返回的也是Surface对象。这意味着,你可以像操作普通的图像一样操作显示屏幕,例如绘制图形、填充等。而之所以 Pygame 的显示屏幕默认是黑色的,也是因为pygame.Surface对象会默认将背景填充为黑色。

pygame.Surface对象也定义了许多的方法以操作图像,常用的方法如下表所示:

方法定义方法作用
pygame.Surface.get_size() -> (width, height)返回此图像的大小。
pygame.Surface.get_rect(**kwargs) -> Rect返回此图像对应的矩形对象。未传入参数时,该矩形以(0, 0)作为左上角坐标。当传入键值参数时,可以为创建的矩形指定特定的属性:如get_rect(center=(100, 100))将返回一个以(100, 100)作为中心的矩形。
pygame.Surface.copy() -> Surface返回此图像的副本。
pygame.Surface.fill(color, rect=None, special_flags=0) -> Rect为图像填充一个颜色,返回受影响的区域的矩形坐标。如果传入rect参数,将指定填充的区域。special_flags可以指定图像与填充颜色混合的方式,此特性比较复杂,在此不做解释,详见官方文档
pygame.Surface.blit(source, dest, area=None, special_flags=0) -> Rect将指定的图像绘制到此图像上,返回受影响的区域的矩形坐标。source指定要绘制到此图像的源图像。dest可以为一个表示源图像绘制位置的左上角坐标的二元元组,也可以为一个pygame.Rect对象,此时,矩形的左上角坐标表示绘制的位置,但是绘制时将会忽略矩形的大小,而不是根据矩形的大小拉伸源图像!area参数也是一个pygame.Rect对象,可以截取源图像的一部分再绘制到此图像上。special_flags参数,同pygame.Surface.fill方法,详见官方文档

实例:矩形生成器

为使读者能够更加透彻地了解上述知识,我们将创建一个随机生成矩形的程序。

请创建一个新的文件,命名为rect_generator.py

创建初始窗口

上一章一样创建初始窗口,代码如下:

import random
import sys

import pygame

pygame.init()

SCREEN = pygame.display.set_mode((600, 600))
pygame.display.set_caption('Rect Generator')

while True:
    for event in pygame.event.get():
        if event.type == pygame.QUIT:
            pygame.quit()
            sys.exit()
    pygame.display.update()

与之前不同的是,我们导入了random库,该模块可用于生成随机数。

创建生成矩形的函数

添加生成矩形的函数,代码如下:

def generate():
    left = random.randint(0, 400)
    top = random.randint(0, 400)

    width = random.randint(0, 200)
    height = random.randint(0, 200)

    color = (random.randint(0, 255), random.randint(0, 255),
             random.randint(0, 255))

    surf = pygame.Surface((width, height))
    surf.fill(color)
    SCREEN.blit(surf, (left, top))

上述代码中:

  • lefttop限制在 0~400 之间,把widthheight限制在 0~200 之间,这样可以防止矩形超出窗口。
  • random.randint(0, 255)为 RGB 每个值创建一个随机数,以生成一个随机的颜色。
  • 创建了一个指定大小的pygame.Surface对象,填充为指定的颜色。
  • surf绘制到显示屏幕上,把位置设置为(left, top)

调用函数

在游戏循环中调用生成矩形的函数,代码如下:

while True:
    for event in pygame.event.get():
        if event.type == pygame.QUIT:
            pygame.quit()
            sys.exit()
    # SCREEN.fill((0, 0, 0))
    generate()  # 调用生成矩形的函数
    pygame.display.update()

上述代码,并没有在调用generate函数之前调用fill函数,如果调用了,则每一次循环都会以指定颜色填充屏幕,此时运行效果为矩形在窗口上跳动,而非一个个矩形叠加在窗口上,读者可以自行尝试。

完整代码

import random
import sys

import pygame

pygame.init()

SCREEN = pygame.display.set_mode((600, 600))
pygame.display.set_caption('Rect Generator')


def generate():
    left = random.randint(0, 400)
    top = random.randint(0, 400)

    width = random.randint(0, 200)
    height = random.randint(0, 200)

    color = (random.randint(0, 255), random.randint(0, 255),
             random.randint(0, 255))

    surf = pygame.Surface((width, height))
    surf.fill(color)
    SCREEN.blit(surf, (left, top))


while True:
    for event in pygame.event.get():
        if event.type == pygame.QUIT:
            pygame.quit()
            sys.exit()
    # SCREEN.fill((0, 0, 0))
    generate()
    pygame.display.update()

代码运行截图:

代码运行截图

结语

以上,就是本章的内容。下一章,我们将会学习在 Pygame 中绘制图形。

  • 1
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值