def _convertpos(x,y):
“””把x,y坐标转换回以左上角为原点的x,y坐标,和屏幕的缩放参数scale无关。”””
if Turtle._screen is None:return
screen = Screen() # 返回屏幕对象
x = x + screen.window_width() //2
y = screen.window_height() //2 – y
return x,y
def _cut_sub_rect(sprite,rect):
“””返回相对于sprite所在矩形的子矩形,当然,只适合于图像造型
这个子矩形的左上角坐标以sprite左上角坐标为原点的。
“””
left,top,right,bottom = sprite.bbox()
left1,top1 = _convertpos(left,top)
left2,top2,right2,bottom2 = rect
left2,top2 = _convertpos(left2,top2)
right2,bottom2 = _convertpos(right2,bottom2)
dleft = int(left2 – left1)
dtop = int(top2 – top1)
dright = int(right2 – left1)
dbottom = int(bottom2 – top1)
return dleft,dtop,dright,dbottom
def _make_mask(sprite,rect):
“””
坐标系以左上角为原点的,截取角色子矩形区域的alpha形成mask
最后形成的mask是一个numpy二维数组,1代表不透明区域,0代表透明区域。
“””
im = np.array(sprite._current_im) # 角色当前的图形对象转换成numpy数组
alpha = im[:, :, 3] # 提取所有透明通道的alpha值
left,top,right,bottom = _cut_sub_rect(sprite,rect)
alpha = alpha[top:bottom,left:right] # 子矩形的alpha通道所有值
mask = alpha > 127 # 127是阈值,即大于127的认为不透明
mask.dtype=np.uint8 # 转换成整数
return mask # 返回遮罩