持续创作,加速成长!这是我参与「掘金日新计划 · 10 月更文挑战」的第22天,点击查看活动详情
pygame 设置曲面中的像素
您可以对表面执行的最基本操作之一是设置单个像素,这具有绘制小点的效果。很少需要一次绘制一个像素,因为有更有效的方法来绘制图像,但是如果您需要执行任何脱机图像操作,则它可能很有用。
若要在表面上绘制单个像素,请使用 set_at 方法,该方法采用
要设置的像素的坐标,后跟要设置的颜色。我们将通过编写一个绘制随机像素的脚本来测试set_at。当您运行清单 4-7 时,您将看到屏幕慢慢被随机颜色的点填满;每个像素都是一个单独的像素。
清单 4-7.绘制随机像素的脚本 (random.py)
获取表面中的像素
set_at的补码为get_at,它返回给定坐标处像素的颜色。获取像素对于碰撞检测有时是必要的,以便代码可以通过查看玩家角色下方的颜色来确定玩家角色所站立的内容。如果所有平台和障碍物都是某种颜色(或颜色范围),这将起作用相当不错。set_at只接受一个参数,该参数应该是要查看的像素坐标的元组。以下行获取称为 screen 的图面中坐标 (100,100) 处的像素:
警告 从硬件图面读取时,get_at方法可能非常慢。显示器可以是硬件表面,特别是如果您正在全屏运行 - 因此您应该避免获取显示器的像素。
锁定表面
每当Pygame绘制到表面上时,它首先必须被锁定。当表面
锁定,Pygame可以完全控制表面,在解锁之前,计算机上的任何其他进程都无法使用它。每当您在表面上绘制时,锁定和解锁都会自动发生,但如果Pygame必须进行许多锁定和解锁,则可能会变得效率低下。
在清单 4-7 中,有一个循环调用set_at 100 次,这导致 Pygame 锁定并解锁屏幕表面 100 次。我们可以通过手动执行锁定来减少锁定和解锁的数量并加快循环速度。清单 4-8 与前面的清单几乎相同,但运行速度更快,因为在绘制之前有一个锁定的调用,以及一个在绘制完所有像素后要解锁的调用。
警告 要锁定的呼叫数应与要解锁的调用数相同。如果您忘记解锁表面,Pygame可能会变得无响应。
清单 4-8.带锁定的随机像素(randoml.py)
并非所有表面都需要锁定。硬件表面可以(屏幕通常是硬件表面),但普通软件表面不会。Pygame 在曲面对象中提供了一个必须锁定的方法,如果曲面需要锁定,则返回 True。您可以在进行任何锁定或解锁之前检查 mustlock 的返回值,但是锁定不需要它的曲面没有问题,因此您也可以锁定计划进行大量绘制的任何曲面。
bliting
您可能最常使用的表面对象方法是 blit,它是位块传输的首字母缩略词。“闪烁”仅意味着将图像数据从一个表面复制到另一个表面。您将使用它来绘制背景,字体,字符以及游戏中的几乎所有其他内容!
要拆分表面,您可以从目标表面对象(通常是显示器)调用 blit,并为其提供源表面(您的子画面、背景等);后跟要将其拆分为的坐标。还可以通过将 Rect 样式对象添加到定义源区域的参数中来仅拆分曲面的一部分。以下是使用 blit 方法的两种方法:
它将一个名为背景的表面放在屏幕的左上角。如果
背景与屏幕具有相同的尺寸,我们不需要用纯色填充屏幕。
另一种方式是:
如果我们有一个包含几个食人魔行走帧的图像,我们可以使用这样的东西把它放到屏幕上。通过更改frame_no的值,我们可以从源表面的不同区域进行拆分。