@@ -27,9 +27,7 @@ from pygame.rect import FRect, Rect
27
27
from pygame .surface import Surface
28
28
from pygame .typing import Point , RectLike
29
29
30
- # define some useful protocols first, which sprite functions accept
31
- # sprite functions don't need all sprite attributes to be present in the
32
- # arguments passed, they only use a few which are marked in the below protocols
30
+ # Some sprite functions only need objects with certain attributes, not always a sprite
33
31
class _HasRect (Protocol ):
34
32
@property
35
33
def rect (self ) -> Optional [Union [FRect , Rect ]]: ...
@@ -41,51 +39,10 @@ class _HasImageAndRect(_HasRect, Protocol):
41
39
42
40
# mask in addition to rect
43
41
class _HasMaskAndRect (_HasRect , Protocol ):
44
- mask : Mask
45
-
46
- # radius in addition to rect
47
- class _HasRadiusAndRect (_HasRect , Protocol ):
48
- radius : float
49
-
50
- # non-generic Group, used in Sprite
51
- _Group = AbstractGroup [Any ]
52
-
53
- # protocol helps with structural subtyping for typevars in sprite group generics
54
- # and allows the use of any class with the required attributes and methods
55
- class _SupportsSprite (_HasImageAndRect , Protocol ):
56
- @property
57
- def image (self ) -> Optional [Surface ]: ...
58
- @image .setter
59
- def image (self , value : Optional [Surface ]) -> None : ...
60
42
@property
61
- def rect (self ) -> Optional [Union [FRect , Rect ]]: ...
62
- @rect .setter
63
- def rect (self , value : Optional [Union [FRect , Rect ]]) -> None : ...
64
- @property
65
- def layer (self ) -> int : ...
66
- @layer .setter
67
- def layer (self , value : int ) -> None : ...
68
- def add_internal (self , group : _Group ) -> None : ...
69
- def remove_internal (self , group : _Group ) -> None : ...
70
- def update (self , * args : Any , ** kwargs : Any ) -> None : ...
71
- def add (self , * groups : _Group ) -> None : ...
72
- def remove (self , * groups : _Group ) -> None : ...
73
- def kill (self ) -> None : ...
74
- def alive (self ) -> bool : ...
75
- def groups (self ) -> list [_Group ]: ...
76
-
77
- # also a protocol
78
- class _SupportsDirtySprite (_SupportsSprite , Protocol ):
79
- dirty : int
80
- blendmode : int
81
- source_rect : Union [FRect , Rect ]
82
- visible : int
83
- _layer : int
84
- def _set_visible (self , val : int ) -> None : ...
85
- def _get_visible (self ) -> int : ...
43
+ def mask (self ) -> Mask : ...
86
44
87
- # concrete sprite implementation class
88
- class Sprite (_SupportsSprite ):
45
+ class Sprite (_HasImageAndRect ):
89
46
@property
90
47
def image (self ) -> Optional [Surface ]: ...
91
48
@image .setter
@@ -98,52 +55,47 @@ class Sprite(_SupportsSprite):
98
55
def layer (self ) -> int : ...
99
56
@layer .setter
100
57
def layer (self , value : int ) -> None : ...
101
- def __init__ (self , * groups : _Group ) -> None : ...
102
- def add_internal (self , group : _Group ) -> None : ...
103
- def remove_internal (self , group : _Group ) -> None : ...
58
+ def __init__ (self , * groups : _GroupOrGroups [ Any ] ) -> None : ...
59
+ def add_internal (self , group : AbstractGroup [ Any ] ) -> None : ...
60
+ def remove_internal (self , group : AbstractGroup [ Any ] ) -> None : ...
104
61
def update (self , * args : Any , ** kwargs : Any ) -> None : ...
105
- def add (self , * groups : _Group ) -> None : ...
106
- def remove (self , * groups : _Group ) -> None : ...
62
+ def add (self , * groups : _GroupOrGroups [ Any ] ) -> None : ...
63
+ def remove (self , * groups : _GroupOrGroups [ Any ] ) -> None : ...
107
64
def kill (self ) -> None : ...
108
65
def alive (self ) -> bool : ...
109
- def groups (self ) -> list [AbstractGroup [_SupportsSprite ]]: ...
66
+ def groups (self ) -> list [AbstractGroup [Sprite ]]: ...
110
67
111
- # concrete dirty sprite implementation class
112
- class DirtySprite (Sprite , _SupportsDirtySprite ):
68
+ class DirtySprite (Sprite ):
113
69
dirty : int
114
70
blendmode : int
115
71
source_rect : Union [FRect , Rect ]
116
72
visible : int
117
73
_layer : int
118
- def _set_visible (self , val : int ) -> None : ...
119
- def _get_visible (self ) -> int : ...
120
74
121
- # typevar bound to Sprite, _SupportsSprite Protocol ensures sprite
122
- # subclass passed to group has image and rect attributes
123
- _TSprite = TypeVar ("_TSprite" , bound = _SupportsSprite )
124
- _TSprite2 = TypeVar ("_TSprite2" , bound = _SupportsSprite )
125
- _TDirtySprite = TypeVar ("_TDirtySprite" , bound = _SupportsDirtySprite )
75
+ _SpriteT = TypeVar ("_SpriteT" , bound = Sprite )
76
+ _SpriteT2 = TypeVar ("_SpriteT2" , bound = Sprite )
77
+ _DirtySpriteT = TypeVar ("_DirtySpriteT" , bound = DirtySprite )
126
78
127
- # typevar for sprite or iterable of sprites, used in Group init, add and remove
128
- _SpriteOrIterable = Union [_TSprite , Iterable [_SpriteOrIterable [ _TSprite ]]]
79
+ _GroupOrGroups = Union [ AbstractGroup [ _SpriteT ], Iterable [ _GroupOrGroups [ _SpriteT ]]]
80
+ _SpriteOrSprites = Union [_SpriteT , Iterable [_SpriteOrSprites [ _SpriteT ]]]
129
81
130
- class AbstractGroup (Generic [_TSprite ]):
131
- spritedict : dict [_TSprite , Optional [Union [FRect , Rect ]]]
82
+ class AbstractGroup (Generic [_SpriteT ]):
83
+ spritedict : dict [_SpriteT , Optional [Union [FRect , Rect ]]]
132
84
lostsprites : list [Union [FRect , Rect ]]
133
85
def __class_getitem__ (cls , item : Any , / ) -> types .GenericAlias : ...
134
86
def __init__ (self ) -> None : ...
135
87
def __len__ (self ) -> int : ...
136
- def __iter__ (self ) -> Iterator [_TSprite ]: ...
88
+ def __iter__ (self ) -> Iterator [_SpriteT ]: ...
137
89
def __bool__ (self ) -> bool : ...
138
90
def __contains__ (self , item : Any ) -> bool : ...
139
- def add_internal (self , sprite : _TSprite , layer : None = None ) -> None : ...
140
- def remove_internal (self , sprite : _TSprite ) -> None : ...
141
- def has_internal (self , sprite : _TSprite ) -> bool : ...
91
+ def add_internal (self , sprite : _SpriteT , layer : Optional [ int ] = None ) -> None : ...
92
+ def remove_internal (self , sprite : _SpriteT ) -> None : ...
93
+ def has_internal (self , sprite : _SpriteT ) -> bool : ...
142
94
def copy (self ) -> Self : ...
143
- def sprites (self ) -> list [_TSprite ]: ...
144
- def add (self , * sprites : _SpriteOrIterable [ _TSprite ]) -> None : ...
145
- def remove (self , * sprites : _SpriteOrIterable [ _TSprite ]) -> None : ...
146
- def has (self , * sprites : _SpriteOrIterable [ _TSprite ]) -> bool : ...
95
+ def sprites (self ) -> list [_SpriteT ]: ...
96
+ def add (self , * sprites : _SpriteOrSprites [ _SpriteT ]) -> None : ...
97
+ def remove (self , * sprites : _SpriteOrSprites [ _SpriteT ]) -> None : ...
98
+ def has (self , * sprites : _SpriteOrSprites [ _SpriteT ]) -> bool : ...
147
99
def update (self , * args : Any , ** kwargs : Any ) -> None : ...
148
100
def draw (
149
101
self , surface : Surface , bgd : Optional [Surface ] = None , special_flags : int = 0
@@ -155,41 +107,39 @@ class AbstractGroup(Generic[_TSprite]):
155
107
) -> None : ...
156
108
def empty (self ) -> None : ...
157
109
158
- class Group (AbstractGroup [_TSprite ]):
159
- def __init__ (self , * sprites : _SpriteOrIterable [ _TSprite ]) -> None : ...
110
+ class Group (AbstractGroup [_SpriteT ]):
111
+ def __init__ (self , * sprites : _SpriteOrSprites [ _SpriteT ]) -> None : ...
160
112
161
- # these are aliased in the code too
113
+ # These deprecated types are just aliases in the code too
162
114
@deprecated ("Use `pygame.sprite.Group` instead" )
163
- class RenderPlain (Group [_TSprite ]): ...
115
+ class RenderPlain (Group [_SpriteT ]): ...
164
116
165
117
@deprecated ("Use `pygame.sprite.Group` instead" )
166
- class RenderClear (Group [_TSprite ]): ...
118
+ class RenderClear (Group [_SpriteT ]): ...
167
119
168
- class RenderUpdates (Group [_TSprite ]): ...
120
+ class RenderUpdates (Group [_SpriteT ]): ...
169
121
170
122
@deprecated ("Use `pygame.sprite.RenderUpdates` instead" )
171
- class OrderedUpdates (RenderUpdates [_TSprite ]): ...
172
-
173
- class LayeredUpdates (AbstractGroup [_TSprite ]):
174
- def __init__ (
175
- self , * sprites : _SpriteOrIterable [_TSprite ], ** kwargs : Any
176
- ) -> None : ...
177
- def add (self , * sprites : _SpriteOrIterable [_TSprite ], ** kwargs : Any ) -> None : ...
178
- def get_sprites_at (self , pos : Point ) -> list [_TSprite ]: ...
179
- def get_sprite (self , idx : int ) -> _TSprite : ...
180
- def remove_sprites_of_layer (self , layer_nr : int ) -> list [_TSprite ]: ...
123
+ class OrderedUpdates (RenderUpdates [_SpriteT ]): ...
124
+
125
+ class LayeredUpdates (AbstractGroup [_SpriteT ]):
126
+ def __init__ (self , * sprites : _SpriteOrSprites [_SpriteT ], ** kwargs : Any ) -> None : ...
127
+ def add (self , * sprites : _SpriteOrSprites [_SpriteT ], ** kwargs : Any ) -> None : ...
128
+ def get_sprites_at (self , pos : Point ) -> list [_SpriteT ]: ...
129
+ def get_sprite (self , idx : int ) -> _SpriteT : ...
130
+ def remove_sprites_of_layer (self , layer_nr : int ) -> list [_SpriteT ]: ...
181
131
def layers (self ) -> list [int ]: ...
182
- def change_layer (self , sprite : _TSprite , new_layer : int ) -> None : ...
183
- def get_layer_of_sprite (self , sprite : _TSprite ) -> int : ...
132
+ def change_layer (self , sprite : _SpriteT , new_layer : int ) -> None : ...
133
+ def get_layer_of_sprite (self , sprite : _SpriteT ) -> int : ...
184
134
def get_top_layer (self ) -> int : ...
185
135
def get_bottom_layer (self ) -> int : ...
186
- def move_to_front (self , sprite : _TSprite ) -> None : ...
187
- def move_to_back (self , sprite : _TSprite ) -> None : ...
188
- def get_top_sprite (self ) -> _TSprite : ...
189
- def get_sprites_from_layer (self , layer : int ) -> list [_TSprite ]: ...
136
+ def move_to_front (self , sprite : _SpriteT ) -> None : ...
137
+ def move_to_back (self , sprite : _SpriteT ) -> None : ...
138
+ def get_top_sprite (self ) -> _SpriteT : ...
139
+ def get_sprites_from_layer (self , layer : int ) -> list [_SpriteT ]: ...
190
140
def switch_layer (self , layer1_nr : int , layer2_nr : int ) -> None : ...
191
141
192
- class LayeredDirty (LayeredUpdates [_TDirtySprite ]):
142
+ class LayeredDirty (LayeredUpdates [_DirtySpriteT ]):
193
143
def draw (
194
144
self ,
195
145
surface : Surface ,
@@ -207,20 +157,19 @@ class LayeredDirty(LayeredUpdates[_TDirtySprite]):
207
157
)
208
158
def set_timing_treshold (self , time_ms : SupportsFloat ) -> None : ...
209
159
210
- class GroupSingle (AbstractGroup [_TSprite ]):
211
- sprite : _TSprite
212
- def __init__ (self , sprite : Optional [_TSprite ] = None ) -> None : ...
160
+ class GroupSingle (AbstractGroup [_SpriteT ]):
161
+ sprite : Optional [ _SpriteT ]
162
+ def __init__ (self , sprite : Optional [_SpriteT ] = None ) -> None : ...
213
163
214
- # argument to collide_rect must have rect attribute
215
164
def collide_rect (left : _HasRect , right : _HasRect ) -> bool : ...
216
165
217
166
class collide_rect_ratio :
218
167
ratio : float
219
168
def __init__ (self , ratio : float ) -> None : ...
220
169
def __call__ (self , left : _HasRect , right : _HasRect ) -> bool : ...
221
170
222
- # must have rect attribute, may optionally have radius attribute
223
- _SupportsCollideCircle = Union [ _HasRect , _HasRadiusAndRect ]
171
+ # Must have rect attribute, may optionally have radius attribute
172
+ _SupportsCollideCircle = _HasRect
224
173
225
174
def collide_circle (
226
175
left : _SupportsCollideCircle , right : _SupportsCollideCircle
@@ -233,32 +182,31 @@ class collide_circle_ratio:
233
182
self , left : _SupportsCollideCircle , right : _SupportsCollideCircle
234
183
) -> bool : ...
235
184
236
- # argument to collide_mask must either have mask or have image attribute, in
185
+ # Arguments to collide_mask must either have mask or have image attribute, in
237
186
# addition to mandatorily having a rect attribute
238
187
_SupportsCollideMask = Union [_HasImageAndRect , _HasMaskAndRect ]
239
188
240
189
def collide_mask (
241
190
left : _SupportsCollideMask , right : _SupportsCollideMask
242
191
) -> Optional [tuple [int , int ]]: ...
243
192
244
- # _HasRect typevar for sprite collide functions
245
- _THasRect = TypeVar ("_THasRect" , bound = _HasRect )
193
+ _HasRectT = TypeVar ("_HasRectT" , bound = _HasRect )
246
194
247
195
def spritecollide (
248
- sprite : _THasRect ,
249
- group : AbstractGroup [_TSprite ],
196
+ sprite : _HasRectT ,
197
+ group : AbstractGroup [_SpriteT ],
250
198
dokill : bool ,
251
- collided : Optional [Callable [[_THasRect , _TSprite ], Any ]] = None ,
252
- ) -> list [_TSprite ]: ...
199
+ collided : Optional [Callable [[_HasRectT , _SpriteT ], bool ]] = None ,
200
+ ) -> list [_SpriteT ]: ...
253
201
def groupcollide (
254
- groupa : AbstractGroup [_TSprite ],
255
- groupb : AbstractGroup [_TSprite2 ],
202
+ groupa : AbstractGroup [_SpriteT ],
203
+ groupb : AbstractGroup [_SpriteT2 ],
256
204
dokilla : bool ,
257
205
dokillb : bool ,
258
- collided : Optional [Callable [[_TSprite , _TSprite2 ], Any ]] = None ,
259
- ) -> dict [_TSprite , list [_TSprite2 ]]: ...
206
+ collided : Optional [Callable [[_SpriteT , _SpriteT2 ], bool ]] = None ,
207
+ ) -> dict [_SpriteT , list [_SpriteT2 ]]: ...
260
208
def spritecollideany (
261
- sprite : _THasRect ,
262
- group : AbstractGroup [_TSprite ],
263
- collided : Optional [Callable [[_THasRect , _TSprite ], Any ]] = None ,
264
- ) -> Optional [_TSprite ]: ...
209
+ sprite : _HasRectT ,
210
+ group : AbstractGroup [_SpriteT ],
211
+ collided : Optional [Callable [[_HasRectT , _SpriteT ], bool ]] = None ,
212
+ ) -> Optional [_SpriteT ]: ...
0 commit comments