在使用pygame.transform.rotate()
时,我一直试图围绕图像的中心旋转图像,但它不起作用。具体来说,挂起的部分是rot_image = rot_image.subsurface(rot_rect).copy()
。我有个例外:
ValueError: subsurface rectangle outside surface area
下面是用于旋转图像的代码:
def rot_center(image, angle):
"""rotate an image while keeping its center and size"""
orig_rect = image.get_rect()
rot_image = pygame.transform.rotate(image, angle)
rot_rect = orig_rect.copy()
rot_rect.center = rot_image.get_rect().center
rot_image = rot_image.subsurface(rot_rect).copy()
return rot_image
上面的答案有一些问题:前一个rect的位置需要在函数中可用,以便我们可以将其分配给新的rect,例如:
在另一个答案中,位置是通过从原始图像创建一个新的矩形来获得的,但这意味着它将被定位在默认的(0,0)坐标。
下面的示例应该可以正常工作。新的rect需要旧rect的
center
位置,因此我们也将其传递给函数。然后旋转图像,调用get_rect
以获得具有正确大小的新rect,并将旧rect的center
属性作为center
参数传递。最后,将旋转后的图像和新的rect作为元组返回,并在主循环中将其解压缩。这是另一个旋转游戏精灵的例子。
简短回答:
存储源图像矩形的中心,并在旋转后根据存储的中心位置更新旋转图像矩形的中心,然后返回旋转图像和矩形的元组:
或者编写一个旋转的函数并
.blit
图像:长答案:
对于以下示例和说明,我将使用由渲染文本生成的简单图像:
图像(^{} )可以通过^{} 旋转。
如果循序渐进地进行循环,则图像会失真并迅速增加:
这是因为,旋转图像的边界矩形总是大于原始图像的边界矩形(某些旋转是90度的倍数除外)。
图像因为多次复制而失真。每次旋转都会产生一个小误差(误差)。误差之和在增加,图像在衰减。
这可以通过保持原始图像和“blit”一个由原始图像的一个旋转操作生成的图像来修复。
现在,图像似乎可以任意更改其位置,因为图像的大小随旋转而改变,并且原点始终是图像的边框左上角。
这可以通过比较旋转前后图像的axis aligned bounding box来补偿。} 。注意,屏幕上的y点是沿着屏幕向下的坐标,但是数学上的y轴点是从下到上的。这导致在计算过程中y轴必须“翻转”
对于下面的数学运算,使用^{
使用边界框的4个角点设置列表:
通过^{} 将矢量旋转到角点:
获取旋转点的最小值和最大值:
通过将旋转框的最小值添加到位置,计算图像左上点的“补偿”原点。对于y坐标,
max_box[1]
是最小值,因为沿y轴“翻转”:甚至可以在原始图像上定义轴。必须计算轴相对于图像左上角的“平移”,并且图像的“blit”位置必须被平移所取代。
定义轴,例如在图像中心:
计算旋转轴的平移:
最后计算旋转图像的原点:
在下面的示例程序中,函数
blitRotate(surf, image, pos, originPos, angle)
执行上述所有步骤,并将旋转的图像“blit”到曲面上。surf
是目标曲面image
是必须旋转的表面,并且blit
pos
是枢轴在目标表面上的位置surf
(相对于surf
的左上角)originPos
是枢轴在image
表面上的位置(相对于image
的左上角)angle
是旋转角度,单位为度您正在删除rotate创建的矩形。您需要保留rect,因为它在旋转时会改变大小。
如果要保留对象位置,请执行以下操作:
相关问题 更多 >
编程相关推荐