Skip to content

pygame.sprite.spritecollide collided argument typing incompatible with collide_mask #2568

Closed
@ZeroWave022

Description

@ZeroWave022

Environment:

You can get some of this info from the text that pops up in the console when you run a pygame program.

  • Operating system (e.g. Windows, Linux(Debian), Linux(Ubuntu), Mac): Windows 10, 22H2
  • Python version (e.g. 3.11.1, 3.8.5): 3.11.3
  • SDL version (e.g. SDL 2.0.12): 2.26.5
  • PyGame version (e.g. 2.0.0.dev10, 1.9.6): 2.3.2
  • Relevant hardware (e.g. if reporting a bug about a controller, tell us the brand & name of it): N/A

Current behavior:

When pygame.sprite.spritecollide, pygame.sprite.spritecollideany or pygame.sprite.groupcollide are called with the collided argument set to pygame.sprite.collide_mask, mypy is raising an argument type error (arg-type).

Expected behavior:

The three methods can be used with collide_mask. This issue does not happen when setting the collided argument to pygame.sprite.collide_circle or pygame.sprite.collide_rect.

Steps to reproduce:

  1. Create a sprite and a sprite group
  2. Use one of the three methods with the collided argument set to pygame.sprite.collide_mask
  3. Run mypy and check output

Test code

import pygame

pygame.init()

class ExampleSprite(pygame.sprite.Sprite):
    def __init__(self) -> None:
        super().__init__()

        self.image = pygame.surface.Surface((100, 100)).convert()
        self.rect = self.image.get_rect()

sprite = ExampleSprite()
sprite_group = pygame.sprite.Group(ExampleSprite())
sprite_group_2 = pygame.sprite.Group(ExampleSprite())

pygame.sprite.spritecollideany(sprite, sprite_group, pygame.sprite.collide_rect) # Ok
pygame.sprite.spritecollideany(sprite, sprite_group, pygame.sprite.collide_circle) # Ok
pygame.sprite.spritecollideany(sprite, sprite_group, pygame.sprite.collide_mask) # Mypy error

pygame.sprite.spritecollide(sprite, sprite_group, False, pygame.sprite.collide_rect) # Ok
pygame.sprite.spritecollide(sprite, sprite_group, False, pygame.sprite.collide_circle) # Ok
pygame.sprite.spritecollide(sprite, sprite_group, False, pygame.sprite.collide_mask) # Mypy error

pygame.sprite.groupcollide(sprite_group, sprite_group_2, False, False, pygame.sprite.collide_rect) # Ok
pygame.sprite.groupcollide(sprite_group, sprite_group_2, False, False, pygame.sprite.collide_circle) # Ok
pygame.sprite.groupcollide(sprite_group, sprite_group_2, False, False, pygame.sprite.collide_mask) # Mypy error

Stack trace/error output/other error logs

example.py:18: error: Argument 3 to "spritecollideany" has incompatible type "Callable[[_HasImageAndRect | _HasMaskAndRect, _HasImageAndRect | _HasMaskAndRect], tuple[int, int] | None]"; expected "Callable[[_HasRect, ExampleSprite], bool] | None"  [arg-type]
example.py:22: error: Argument 4 to "spritecollide" has incompatible type "Callable[[_HasImageAndRect | _HasMaskAndRect, _HasImageAndRect | _HasMaskAndRect], tuple[int, int] | None]"; expected "Callable[[_HasRect, ExampleSprite], bool] | None"  [arg-type]
example.py:26: error: Argument 5 to "groupcollide" has incompatible type "Callable[[_HasImageAndRect | _HasMaskAndRect, _HasImageAndRect | _HasMaskAndRect], tuple[int, int] | None]"; expected "Callable[[ExampleSprite, ExampleSprite], bool] | None"  [arg-type]
Found 3 errors in 1 file (checked 1 source file)

Metadata

Metadata

Assignees

No one assigned

    Labels

    bugNot working as intended

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions