33
33
get_window ,
34
34
gl ,
35
35
)
36
- from arcade .gl import Texture2D
36
+ from arcade .gl import Texture2D , Program
37
37
from arcade .types import Color , RGBA255
38
38
from arcade .gl .types import OpenGlFilter , BlendFunction , PyGLenum
39
39
from arcade .gl .buffer import Buffer
@@ -104,7 +104,7 @@ def __init__(
104
104
lazy : bool = False ,
105
105
visible : bool = True ,
106
106
):
107
- self .program = None
107
+ self .program : Optional [ Program ] = None
108
108
self ._atlas : Optional [TextureAtlas ] = atlas
109
109
self ._initialized = False
110
110
self ._lazy = lazy
@@ -137,22 +137,25 @@ def __init__(
137
137
# Index buffer
138
138
self ._sprite_index_data = array ("i" , [0 ] * self ._idx_capacity )
139
139
140
- self ._sprite_pos_buf = None
141
- self ._sprite_size_buf = None
142
- self ._sprite_angle_buf = None
143
- self ._sprite_color_buf = None
144
- self ._sprite_texture_buf = None
140
+ # Define and annotate storage space for buffers
141
+ self ._sprite_pos_buf : Optional [Buffer ] = None
142
+ self ._sprite_size_buf : Optional [Buffer ] = None
143
+ self ._sprite_angle_buf : Optional [Buffer ] = None
144
+ self ._sprite_color_buf : Optional [Buffer ] = None
145
+ self ._sprite_texture_buf : Optional [Buffer ] = None
146
+
145
147
# Index buffer
146
- self ._sprite_index_buf = None
148
+ self ._sprite_index_buf : Optional [Buffer ] = None
149
+
150
+ self ._geometry : Optional [Geometry ] = None
147
151
148
- self ._geometry = None
149
152
# Flags for signaling if a buffer needs to be written to the opengl buffer
150
- self ._sprite_pos_changed = False
151
- self ._sprite_size_changed = False
152
- self ._sprite_angle_changed = False
153
- self ._sprite_color_changed = False
154
- self ._sprite_texture_changed = False
155
- self ._sprite_index_changed = False
153
+ self ._sprite_pos_changed : bool = False
154
+ self ._sprite_size_changed : bool = False
155
+ self ._sprite_angle_changed : bool = False
156
+ self ._sprite_color_changed : bool = False
157
+ self ._sprite_texture_changed : bool = False
158
+ self ._sprite_index_changed : bool = False
156
159
157
160
# Used in collision detection optimization
158
161
from .spatial_hash import SpatialHash
@@ -179,7 +182,7 @@ def __init__(
179
182
except RuntimeError :
180
183
pass
181
184
182
- def _init_deferred (self ):
185
+ def _init_deferred (self ) -> None :
183
186
"""
184
187
Since spritelist can be created before the window we need to defer initialization.
185
188
It also makes us able to support lazy loading.
@@ -252,7 +255,7 @@ def __iter__(self) -> Iterator[SpriteType]:
252
255
def __getitem__ (self , i ):
253
256
return self .sprite_list [i ]
254
257
255
- def __setitem__ (self , index : int , sprite : SpriteType ):
258
+ def __setitem__ (self , index : int , sprite : SpriteType ) -> None :
256
259
"""Replace a sprite at a specific index"""
257
260
# print(f"{id(self)} : {id(sprite)} __setitem__({index})")
258
261
@@ -525,7 +528,7 @@ def index(self, sprite: SpriteType) -> int:
525
528
"""
526
529
return self .sprite_list .index (sprite )
527
530
528
- def clear (self , deep : bool = True ):
531
+ def clear (self , deep : bool = True ) -> None :
529
532
"""
530
533
Remove all the sprites resetting the spritelist
531
534
to it's initial state.
@@ -588,7 +591,7 @@ def pop(self, index: int = -1) -> SpriteType:
588
591
self .remove (sprite )
589
592
return sprite
590
593
591
- def append (self , sprite : SpriteType ):
594
+ def append (self , sprite : SpriteType ) -> None :
592
595
"""
593
596
Add a new sprite to the list.
594
597
@@ -624,7 +627,7 @@ def append(self, sprite: SpriteType):
624
627
raise ValueError ("Sprite must have a texture when added to a SpriteList" )
625
628
self ._atlas .add (sprite .texture ) # type: ignore
626
629
627
- def swap (self , index_1 : int , index_2 : int ):
630
+ def swap (self , index_1 : int , index_2 : int ) -> None :
628
631
"""
629
632
Swap two sprites by index
630
633
:param index_1: Item index to swap
@@ -644,7 +647,7 @@ def swap(self, index_1: int, index_2: int):
644
647
self ._sprite_index_data [i1 ] = slot_2
645
648
self ._sprite_index_data [i2 ] = slot_1
646
649
647
- def remove (self , sprite : SpriteType ):
650
+ def remove (self , sprite : SpriteType ) -> None :
648
651
"""
649
652
Remove a specific sprite from the list.
650
653
:param sprite: Item to remove from the list
@@ -676,7 +679,7 @@ def remove(self, sprite: SpriteType):
676
679
if self .spatial_hash is not None :
677
680
self .spatial_hash .remove (sprite )
678
681
679
- def extend (self , sprites : Union [Iterable [SpriteType ], " SpriteList" ]) :
682
+ def extend (self , sprites : Union [Iterable [SpriteType ], SpriteList [ SpriteType ]]) -> None :
680
683
"""
681
684
Extends the current list with the given iterable
682
685
@@ -685,7 +688,7 @@ def extend(self, sprites: Union[Iterable[SpriteType], "SpriteList"]):
685
688
for sprite in sprites :
686
689
self .append (sprite )
687
690
688
- def insert (self , index : int , sprite : SpriteType ):
691
+ def insert (self , index : int , sprite : SpriteType ) -> None :
689
692
"""
690
693
Inserts a sprite at a given index.
691
694
@@ -716,7 +719,7 @@ def insert(self, index: int, sprite: SpriteType):
716
719
if self .spatial_hash is not None :
717
720
self .spatial_hash .add (sprite )
718
721
719
- def reverse (self ):
722
+ def reverse (self ) -> None :
720
723
"""
721
724
Reverses the current list in-place
722
725
"""
@@ -732,7 +735,7 @@ def reverse(self):
732
735
733
736
self ._sprite_index_changed = True
734
737
735
- def shuffle (self ):
738
+ def shuffle (self ) -> None :
736
739
"""
737
740
Shuffles the current list in-place
738
741
"""
@@ -759,7 +762,7 @@ def shuffle(self):
759
762
760
763
self ._sprite_index_changed = True
761
764
762
- def sort (self , * , key : Callable , reverse : bool = False ):
765
+ def sort (self , * , key : Callable , reverse : bool = False ) -> None :
763
766
"""
764
767
Sort the spritelist in place using ``<`` comparison between sprites.
765
768
This function is similar to python's :py:meth:`list.sort`.
@@ -799,7 +802,7 @@ def disable_spatial_hashing(self) -> None:
799
802
"""
800
803
self .spatial_hash = None
801
804
802
- def enable_spatial_hashing (self , spatial_hash_cell_size : int = 128 ):
805
+ def enable_spatial_hashing (self , spatial_hash_cell_size : int = 128 ) -> None :
803
806
"""Turn on spatial hashing."""
804
807
if self .spatial_hash is None or self .spatial_hash .cell_size != spatial_hash_cell_size :
805
808
LOG .debug ("Enabled spatial hashing with cell size %s" , spatial_hash_cell_size )
@@ -809,7 +812,7 @@ def enable_spatial_hashing(self, spatial_hash_cell_size: int = 128):
809
812
else :
810
813
LOG .debug ("Spatial hashing is already enabled with size %s" , spatial_hash_cell_size )
811
814
812
- def _recalculate_spatial_hashes (self ):
815
+ def _recalculate_spatial_hashes (self ) -> None :
813
816
if self .spatial_hash is None :
814
817
from .spatial_hash import SpatialHash
815
818
self .spatial_hash = SpatialHash (cell_size = self ._spatial_hash_cell_size )
@@ -825,14 +828,14 @@ def update(self) -> None:
825
828
for sprite in self .sprite_list :
826
829
sprite .update ()
827
830
828
- def on_update (self , delta_time : float = 1 / 60 ):
831
+ def on_update (self , delta_time : float = 1 / 60 ) -> None :
829
832
"""
830
833
Update the sprite. Similar to update, but also takes a delta-time.
831
834
"""
832
835
for sprite in self .sprite_list :
833
836
sprite .on_update (delta_time )
834
837
835
- def update_animation (self , delta_time : float = 1 / 60 ):
838
+ def update_animation (self , delta_time : float = 1 / 60 ) -> None :
836
839
"""
837
840
Call the update_animation in every sprite in the sprite list.
838
841
"""
@@ -870,7 +873,7 @@ def move(self, change_x: float, change_y: float) -> None:
870
873
sprite .center_x += change_x
871
874
sprite .center_y += change_y
872
875
873
- def preload_textures (self , texture_list : List ["Texture" ]) -> None :
876
+ def preload_textures (self , texture_list : Iterable ["Texture" ]) -> None :
874
877
"""
875
878
Preload a set of textures that will be used for sprites in this
876
879
sprite list.
@@ -885,7 +888,6 @@ def preload_textures(self, texture_list: List["Texture"]) -> None:
885
888
self ._atlas .add ( # type: ignore
886
889
texture )
887
890
888
-
889
891
def write_sprite_buffers_to_gpu (self ) -> None :
890
892
"""
891
893
Ensure buffers are resized and fresh sprite data
@@ -903,7 +905,7 @@ def write_sprite_buffers_to_gpu(self) -> None:
903
905
"""
904
906
self ._write_sprite_buffers_to_gpu ()
905
907
906
- def _write_sprite_buffers_to_gpu (self ):
908
+ def _write_sprite_buffers_to_gpu (self ) -> None :
907
909
LOG .debug (
908
910
"[%s] SpriteList._write_sprite_buffers_to_gpu: pos=%s, size=%s, angle=%s, color=%s tex=%s idx=%s" ,
909
911
id (self ),
@@ -1043,7 +1045,7 @@ def draw_hit_boxes(self, color: RGBA255 = (0, 0, 0, 255), line_thickness: float
1043
1045
for sprite in self .sprite_list :
1044
1046
sprite .draw_hit_box (color , line_thickness )
1045
1047
1046
- def _normalize_index_buffer (self ):
1048
+ def _normalize_index_buffer (self ) -> None :
1047
1049
"""
1048
1050
Removes unused slots in the index buffer.
1049
1051
The other buffers don't need this because they re-use slots.
@@ -1062,7 +1064,7 @@ def _normalize_index_buffer(self):
1062
1064
# NOTE: Right now the index buffer is always normalized
1063
1065
pass
1064
1066
1065
- def _grow_sprite_buffers (self ):
1067
+ def _grow_sprite_buffers (self ) -> None :
1066
1068
"""Double the internal buffer sizes"""
1067
1069
# Resize sprite buffers if needed
1068
1070
if self ._sprite_buffer_slots <= self ._buf_capacity :
@@ -1087,19 +1089,20 @@ def _grow_sprite_buffers(self):
1087
1089
self ._sprite_texture_data .extend ([0 ] * extend_by )
1088
1090
1089
1091
if self ._initialized :
1090
- self ._sprite_pos_buf .orphan (double = True )
1091
- self ._sprite_size_buf .orphan (double = True )
1092
- self ._sprite_angle_buf .orphan (double = True )
1093
- self ._sprite_color_buf .orphan (double = True )
1094
- self ._sprite_texture_buf .orphan (double = True )
1092
+ # Proper initialization implies these buffers are allocated
1093
+ self ._sprite_pos_buf .orphan (double = True ) # type: ignore
1094
+ self ._sprite_size_buf .orphan (double = True ) # type: ignore
1095
+ self ._sprite_angle_buf .orphan (double = True ) # type: ignore
1096
+ self ._sprite_color_buf .orphan (double = True ) # type: ignore
1097
+ self ._sprite_texture_buf .orphan (double = True ) # type: ignore
1095
1098
1096
1099
self ._sprite_pos_changed = True
1097
1100
self ._sprite_size_changed = True
1098
1101
self ._sprite_angle_changed = True
1099
1102
self ._sprite_color_changed = True
1100
1103
self ._sprite_texture_changed = True
1101
1104
1102
- def _grow_index_buffer (self ):
1105
+ def _grow_index_buffer (self ) -> None :
1103
1106
# Extend the index buffer capacity if needed
1104
1107
if self ._sprite_index_slots <= self ._idx_capacity :
1105
1108
return
@@ -1127,7 +1130,7 @@ def _grow_index_buffer(self):
1127
1130
1128
1131
self ._sprite_index_changed = True
1129
1132
1130
- def _update_all (self , sprite : SpriteType ):
1133
+ def _update_all (self , sprite : SpriteType ) -> None :
1131
1134
"""
1132
1135
Update all sprite data. This is faster when adding and moving sprites.
1133
1136
This duplicate code, but reduces call overhead, dict lookups etc.
@@ -1168,7 +1171,7 @@ def _update_all(self, sprite: SpriteType):
1168
1171
self ._sprite_texture_data [slot ] = tex_slot
1169
1172
self ._sprite_texture_changed = True
1170
1173
1171
- def _update_texture (self , sprite ) -> None :
1174
+ def _update_texture (self , sprite : SpriteType ) -> None :
1172
1175
"""Make sure we update the texture for this sprite for the next batch
1173
1176
drawing"""
1174
1177
# We cannot interact with texture atlases unless the context
@@ -1274,7 +1277,7 @@ def _update_size(self, sprite: SpriteType) -> None:
1274
1277
self ._sprite_size_data [slot * 2 + 1 ] = sprite ._height
1275
1278
self ._sprite_size_changed = True
1276
1279
1277
- def _update_width (self , sprite : SpriteType ):
1280
+ def _update_width (self , sprite : SpriteType ) -> None :
1278
1281
"""
1279
1282
Called by the Sprite class to update the size/scale in this sprite.
1280
1283
Necessary for batch drawing of items.
@@ -1285,7 +1288,7 @@ def _update_width(self, sprite: SpriteType):
1285
1288
self ._sprite_size_data [slot * 2 ] = sprite ._width
1286
1289
self ._sprite_size_changed = True
1287
1290
1288
- def _update_height (self , sprite : SpriteType ):
1291
+ def _update_height (self , sprite : SpriteType ) -> None :
1289
1292
"""
1290
1293
Called by the Sprite class to update the size/scale in this sprite.
1291
1294
Necessary for batch drawing of items.
@@ -1296,7 +1299,7 @@ def _update_height(self, sprite: SpriteType):
1296
1299
self ._sprite_size_data [slot * 2 + 1 ] = sprite ._height
1297
1300
self ._sprite_size_changed = True
1298
1301
1299
- def _update_angle (self , sprite : SpriteType ):
1302
+ def _update_angle (self , sprite : SpriteType ) -> None :
1300
1303
"""
1301
1304
Called by the Sprite class to update the angle in this sprite.
1302
1305
Necessary for batch drawing of items.
0 commit comments