我正在执行碰撞检测,并想检查是否有一个矩形物体接触到播放器。我的墙使用.set_colorkey(background)
,其中background
是指定的背景色。问题是,当我用.get_rect()
得到墙的矩形时,它得到的是完整图像的大小,其中包括透明部分,而不仅仅是不透明部分。在
我想让墙图像文件的大小更小,以删除背景,但这将是不方便的,因为我将需要这样做的每一个部分透明的图像。我还考虑过使用数组来获取颜色,并检查它是否与背景颜色匹配,然后从那里获得矩形的大小,但这将是缓慢和繁琐的。在
for x, y in ((i, j) for i in land_x for j in land_y):
# land_x, land_y hold the tiles to be checked
try:
tx1, ty1, tx2, ty2 = \
texture[land[y][x]].get_rect()
# tx1, ty1 coordinates of top-left corner
# tx2, ty2 width and height respectively
if tx2 == 0 and ty2 == 0:
continue # skip to other objects
tx1 = x*64 - tx2/2
ty1 = y*64 - ty2/2
px1, py1, px2, py2 = \
PLAYER.get_rect()
px1 = player_x - px2/2
py1 = -player_y - py2/2
if p.Rect(px1, py1, px2, py2).colliderect(
p.Rect(tx1, ty1, tx2, ty2)
):
player_x -= direction_x
break # go outside loop to start checking y
except IndexError: # incase player is outside map
pass # skip to other objects
.get_rect()
输出一个整个图像大小的矩形,而我想要一个不包括透明部分的矩形。在
示例:
texture
是一个64x64图像,中间有一个48x48块。
背景色被移除,留下一个48x48纯色块(即使图像大小仍然是64x64)。在
预期产量:
texture.get_rect()
应输出大小为48x48的矩形。在
实际产量:
texture.get_rect()
而是输出一个64x64大小的矩形。在
如有任何帮助,将不胜感激
你把事情搞得太难了。你知道你的东西有多大。在创建时为每个对象添加一个较小的碰撞矩形,并将其用于碰撞。或者用一个圆,如果这是更好的对象。在
或者将现有的矩形尺寸乘以碰撞矩形的某个比例因子。不要做所有这些计算。为每个可碰撞对象存储一个Rect,并为玩家创建一个Rect。在
^{pr2}$然后直接测试碰撞:
如果玩家是精灵,它的矩形移动。查看文档中的示例代码。在
https://www.pygame.org/docs/ref/sprite.html
如果你想忽略碰撞检测中的透明像素,那就是像素完美碰撞。在
为了在pygame中实现这一点,pygame提供了^{} 类。通常使用^{} 创建掩码,并将其与^{} 和{a4}一起使用。在
也许可以考虑使用pygame的^{} 类来利用它提供的所有特性。在
即使您不想使用pygame的内置冲突检测,也可以查看一下source来了解它是如何工作的。在
相关问题 更多 >
编程相关推荐