如何创建子表面?以及获取父表面和顶级表面,获取子表面位置
关注 1421
为表面创建子表面
在 Pygame 中,你可以为游戏表面添加子表面,拥有子表面的表面被称为父表面。需要指出的是,创建子表面并不会产生新的像素,对子表面中的像素进行修改等同于对父表面中的像素进行修改,反之亦成立。此外,子表面拥有与父表面相同的调色板,透明颜色键和透明度,但修改他们并不能达到预期效果,因为如何绘制取决于父表面的相关设置。
Surface
对象的subsurface
方法,可根据给出的矩形信息,创建游戏表面的子表面,其参数与Rect
对象的构造器的参数类似,其中参数rect
等同于Rect
构造器的参数single_arg
。
subsurface(left, top, width, height)
subsurface(left_top, width_height)
subsurface(rect)
- 返回值
subsurface
方法的返回值是表示子表面的Surface
对象。
矩形
关于Rect
对象的构造器的参数,你可以查看Pygame 中的 Rect 对象一段。
在下面的示例中,虽然我们将子表面的透明颜色键设置为了红色,但红色依然被绘制在了游戏窗口中。
from pygame import Surface, SRCALPHA
# 创建游戏表面和子表面
s = Surface([800, 600], SRCALPHA)
c = s.subsurface(0, 0, 100, 100)
s.fill('#ffff0099', [0, 0, 800, 600])
# 将子表面的透明颜色键设置为红色,但不会达到预期效果
c.set_colorkey('#ff0000')
c.fill('#ff0000', [0, 0, 100, 100])
# 查看父表面的像素是否已经被修改
print(s.get_at([0, 0]))
# 创建游戏窗口并绘制 s
from pygame import display
w = display.set_mode((800, 600))
w.blit(s, (0, 0))
display.flip()
import time
time.sleep(3)
获取表面的父表面
除了可以为游戏表面创建子表面,你还可以为已经创建的子表面创建子表面,在这种嵌套关系中,其父表面不存在的表面是其他所有子表面的顶级表面。
Surface
对象的get_parent
和get_abs_parent
方法,可用于获取表面的父表面和顶级表面。
get_parent()
get_abs_parent()
- 返回值
get_parent
方法的返回值是表示父表面的Surface
对象,如果表面本身是顶级表面,则返回空值None
。get_abs_parent
方法的返回值是表示顶级表面的Surface
对象,如果表面本身是顶级表面,则返回其自身。
在下面的示例中,顶级表面s
的父表面和顶级表面分别为None
和其自身。
from pygame import Surface
# 创建游戏表面和子表面
s = Surface([800, 600])
c = s.subsurface(0, 0, 10, 10)
cc = c.subsurface(0, 0, 10, 10)
# cc 的父表面为 c
print(cc.get_parent() == c)
# cc 的顶级表面为 s
print(cc.get_abs_parent() == s)
# 获取 s 的父表面和顶级表面
print(s.get_parent())
print(s.get_abs_parent())
True
True
None
<Surface(800x600x32 SW)>
获取表面的位置
Surface
对象的get_offset
和get_abs_offset
方法,可用于获取子表面在父表面和顶级表面中的位置。
get_parent()
get_abs_parent()
- 返回值
get_offset
和get_abs_offset
方法的返回值是形式类似于(x,y)
的 Python 元组,其中x
为子表面在父表面或顶级表面中的 X 坐标,y
为子表面在父表面或顶级表面中的 Y 坐标,如果表面本身是顶级表面,则返回(0,0)
。
from pygame import Surface
# 创建游戏表面和子表面
s = Surface([800, 600])
c = s.subsurface(100, 200, 50, 50)
cc = c.subsurface(12, 13, 1, 1)
# 获取表面 cc 在父表面和顶级表面中的位置
print(cc.get_offset())
print(cc.get_abs_offset())
(12, 13)
(112, 213)