您好, 欢迎来到 !    登录 | 注册 | | 设为首页 | 收藏本站

如何围绕矩形居中放置一个表面(子表面)?(缩放的精灵Hitbox /碰撞矩形)

如何围绕矩形居中放置一个表面(子表面)?(缩放的精灵Hitbox /碰撞矩形)

如果您想要缩放的碰撞矩形/点击框,则需要给精灵一个第二矩形(我hit@R_166_2419@在这里称呼它)。您必须这样做,因为pygame会在的左上角坐标处涂抹图像/表面self.rect。因此,第一个rectself.rect用作blit位置,并且self.hit@R_166_2419@用于碰撞检测。

您还需要为碰撞检测定义一个自定义的回调函数,您必须将其pygame.sprite.spritecollide作为第四个参数传递给该函数

def collided(sprite, other):
    """Check if the `hit@R_166_2419@` rects of the two sprites collide."""
    return sprite.hit@R_166_2419@.colliderect(other.hit@R_166_2419@)

collided_sprites = pg.sprite.spritecollide(player, enemies, False, collided)

这是一个完整的示例(self.rects是绿色矩形,self.hit@R_166_2419@es是红色矩形):

import pygame as pg
from pygame.math import Vector2


class Entity(pg.sprite.Sprite):

    def __init__(self, pos, *groups):
        super().__init__(*groups)
        self.image = pg.Surface((70, 50))
        self.image.fill((0, 80, 180))
        self.rect = self.image.get_rect(center=pos)
        # A inflated copy of the rect as the hit@R_166_2419@.
        self.hit@R_166_2419@ = self.rect.inflate(-42, -22)
        self.vel = Vector2(0, 0)
        self.pos = Vector2(pos)

    def update(self):
        self.pos += self.vel
        self.rect.center = self.pos
        self.hit@R_166_2419@.center = self.pos  # Also update the hit@R_166_2419@ coords.


def collided(sprite, other):
    """Check if the hit@R_166_2419@es of the two sprites collide."""
    return sprite.hit@R_166_2419@.colliderect(other.hit@R_166_2419@)


def main():
    screen = pg.display.set_mode((640, 480))
    clock = pg.time.Clock()
    all_sprites = pg.sprite.Group()
    player = Entity((300, 200), all_sprites)
    enemies = pg.sprite.Group(
        Entity((100, 250), all_sprites),
        Entity((400, 300), all_sprites),
        )

    done = False

    while not done:
        for event in pg.event.get():
            if event.type == pg.QUIT:
                done = True
            elif event.type == pg.MOUSEMOTION:
                player.pos = event.pos

        all_sprites.update()
        # Pass the custom collided callback function to spritecollide.
        collided_sprites = pg.sprite.spritecollide(
            player, enemies, False, collided)
        for sp in collided_sprites:
            print('Collision', sp)

        screen.fill((30, 30, 30))

        all_sprites.draw(screen)
        for sprite in all_sprites:
            # Draw rects and hit@R_166_2419@es.
            pg.draw.rect(screen, (0, 230, 0), sprite.rect, 2)
            pg.draw.rect(screen, (250, 30, 0), sprite.hit@R_166_2419@, 2)

        pg.display.flip()
        clock.tick(30)


if __name__ == '__main__':
    pg.init()
    main()
    pg.quit()
其他 2022/1/1 18:48:59 有410人围观

撰写回答


你尚未登录,登录后可以

和开发者交流问题的细节

关注并接收问题和回答的更新提醒

参与内容的编辑和改进,让解决方法与时俱进

请先登录

推荐问题


联系我
置顶