URLhttps://learnscript.net/zh/pygame/surface/child/
    复制链接转到说明  示例

    如何创建子表面?以及获取父表面和顶级表面,获取子表面位置

    我被代码海扁署名-非商业-禁演绎
    阅读 3:52·字数 1160·发布 

    为表面创建子表面

    在 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 对象一段。

    在下面的示例中,虽然我们将子表面的透明颜色键设置为了红色,但红色依然被绘制在了游戏窗口中。

    create.py
    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_parentget_abs_parent方法,可用于获取表面的父表面和顶级表面。

    get_parent()
    get_abs_parent()

    返回值

    get_parent方法的返回值是表示父表面的Surface对象,如果表面本身是顶级表面,则返回空值Noneget_abs_parent方法的返回值是表示顶级表面的Surface对象,如果表面本身是顶级表面,则返回其自身。

    在下面的示例中,顶级表面s的父表面和顶级表面分别为None和其自身。

    parent.py
    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_offsetget_abs_offset方法,可用于获取子表面在父表面和顶级表面中的位置。

    get_parent()
    get_abs_parent()

    返回值

    get_offsetget_abs_offset方法的返回值是形式类似于(x,y)的 Python 元组,其中x为子表面在父表面或顶级表面中的 X 坐标,y为子表面在父表面或顶级表面中的 Y 坐标,如果表面本身是顶级表面,则返回(0,0)

    position.py
    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)

    源码

    src/zh/surface/child·codebeatme/pygame·GitHub