mima-engine 0.3.2__tar.gz → 0.3.4__tar.gz

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (317) hide show
  1. {mima_engine-0.3.2 → mima_engine-0.3.4}/PKG-INFO +2 -2
  2. {mima_engine-0.3.2 → mima_engine-0.3.4}/pyproject.toml +1 -1
  3. {mima_engine-0.3.2 → mima_engine-0.3.4}/src/mima/__init__.py +1 -1
  4. {mima_engine-0.3.2 → mima_engine-0.3.4}/src/mima/advanced/assets.py +2 -1
  5. {mima_engine-0.3.2 → mima_engine-0.3.4}/src/mima/advanced/scene.py +7 -2
  6. {mima_engine-0.3.2 → mima_engine-0.3.4}/src/mima/advanced/shape.py +3 -0
  7. {mima_engine-0.3.2 → mima_engine-0.3.4}/src/mima/advanced/shaped_sprite.py +1 -2
  8. {mima_engine-0.3.2 → mima_engine-0.3.4}/src/mima/standalone/camera.py +1 -1
  9. {mima_engine-0.3.2 → mima_engine-0.3.4}/src/mima/standalone/geometry.py +1 -1
  10. {mima_engine-0.3.2 → mima_engine-0.3.4}/src/mima/standalone/pixel_font.py +1 -2
  11. {mima_engine-0.3.2 → mima_engine-0.3.4}/src/mima/standalone/spatial.py +77 -56
  12. {mima_engine-0.3.2 → mima_engine-0.3.4}/src/mima/standalone/sprite.py +1 -3
  13. {mima_engine-0.3.2 → mima_engine-0.3.4}/src/mima/standalone/tiled_map.py +3 -2
  14. {mima_engine-0.3.2 → mima_engine-0.3.4}/src/mima/standalone/transformed_view.py +4 -3
  15. {mima_engine-0.3.2 → mima_engine-0.3.4}/src/mima/standalone/user_input.py +1 -1
  16. {mima_engine-0.3.2 → mima_engine-0.3.4}/tests/system/test_window_manager.py +79 -6
  17. mima_engine-0.3.4/tests/unit/test_spatial_grid.py +211 -0
  18. {mima_engine-0.3.2 → mima_engine-0.3.4}/.gitignore +0 -0
  19. {mima_engine-0.3.2 → mima_engine-0.3.4}/CHANGELOG +0 -0
  20. {mima_engine-0.3.2 → mima_engine-0.3.4}/README.md +0 -0
  21. {mima_engine-0.3.2 → mima_engine-0.3.4}/examples/data/gfx/tilemap.png +0 -0
  22. {mima_engine-0.3.2 → mima_engine-0.3.4}/examples/data/gfx/tilemap_packed.png +0 -0
  23. {mima_engine-0.3.2 → mima_engine-0.3.4}/examples/data/propertytypes.json +0 -0
  24. {mima_engine-0.3.2 → mima_engine-0.3.4}/examples/data/sampleMap.tmx +0 -0
  25. {mima_engine-0.3.2 → mima_engine-0.3.4}/examples/data/sampleSheet.tsx +0 -0
  26. {mima_engine-0.3.2 → mima_engine-0.3.4}/examples/data/tilesets/sampleSheet.tsx +0 -0
  27. {mima_engine-0.3.2 → mima_engine-0.3.4}/examples/kenney_tiny-dungeon/License.txt +0 -0
  28. {mima_engine-0.3.2 → mima_engine-0.3.4}/examples/kenney_tiny-dungeon/Preview.png +0 -0
  29. {mima_engine-0.3.2 → mima_engine-0.3.4}/examples/kenney_tiny-dungeon/Sample.png +0 -0
  30. {mima_engine-0.3.2 → mima_engine-0.3.4}/examples/kenney_tiny-dungeon/Tiled/sampleMap.tmx +0 -0
  31. {mima_engine-0.3.2 → mima_engine-0.3.4}/examples/kenney_tiny-dungeon/Tiled/sampleSheet.tsx +0 -0
  32. {mima_engine-0.3.2 → mima_engine-0.3.4}/examples/kenney_tiny-dungeon/Tilemap/tilemap.png +0 -0
  33. {mima_engine-0.3.2 → mima_engine-0.3.4}/examples/kenney_tiny-dungeon/Tilemap/tilemap_packed.png +0 -0
  34. {mima_engine-0.3.2 → mima_engine-0.3.4}/examples/kenney_tiny-dungeon/Tiles/tile_0000.png +0 -0
  35. {mima_engine-0.3.2 → mima_engine-0.3.4}/examples/kenney_tiny-dungeon/Tiles/tile_0001.png +0 -0
  36. {mima_engine-0.3.2 → mima_engine-0.3.4}/examples/kenney_tiny-dungeon/Tiles/tile_0002.png +0 -0
  37. {mima_engine-0.3.2 → mima_engine-0.3.4}/examples/kenney_tiny-dungeon/Tiles/tile_0003.png +0 -0
  38. {mima_engine-0.3.2 → mima_engine-0.3.4}/examples/kenney_tiny-dungeon/Tiles/tile_0004.png +0 -0
  39. {mima_engine-0.3.2 → mima_engine-0.3.4}/examples/kenney_tiny-dungeon/Tiles/tile_0005.png +0 -0
  40. {mima_engine-0.3.2 → mima_engine-0.3.4}/examples/kenney_tiny-dungeon/Tiles/tile_0006.png +0 -0
  41. {mima_engine-0.3.2 → mima_engine-0.3.4}/examples/kenney_tiny-dungeon/Tiles/tile_0007.png +0 -0
  42. {mima_engine-0.3.2 → mima_engine-0.3.4}/examples/kenney_tiny-dungeon/Tiles/tile_0008.png +0 -0
  43. {mima_engine-0.3.2 → mima_engine-0.3.4}/examples/kenney_tiny-dungeon/Tiles/tile_0009.png +0 -0
  44. {mima_engine-0.3.2 → mima_engine-0.3.4}/examples/kenney_tiny-dungeon/Tiles/tile_0010.png +0 -0
  45. {mima_engine-0.3.2 → mima_engine-0.3.4}/examples/kenney_tiny-dungeon/Tiles/tile_0011.png +0 -0
  46. {mima_engine-0.3.2 → mima_engine-0.3.4}/examples/kenney_tiny-dungeon/Tiles/tile_0012.png +0 -0
  47. {mima_engine-0.3.2 → mima_engine-0.3.4}/examples/kenney_tiny-dungeon/Tiles/tile_0013.png +0 -0
  48. {mima_engine-0.3.2 → mima_engine-0.3.4}/examples/kenney_tiny-dungeon/Tiles/tile_0014.png +0 -0
  49. {mima_engine-0.3.2 → mima_engine-0.3.4}/examples/kenney_tiny-dungeon/Tiles/tile_0015.png +0 -0
  50. {mima_engine-0.3.2 → mima_engine-0.3.4}/examples/kenney_tiny-dungeon/Tiles/tile_0016.png +0 -0
  51. {mima_engine-0.3.2 → mima_engine-0.3.4}/examples/kenney_tiny-dungeon/Tiles/tile_0017.png +0 -0
  52. {mima_engine-0.3.2 → mima_engine-0.3.4}/examples/kenney_tiny-dungeon/Tiles/tile_0018.png +0 -0
  53. {mima_engine-0.3.2 → mima_engine-0.3.4}/examples/kenney_tiny-dungeon/Tiles/tile_0019.png +0 -0
  54. {mima_engine-0.3.2 → mima_engine-0.3.4}/examples/kenney_tiny-dungeon/Tiles/tile_0020.png +0 -0
  55. {mima_engine-0.3.2 → mima_engine-0.3.4}/examples/kenney_tiny-dungeon/Tiles/tile_0021.png +0 -0
  56. {mima_engine-0.3.2 → mima_engine-0.3.4}/examples/kenney_tiny-dungeon/Tiles/tile_0022.png +0 -0
  57. {mima_engine-0.3.2 → mima_engine-0.3.4}/examples/kenney_tiny-dungeon/Tiles/tile_0023.png +0 -0
  58. {mima_engine-0.3.2 → mima_engine-0.3.4}/examples/kenney_tiny-dungeon/Tiles/tile_0024.png +0 -0
  59. {mima_engine-0.3.2 → mima_engine-0.3.4}/examples/kenney_tiny-dungeon/Tiles/tile_0025.png +0 -0
  60. {mima_engine-0.3.2 → mima_engine-0.3.4}/examples/kenney_tiny-dungeon/Tiles/tile_0026.png +0 -0
  61. {mima_engine-0.3.2 → mima_engine-0.3.4}/examples/kenney_tiny-dungeon/Tiles/tile_0027.png +0 -0
  62. {mima_engine-0.3.2 → mima_engine-0.3.4}/examples/kenney_tiny-dungeon/Tiles/tile_0028.png +0 -0
  63. {mima_engine-0.3.2 → mima_engine-0.3.4}/examples/kenney_tiny-dungeon/Tiles/tile_0029.png +0 -0
  64. {mima_engine-0.3.2 → mima_engine-0.3.4}/examples/kenney_tiny-dungeon/Tiles/tile_0030.png +0 -0
  65. {mima_engine-0.3.2 → mima_engine-0.3.4}/examples/kenney_tiny-dungeon/Tiles/tile_0031.png +0 -0
  66. {mima_engine-0.3.2 → mima_engine-0.3.4}/examples/kenney_tiny-dungeon/Tiles/tile_0032.png +0 -0
  67. {mima_engine-0.3.2 → mima_engine-0.3.4}/examples/kenney_tiny-dungeon/Tiles/tile_0033.png +0 -0
  68. {mima_engine-0.3.2 → mima_engine-0.3.4}/examples/kenney_tiny-dungeon/Tiles/tile_0034.png +0 -0
  69. {mima_engine-0.3.2 → mima_engine-0.3.4}/examples/kenney_tiny-dungeon/Tiles/tile_0035.png +0 -0
  70. {mima_engine-0.3.2 → mima_engine-0.3.4}/examples/kenney_tiny-dungeon/Tiles/tile_0036.png +0 -0
  71. {mima_engine-0.3.2 → mima_engine-0.3.4}/examples/kenney_tiny-dungeon/Tiles/tile_0037.png +0 -0
  72. {mima_engine-0.3.2 → mima_engine-0.3.4}/examples/kenney_tiny-dungeon/Tiles/tile_0038.png +0 -0
  73. {mima_engine-0.3.2 → mima_engine-0.3.4}/examples/kenney_tiny-dungeon/Tiles/tile_0039.png +0 -0
  74. {mima_engine-0.3.2 → mima_engine-0.3.4}/examples/kenney_tiny-dungeon/Tiles/tile_0040.png +0 -0
  75. {mima_engine-0.3.2 → mima_engine-0.3.4}/examples/kenney_tiny-dungeon/Tiles/tile_0041.png +0 -0
  76. {mima_engine-0.3.2 → mima_engine-0.3.4}/examples/kenney_tiny-dungeon/Tiles/tile_0042.png +0 -0
  77. {mima_engine-0.3.2 → mima_engine-0.3.4}/examples/kenney_tiny-dungeon/Tiles/tile_0043.png +0 -0
  78. {mima_engine-0.3.2 → mima_engine-0.3.4}/examples/kenney_tiny-dungeon/Tiles/tile_0044.png +0 -0
  79. {mima_engine-0.3.2 → mima_engine-0.3.4}/examples/kenney_tiny-dungeon/Tiles/tile_0045.png +0 -0
  80. {mima_engine-0.3.2 → mima_engine-0.3.4}/examples/kenney_tiny-dungeon/Tiles/tile_0046.png +0 -0
  81. {mima_engine-0.3.2 → mima_engine-0.3.4}/examples/kenney_tiny-dungeon/Tiles/tile_0047.png +0 -0
  82. {mima_engine-0.3.2 → mima_engine-0.3.4}/examples/kenney_tiny-dungeon/Tiles/tile_0048.png +0 -0
  83. {mima_engine-0.3.2 → mima_engine-0.3.4}/examples/kenney_tiny-dungeon/Tiles/tile_0049.png +0 -0
  84. {mima_engine-0.3.2 → mima_engine-0.3.4}/examples/kenney_tiny-dungeon/Tiles/tile_0050.png +0 -0
  85. {mima_engine-0.3.2 → mima_engine-0.3.4}/examples/kenney_tiny-dungeon/Tiles/tile_0051.png +0 -0
  86. {mima_engine-0.3.2 → mima_engine-0.3.4}/examples/kenney_tiny-dungeon/Tiles/tile_0052.png +0 -0
  87. {mima_engine-0.3.2 → mima_engine-0.3.4}/examples/kenney_tiny-dungeon/Tiles/tile_0053.png +0 -0
  88. {mima_engine-0.3.2 → mima_engine-0.3.4}/examples/kenney_tiny-dungeon/Tiles/tile_0054.png +0 -0
  89. {mima_engine-0.3.2 → mima_engine-0.3.4}/examples/kenney_tiny-dungeon/Tiles/tile_0055.png +0 -0
  90. {mima_engine-0.3.2 → mima_engine-0.3.4}/examples/kenney_tiny-dungeon/Tiles/tile_0056.png +0 -0
  91. {mima_engine-0.3.2 → mima_engine-0.3.4}/examples/kenney_tiny-dungeon/Tiles/tile_0057.png +0 -0
  92. {mima_engine-0.3.2 → mima_engine-0.3.4}/examples/kenney_tiny-dungeon/Tiles/tile_0058.png +0 -0
  93. {mima_engine-0.3.2 → mima_engine-0.3.4}/examples/kenney_tiny-dungeon/Tiles/tile_0059.png +0 -0
  94. {mima_engine-0.3.2 → mima_engine-0.3.4}/examples/kenney_tiny-dungeon/Tiles/tile_0060.png +0 -0
  95. {mima_engine-0.3.2 → mima_engine-0.3.4}/examples/kenney_tiny-dungeon/Tiles/tile_0061.png +0 -0
  96. {mima_engine-0.3.2 → mima_engine-0.3.4}/examples/kenney_tiny-dungeon/Tiles/tile_0062.png +0 -0
  97. {mima_engine-0.3.2 → mima_engine-0.3.4}/examples/kenney_tiny-dungeon/Tiles/tile_0063.png +0 -0
  98. {mima_engine-0.3.2 → mima_engine-0.3.4}/examples/kenney_tiny-dungeon/Tiles/tile_0064.png +0 -0
  99. {mima_engine-0.3.2 → mima_engine-0.3.4}/examples/kenney_tiny-dungeon/Tiles/tile_0065.png +0 -0
  100. {mima_engine-0.3.2 → mima_engine-0.3.4}/examples/kenney_tiny-dungeon/Tiles/tile_0066.png +0 -0
  101. {mima_engine-0.3.2 → mima_engine-0.3.4}/examples/kenney_tiny-dungeon/Tiles/tile_0067.png +0 -0
  102. {mima_engine-0.3.2 → mima_engine-0.3.4}/examples/kenney_tiny-dungeon/Tiles/tile_0068.png +0 -0
  103. {mima_engine-0.3.2 → mima_engine-0.3.4}/examples/kenney_tiny-dungeon/Tiles/tile_0069.png +0 -0
  104. {mima_engine-0.3.2 → mima_engine-0.3.4}/examples/kenney_tiny-dungeon/Tiles/tile_0070.png +0 -0
  105. {mima_engine-0.3.2 → mima_engine-0.3.4}/examples/kenney_tiny-dungeon/Tiles/tile_0071.png +0 -0
  106. {mima_engine-0.3.2 → mima_engine-0.3.4}/examples/kenney_tiny-dungeon/Tiles/tile_0072.png +0 -0
  107. {mima_engine-0.3.2 → mima_engine-0.3.4}/examples/kenney_tiny-dungeon/Tiles/tile_0073.png +0 -0
  108. {mima_engine-0.3.2 → mima_engine-0.3.4}/examples/kenney_tiny-dungeon/Tiles/tile_0074.png +0 -0
  109. {mima_engine-0.3.2 → mima_engine-0.3.4}/examples/kenney_tiny-dungeon/Tiles/tile_0075.png +0 -0
  110. {mima_engine-0.3.2 → mima_engine-0.3.4}/examples/kenney_tiny-dungeon/Tiles/tile_0076.png +0 -0
  111. {mima_engine-0.3.2 → mima_engine-0.3.4}/examples/kenney_tiny-dungeon/Tiles/tile_0077.png +0 -0
  112. {mima_engine-0.3.2 → mima_engine-0.3.4}/examples/kenney_tiny-dungeon/Tiles/tile_0078.png +0 -0
  113. {mima_engine-0.3.2 → mima_engine-0.3.4}/examples/kenney_tiny-dungeon/Tiles/tile_0079.png +0 -0
  114. {mima_engine-0.3.2 → mima_engine-0.3.4}/examples/kenney_tiny-dungeon/Tiles/tile_0080.png +0 -0
  115. {mima_engine-0.3.2 → mima_engine-0.3.4}/examples/kenney_tiny-dungeon/Tiles/tile_0081.png +0 -0
  116. {mima_engine-0.3.2 → mima_engine-0.3.4}/examples/kenney_tiny-dungeon/Tiles/tile_0082.png +0 -0
  117. {mima_engine-0.3.2 → mima_engine-0.3.4}/examples/kenney_tiny-dungeon/Tiles/tile_0083.png +0 -0
  118. {mima_engine-0.3.2 → mima_engine-0.3.4}/examples/kenney_tiny-dungeon/Tiles/tile_0084.png +0 -0
  119. {mima_engine-0.3.2 → mima_engine-0.3.4}/examples/kenney_tiny-dungeon/Tiles/tile_0085.png +0 -0
  120. {mima_engine-0.3.2 → mima_engine-0.3.4}/examples/kenney_tiny-dungeon/Tiles/tile_0086.png +0 -0
  121. {mima_engine-0.3.2 → mima_engine-0.3.4}/examples/kenney_tiny-dungeon/Tiles/tile_0087.png +0 -0
  122. {mima_engine-0.3.2 → mima_engine-0.3.4}/examples/kenney_tiny-dungeon/Tiles/tile_0088.png +0 -0
  123. {mima_engine-0.3.2 → mima_engine-0.3.4}/examples/kenney_tiny-dungeon/Tiles/tile_0089.png +0 -0
  124. {mima_engine-0.3.2 → mima_engine-0.3.4}/examples/kenney_tiny-dungeon/Tiles/tile_0090.png +0 -0
  125. {mima_engine-0.3.2 → mima_engine-0.3.4}/examples/kenney_tiny-dungeon/Tiles/tile_0091.png +0 -0
  126. {mima_engine-0.3.2 → mima_engine-0.3.4}/examples/kenney_tiny-dungeon/Tiles/tile_0092.png +0 -0
  127. {mima_engine-0.3.2 → mima_engine-0.3.4}/examples/kenney_tiny-dungeon/Tiles/tile_0093.png +0 -0
  128. {mima_engine-0.3.2 → mima_engine-0.3.4}/examples/kenney_tiny-dungeon/Tiles/tile_0094.png +0 -0
  129. {mima_engine-0.3.2 → mima_engine-0.3.4}/examples/kenney_tiny-dungeon/Tiles/tile_0095.png +0 -0
  130. {mima_engine-0.3.2 → mima_engine-0.3.4}/examples/kenney_tiny-dungeon/Tiles/tile_0096.png +0 -0
  131. {mima_engine-0.3.2 → mima_engine-0.3.4}/examples/kenney_tiny-dungeon/Tiles/tile_0097.png +0 -0
  132. {mima_engine-0.3.2 → mima_engine-0.3.4}/examples/kenney_tiny-dungeon/Tiles/tile_0098.png +0 -0
  133. {mima_engine-0.3.2 → mima_engine-0.3.4}/examples/kenney_tiny-dungeon/Tiles/tile_0099.png +0 -0
  134. {mima_engine-0.3.2 → mima_engine-0.3.4}/examples/kenney_tiny-dungeon/Tiles/tile_0100.png +0 -0
  135. {mima_engine-0.3.2 → mima_engine-0.3.4}/examples/kenney_tiny-dungeon/Tiles/tile_0101.png +0 -0
  136. {mima_engine-0.3.2 → mima_engine-0.3.4}/examples/kenney_tiny-dungeon/Tiles/tile_0102.png +0 -0
  137. {mima_engine-0.3.2 → mima_engine-0.3.4}/examples/kenney_tiny-dungeon/Tiles/tile_0103.png +0 -0
  138. {mima_engine-0.3.2 → mima_engine-0.3.4}/examples/kenney_tiny-dungeon/Tiles/tile_0104.png +0 -0
  139. {mima_engine-0.3.2 → mima_engine-0.3.4}/examples/kenney_tiny-dungeon/Tiles/tile_0105.png +0 -0
  140. {mima_engine-0.3.2 → mima_engine-0.3.4}/examples/kenney_tiny-dungeon/Tiles/tile_0106.png +0 -0
  141. {mima_engine-0.3.2 → mima_engine-0.3.4}/examples/kenney_tiny-dungeon/Tiles/tile_0107.png +0 -0
  142. {mima_engine-0.3.2 → mima_engine-0.3.4}/examples/kenney_tiny-dungeon/Tiles/tile_0108.png +0 -0
  143. {mima_engine-0.3.2 → mima_engine-0.3.4}/examples/kenney_tiny-dungeon/Tiles/tile_0109.png +0 -0
  144. {mima_engine-0.3.2 → mima_engine-0.3.4}/examples/kenney_tiny-dungeon/Tiles/tile_0110.png +0 -0
  145. {mima_engine-0.3.2 → mima_engine-0.3.4}/examples/kenney_tiny-dungeon/Tiles/tile_0111.png +0 -0
  146. {mima_engine-0.3.2 → mima_engine-0.3.4}/examples/kenney_tiny-dungeon/Tiles/tile_0112.png +0 -0
  147. {mima_engine-0.3.2 → mima_engine-0.3.4}/examples/kenney_tiny-dungeon/Tiles/tile_0113.png +0 -0
  148. {mima_engine-0.3.2 → mima_engine-0.3.4}/examples/kenney_tiny-dungeon/Tiles/tile_0114.png +0 -0
  149. {mima_engine-0.3.2 → mima_engine-0.3.4}/examples/kenney_tiny-dungeon/Tiles/tile_0115.png +0 -0
  150. {mima_engine-0.3.2 → mima_engine-0.3.4}/examples/kenney_tiny-dungeon/Tiles/tile_0116.png +0 -0
  151. {mima_engine-0.3.2 → mima_engine-0.3.4}/examples/kenney_tiny-dungeon/Tiles/tile_0117.png +0 -0
  152. {mima_engine-0.3.2 → mima_engine-0.3.4}/examples/kenney_tiny-dungeon/Tiles/tile_0118.png +0 -0
  153. {mima_engine-0.3.2 → mima_engine-0.3.4}/examples/kenney_tiny-dungeon/Tiles/tile_0119.png +0 -0
  154. {mima_engine-0.3.2 → mima_engine-0.3.4}/examples/kenney_tiny-dungeon/Tiles/tile_0120.png +0 -0
  155. {mima_engine-0.3.2 → mima_engine-0.3.4}/examples/kenney_tiny-dungeon/Tiles/tile_0121.png +0 -0
  156. {mima_engine-0.3.2 → mima_engine-0.3.4}/examples/kenney_tiny-dungeon/Tiles/tile_0122.png +0 -0
  157. {mima_engine-0.3.2 → mima_engine-0.3.4}/examples/kenney_tiny-dungeon/Tiles/tile_0123.png +0 -0
  158. {mima_engine-0.3.2 → mima_engine-0.3.4}/examples/kenney_tiny-dungeon/Tiles/tile_0124.png +0 -0
  159. {mima_engine-0.3.2 → mima_engine-0.3.4}/examples/kenney_tiny-dungeon/Tiles/tile_0125.png +0 -0
  160. {mima_engine-0.3.2 → mima_engine-0.3.4}/examples/kenney_tiny-dungeon/Tiles/tile_0126.png +0 -0
  161. {mima_engine-0.3.2 → mima_engine-0.3.4}/examples/kenney_tiny-dungeon/Tiles/tile_0127.png +0 -0
  162. {mima_engine-0.3.2 → mima_engine-0.3.4}/examples/kenney_tiny-dungeon/Tiles/tile_0128.png +0 -0
  163. {mima_engine-0.3.2 → mima_engine-0.3.4}/examples/kenney_tiny-dungeon/Tiles/tile_0129.png +0 -0
  164. {mima_engine-0.3.2 → mima_engine-0.3.4}/examples/kenney_tiny-dungeon/Tiles/tile_0130.png +0 -0
  165. {mima_engine-0.3.2 → mima_engine-0.3.4}/examples/kenney_tiny-dungeon/Tiles/tile_0131.png +0 -0
  166. {mima_engine-0.3.2 → mima_engine-0.3.4}/examples/kenney_tiny-dungeon/Tilesheet.txt +0 -0
  167. {mima_engine-0.3.2 → mima_engine-0.3.4}/examples/kenney_tiny-dungeon/Visit Kenney.url +0 -0
  168. {mima_engine-0.3.2 → mima_engine-0.3.4}/examples/kenney_tiny-dungeon/Visit Patreon.url +0 -0
  169. {mima_engine-0.3.2 → mima_engine-0.3.4}/examples/kenney_tiny-dungeon.zip +0 -0
  170. {mima_engine-0.3.2 → mima_engine-0.3.4}/mima_config.ini +0 -0
  171. {mima_engine-0.3.2 → mima_engine-0.3.4}/mima_log.json +0 -0
  172. {mima_engine-0.3.2 → mima_engine-0.3.4}/src/mima/advanced/__init__.py +0 -0
  173. {mima_engine-0.3.2 → mima_engine-0.3.4}/src/mima/backend/__init__.py +0 -0
  174. {mima_engine-0.3.2 → mima_engine-0.3.4}/src/mima/backend/pygame_assets.py +0 -0
  175. {mima_engine-0.3.2 → mima_engine-0.3.4}/src/mima/backend/pygame_audio.py +0 -0
  176. {mima_engine-0.3.2 → mima_engine-0.3.4}/src/mima/backend/pygame_backend.py +0 -0
  177. {mima_engine-0.3.2 → mima_engine-0.3.4}/src/mima/backend/pygame_camera.py +0 -0
  178. {mima_engine-0.3.2 → mima_engine-0.3.4}/src/mima/backend/pygame_events.py +0 -0
  179. {mima_engine-0.3.2 → mima_engine-0.3.4}/src/mima/backend/touch_control_scheme_a.py +0 -0
  180. {mima_engine-0.3.2 → mima_engine-0.3.4}/src/mima/backend/touch_control_scheme_b.py +0 -0
  181. {mima_engine-0.3.2 → mima_engine-0.3.4}/src/mima/core/__init__.py +0 -0
  182. {mima_engine-0.3.2 → mima_engine-0.3.4}/src/mima/core/collision.py +0 -0
  183. {mima_engine-0.3.2 → mima_engine-0.3.4}/src/mima/core/database.py +0 -0
  184. {mima_engine-0.3.2 → mima_engine-0.3.4}/src/mima/core/engine.py +0 -0
  185. {mima_engine-0.3.2 → mima_engine-0.3.4}/src/mima/core/mode_engine.py +0 -0
  186. {mima_engine-0.3.2 → mima_engine-0.3.4}/src/mima/core/scene_engine.py +0 -0
  187. {mima_engine-0.3.2 → mima_engine-0.3.4}/src/mima/maps/__init__.py +0 -0
  188. {mima_engine-0.3.2 → mima_engine-0.3.4}/src/mima/maps/template.py +0 -0
  189. {mima_engine-0.3.2 → mima_engine-0.3.4}/src/mima/maps/tile.py +0 -0
  190. {mima_engine-0.3.2 → mima_engine-0.3.4}/src/mima/maps/tile_animation.py +0 -0
  191. {mima_engine-0.3.2 → mima_engine-0.3.4}/src/mima/maps/tile_info.py +0 -0
  192. {mima_engine-0.3.2 → mima_engine-0.3.4}/src/mima/maps/tile_layer.py +0 -0
  193. {mima_engine-0.3.2 → mima_engine-0.3.4}/src/mima/maps/tiled/__init__.py +0 -0
  194. {mima_engine-0.3.2 → mima_engine-0.3.4}/src/mima/maps/tiled/tiled_layer.py +0 -0
  195. {mima_engine-0.3.2 → mima_engine-0.3.4}/src/mima/maps/tiled/tiled_map.py +0 -0
  196. {mima_engine-0.3.2 → mima_engine-0.3.4}/src/mima/maps/tiled/tiled_object.py +0 -0
  197. {mima_engine-0.3.2 → mima_engine-0.3.4}/src/mima/maps/tiled/tiled_objectgroup.py +0 -0
  198. {mima_engine-0.3.2 → mima_engine-0.3.4}/src/mima/maps/tiled/tiled_template.py +0 -0
  199. {mima_engine-0.3.2 → mima_engine-0.3.4}/src/mima/maps/tiled/tiled_tile.py +0 -0
  200. {mima_engine-0.3.2 → mima_engine-0.3.4}/src/mima/maps/tiled/tiled_tileset.py +0 -0
  201. {mima_engine-0.3.2 → mima_engine-0.3.4}/src/mima/maps/tilemap.py +0 -0
  202. {mima_engine-0.3.2 → mima_engine-0.3.4}/src/mima/maps/tileset.py +0 -0
  203. {mima_engine-0.3.2 → mima_engine-0.3.4}/src/mima/maps/tileset_info.py +0 -0
  204. {mima_engine-0.3.2 → mima_engine-0.3.4}/src/mima/maps/transition_map.py +0 -0
  205. {mima_engine-0.3.2 → mima_engine-0.3.4}/src/mima/objects/__init__.py +0 -0
  206. {mima_engine-0.3.2 → mima_engine-0.3.4}/src/mima/objects/animated_sprite.py +0 -0
  207. {mima_engine-0.3.2 → mima_engine-0.3.4}/src/mima/objects/attribute_effect.py +0 -0
  208. {mima_engine-0.3.2 → mima_engine-0.3.4}/src/mima/objects/attributes.py +0 -0
  209. {mima_engine-0.3.2 → mima_engine-0.3.4}/src/mima/objects/creature.py +0 -0
  210. {mima_engine-0.3.2 → mima_engine-0.3.4}/src/mima/objects/dynamic.py +0 -0
  211. {mima_engine-0.3.2 → mima_engine-0.3.4}/src/mima/objects/effects/__init__.py +0 -0
  212. {mima_engine-0.3.2 → mima_engine-0.3.4}/src/mima/objects/effects/colorize_screen.py +0 -0
  213. {mima_engine-0.3.2 → mima_engine-0.3.4}/src/mima/objects/effects/debug_box.py +0 -0
  214. {mima_engine-0.3.2 → mima_engine-0.3.4}/src/mima/objects/effects/light.py +0 -0
  215. {mima_engine-0.3.2 → mima_engine-0.3.4}/src/mima/objects/effects/show_sprite.py +0 -0
  216. {mima_engine-0.3.2 → mima_engine-0.3.4}/src/mima/objects/effects/walking_on_grass.py +0 -0
  217. {mima_engine-0.3.2 → mima_engine-0.3.4}/src/mima/objects/effects/walking_on_water.py +0 -0
  218. {mima_engine-0.3.2 → mima_engine-0.3.4}/src/mima/objects/loader.py +0 -0
  219. {mima_engine-0.3.2 → mima_engine-0.3.4}/src/mima/objects/projectile.py +0 -0
  220. {mima_engine-0.3.2 → mima_engine-0.3.4}/src/mima/objects/sprite.py +0 -0
  221. {mima_engine-0.3.2 → mima_engine-0.3.4}/src/mima/objects/world/__init__.py +0 -0
  222. {mima_engine-0.3.2 → mima_engine-0.3.4}/src/mima/objects/world/color_gate.py +0 -0
  223. {mima_engine-0.3.2 → mima_engine-0.3.4}/src/mima/objects/world/color_switch.py +0 -0
  224. {mima_engine-0.3.2 → mima_engine-0.3.4}/src/mima/objects/world/container.py +0 -0
  225. {mima_engine-0.3.2 → mima_engine-0.3.4}/src/mima/objects/world/floor_switch.py +0 -0
  226. {mima_engine-0.3.2 → mima_engine-0.3.4}/src/mima/objects/world/gate.py +0 -0
  227. {mima_engine-0.3.2 → mima_engine-0.3.4}/src/mima/objects/world/light_source.py +0 -0
  228. {mima_engine-0.3.2 → mima_engine-0.3.4}/src/mima/objects/world/logic_gate.py +0 -0
  229. {mima_engine-0.3.2 → mima_engine-0.3.4}/src/mima/objects/world/movable.py +0 -0
  230. {mima_engine-0.3.2 → mima_engine-0.3.4}/src/mima/objects/world/oneway.py +0 -0
  231. {mima_engine-0.3.2 → mima_engine-0.3.4}/src/mima/objects/world/pickup.py +0 -0
  232. {mima_engine-0.3.2 → mima_engine-0.3.4}/src/mima/objects/world/switch.py +0 -0
  233. {mima_engine-0.3.2 → mima_engine-0.3.4}/src/mima/objects/world/teleport.py +0 -0
  234. {mima_engine-0.3.2 → mima_engine-0.3.4}/src/mima/py.typed +0 -0
  235. {mima_engine-0.3.2 → mima_engine-0.3.4}/src/mima/scripts/__init__.py +0 -0
  236. {mima_engine-0.3.2 → mima_engine-0.3.4}/src/mima/scripts/command.py +0 -0
  237. {mima_engine-0.3.2 → mima_engine-0.3.4}/src/mima/scripts/commands/__init__.py +0 -0
  238. {mima_engine-0.3.2 → mima_engine-0.3.4}/src/mima/scripts/commands/add_quest.py +0 -0
  239. {mima_engine-0.3.2 → mima_engine-0.3.4}/src/mima/scripts/commands/change_map.py +0 -0
  240. {mima_engine-0.3.2 → mima_engine-0.3.4}/src/mima/scripts/commands/close_dialog.py +0 -0
  241. {mima_engine-0.3.2 → mima_engine-0.3.4}/src/mima/scripts/commands/equip_weapon.py +0 -0
  242. {mima_engine-0.3.2 → mima_engine-0.3.4}/src/mima/scripts/commands/give_item.py +0 -0
  243. {mima_engine-0.3.2 → mima_engine-0.3.4}/src/mima/scripts/commands/give_resource.py +0 -0
  244. {mima_engine-0.3.2 → mima_engine-0.3.4}/src/mima/scripts/commands/move_map.py +0 -0
  245. {mima_engine-0.3.2 → mima_engine-0.3.4}/src/mima/scripts/commands/move_to.py +0 -0
  246. {mima_engine-0.3.2 → mima_engine-0.3.4}/src/mima/scripts/commands/oneway_move.py +0 -0
  247. {mima_engine-0.3.2 → mima_engine-0.3.4}/src/mima/scripts/commands/parallel.py +0 -0
  248. {mima_engine-0.3.2 → mima_engine-0.3.4}/src/mima/scripts/commands/play_sound.py +0 -0
  249. {mima_engine-0.3.2 → mima_engine-0.3.4}/src/mima/scripts/commands/present_item.py +0 -0
  250. {mima_engine-0.3.2 → mima_engine-0.3.4}/src/mima/scripts/commands/progress_quest.py +0 -0
  251. {mima_engine-0.3.2 → mima_engine-0.3.4}/src/mima/scripts/commands/quit_game.py +0 -0
  252. {mima_engine-0.3.2 → mima_engine-0.3.4}/src/mima/scripts/commands/save_game.py +0 -0
  253. {mima_engine-0.3.2 → mima_engine-0.3.4}/src/mima/scripts/commands/screen_fade.py +0 -0
  254. {mima_engine-0.3.2 → mima_engine-0.3.4}/src/mima/scripts/commands/serial.py +0 -0
  255. {mima_engine-0.3.2 → mima_engine-0.3.4}/src/mima/scripts/commands/set_facing_direction.py +0 -0
  256. {mima_engine-0.3.2 → mima_engine-0.3.4}/src/mima/scripts/commands/set_spawn_map.py +0 -0
  257. {mima_engine-0.3.2 → mima_engine-0.3.4}/src/mima/scripts/commands/show_choices.py +0 -0
  258. {mima_engine-0.3.2 → mima_engine-0.3.4}/src/mima/scripts/commands/show_dialog.py +0 -0
  259. {mima_engine-0.3.2 → mima_engine-0.3.4}/src/mima/scripts/commands/take_coins.py +0 -0
  260. {mima_engine-0.3.2 → mima_engine-0.3.4}/src/mima/scripts/script_processor.py +0 -0
  261. {mima_engine-0.3.2 → mima_engine-0.3.4}/src/mima/standalone/__init__.py +0 -0
  262. {mima_engine-0.3.2 → mima_engine-0.3.4}/src/mima/standalone/multicolumn_list.py +0 -0
  263. {mima_engine-0.3.2 → mima_engine-0.3.4}/src/mima/standalone/scripting.py +0 -0
  264. {mima_engine-0.3.2 → mima_engine-0.3.4}/src/mima/states/__init__.py +0 -0
  265. {mima_engine-0.3.2 → mima_engine-0.3.4}/src/mima/states/game_state.py +0 -0
  266. {mima_engine-0.3.2 → mima_engine-0.3.4}/src/mima/states/memory.py +0 -0
  267. {mima_engine-0.3.2 → mima_engine-0.3.4}/src/mima/states/quest.py +0 -0
  268. {mima_engine-0.3.2 → mima_engine-0.3.4}/src/mima/types/__init__.py +0 -0
  269. {mima_engine-0.3.2 → mima_engine-0.3.4}/src/mima/types/alignment.py +0 -0
  270. {mima_engine-0.3.2 → mima_engine-0.3.4}/src/mima/types/blend.py +0 -0
  271. {mima_engine-0.3.2 → mima_engine-0.3.4}/src/mima/types/damage.py +0 -0
  272. {mima_engine-0.3.2 → mima_engine-0.3.4}/src/mima/types/direction.py +0 -0
  273. {mima_engine-0.3.2 → mima_engine-0.3.4}/src/mima/types/gate_color.py +0 -0
  274. {mima_engine-0.3.2 → mima_engine-0.3.4}/src/mima/types/graphic_state.py +0 -0
  275. {mima_engine-0.3.2 → mima_engine-0.3.4}/src/mima/types/keys.py +0 -0
  276. {mima_engine-0.3.2 → mima_engine-0.3.4}/src/mima/types/mode.py +0 -0
  277. {mima_engine-0.3.2 → mima_engine-0.3.4}/src/mima/types/nature.py +0 -0
  278. {mima_engine-0.3.2 → mima_engine-0.3.4}/src/mima/types/object.py +0 -0
  279. {mima_engine-0.3.2 → mima_engine-0.3.4}/src/mima/types/player.py +0 -0
  280. {mima_engine-0.3.2 → mima_engine-0.3.4}/src/mima/types/position.py +0 -0
  281. {mima_engine-0.3.2 → mima_engine-0.3.4}/src/mima/types/start.py +0 -0
  282. {mima_engine-0.3.2 → mima_engine-0.3.4}/src/mima/types/terrain.py +0 -0
  283. {mima_engine-0.3.2 → mima_engine-0.3.4}/src/mima/types/tile_collision.py +0 -0
  284. {mima_engine-0.3.2 → mima_engine-0.3.4}/src/mima/types/weapon_slot.py +0 -0
  285. {mima_engine-0.3.2 → mima_engine-0.3.4}/src/mima/types/window.py +0 -0
  286. {mima_engine-0.3.2 → mima_engine-0.3.4}/src/mima/usables/__init__.py +0 -0
  287. {mima_engine-0.3.2 → mima_engine-0.3.4}/src/mima/usables/item.py +0 -0
  288. {mima_engine-0.3.2 → mima_engine-0.3.4}/src/mima/usables/weapon.py +0 -0
  289. {mima_engine-0.3.2 → mima_engine-0.3.4}/src/mima/util/__init__.py +0 -0
  290. {mima_engine-0.3.2 → mima_engine-0.3.4}/src/mima/util/colors.py +0 -0
  291. {mima_engine-0.3.2 → mima_engine-0.3.4}/src/mima/util/constants.py +0 -0
  292. {mima_engine-0.3.2 → mima_engine-0.3.4}/src/mima/util/functions.py +0 -0
  293. {mima_engine-0.3.2 → mima_engine-0.3.4}/src/mima/util/input_defaults.py +0 -0
  294. {mima_engine-0.3.2 → mima_engine-0.3.4}/src/mima/util/logging.py +0 -0
  295. {mima_engine-0.3.2 → mima_engine-0.3.4}/src/mima/util/property.py +0 -0
  296. {mima_engine-0.3.2 → mima_engine-0.3.4}/src/mima/util/runtime_config.py +0 -0
  297. {mima_engine-0.3.2 → mima_engine-0.3.4}/src/mima/util/trading_item.py +0 -0
  298. {mima_engine-0.3.2 → mima_engine-0.3.4}/src/mima/view/__init__.py +0 -0
  299. {mima_engine-0.3.2 → mima_engine-0.3.4}/src/mima/view/camera.py +0 -0
  300. {mima_engine-0.3.2 → mima_engine-0.3.4}/src/mima/view/mima_mode.py +0 -0
  301. {mima_engine-0.3.2 → mima_engine-0.3.4}/src/mima/view/mima_scene.py +0 -0
  302. {mima_engine-0.3.2 → mima_engine-0.3.4}/src/mima/view/mima_view.py +0 -0
  303. {mima_engine-0.3.2 → mima_engine-0.3.4}/src/mima/view/mima_window.py +0 -0
  304. {mima_engine-0.3.2 → mima_engine-0.3.4}/tests/fixtures/assets.txt +0 -0
  305. {mima_engine-0.3.2 → mima_engine-0.3.4}/tests/fixtures/healing_dragon_color.png +0 -0
  306. {mima_engine-0.3.2 → mima_engine-0.3.4}/tests/fixtures/icon.png +0 -0
  307. {mima_engine-0.3.2 → mima_engine-0.3.4}/tests/fixtures/norana-sheet.png +0 -0
  308. {mima_engine-0.3.2 → mima_engine-0.3.4}/tests/fixtures/norana-sheet.tsx +0 -0
  309. {mima_engine-0.3.2 → mima_engine-0.3.4}/tests/fixtures/test.tiled-project +0 -0
  310. {mima_engine-0.3.2 → mima_engine-0.3.4}/tests/fixtures/test_map.tmx +0 -0
  311. {mima_engine-0.3.2 → mima_engine-0.3.4}/tests/fixtures/test_template.py +0 -0
  312. {mima_engine-0.3.2 → mima_engine-0.3.4}/tests/system/test_engine.py +0 -0
  313. {mima_engine-0.3.2 → mima_engine-0.3.4}/tests/system/test_map.py +0 -0
  314. {mima_engine-0.3.2 → mima_engine-0.3.4}/tests/system/test_ttv_with_map.py +0 -0
  315. {mima_engine-0.3.2 → mima_engine-0.3.4}/tests/system/test_two_players.py +0 -0
  316. {mima_engine-0.3.2 → mima_engine-0.3.4}/tests/unit/test_multicolumn_list.py +0 -0
  317. {mima_engine-0.3.2 → mima_engine-0.3.4}/tests/unit/test_shape_collection.py +0 -0
@@ -1,11 +1,11 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: mima-engine
3
- Version: 0.3.2
3
+ Version: 0.3.4
4
4
  Summary: A game engine based on pygame.
5
5
  Author-email: Stephan Balduin <stephan.balduin@mailbox.org>
6
6
  Classifier: License :: OSI Approved :: MIT License
7
7
  Classifier: Programming Language :: Python :: 3
8
- Requires-Python: >=3.12
8
+ Requires-Python: >=3.10
9
9
  Provides-Extra: ce
10
10
  Requires-Dist: pygame-ce; extra == 'ce'
11
11
  Provides-Extra: dev
@@ -11,7 +11,7 @@ authors = [
11
11
  ]
12
12
  description = "A game engine based on pygame."
13
13
  readme = "README.md"
14
- requires-python = ">=3.12"
14
+ requires-python = ">=3.10"
15
15
  classifiers = [
16
16
  "Programming Language :: Python :: 3",
17
17
  "License :: OSI Approved :: MIT License",
@@ -1,4 +1,4 @@
1
- __version__ = "0.3.2"
1
+ __version__ = "0.3.4"
2
2
 
3
3
  from .core.engine import MimaEngine as MimaEngine
4
4
  from .core.mode_engine import MimaModeEngine as MimaModeEngine
@@ -1,7 +1,8 @@
1
1
  import csv
2
2
  import logging
3
3
  from pathlib import Path
4
- from typing import Any, TypeAlias
4
+
5
+ from typing_extensions import TypeAlias
5
6
 
6
7
  from mima.standalone.tiled_map import MapManager
7
8
 
@@ -2,9 +2,9 @@ from __future__ import annotations
2
2
 
3
3
  import logging
4
4
  from enum import Enum
5
- from typing import Any, Generic, TypeVar
6
5
 
7
6
  import pygame
7
+ from typing_extensions import Any, Generic, TypeVar
8
8
 
9
9
  from mima.standalone.transformed_view import TileTransformedView
10
10
 
@@ -296,9 +296,14 @@ class Scene(Generic[V]):
296
296
  return success
297
297
 
298
298
  def draw(self) -> None:
299
+ return
300
+
301
+ def _draw(self) -> None:
299
302
  for window in self._windows.values():
300
303
  window.draw()
301
304
 
305
+ self.draw()
306
+
302
307
  def set_manager(self, manager: SceneManager) -> None:
303
308
  self._manager = manager
304
309
 
@@ -384,7 +389,7 @@ class SceneManager(Generic[S, V]):
384
389
  if self._scene is None:
385
390
  return
386
391
 
387
- self._scene.draw()
392
+ self._scene._draw()
388
393
 
389
394
 
390
395
  def position_to_screen_rect(
@@ -94,3 +94,6 @@ class ShapeCollection:
94
94
 
95
95
  def get_br_pos(self) -> Vector2:
96
96
  return self.pos + self.br
97
+
98
+ def get_bounding_size(self) -> Vector2:
99
+ return self.bounding_box.size
@@ -1,6 +1,5 @@
1
- from typing import Any, Generic
2
-
3
1
  from pygame import Vector2
2
+ from typing_extensions import Any, Generic
4
3
 
5
4
  from mima.advanced.shape import ShapeCollection
6
5
  from mima.standalone.geometry import shape_from_dict
@@ -1,7 +1,7 @@
1
1
  from enum import Enum
2
- from typing import Generic, Protocol, TypeVar
3
2
 
4
3
  from pygame import Vector2
4
+ from typing_extensions import Generic, Protocol, TypeVar
5
5
 
6
6
 
7
7
  class CameraTarget(Protocol):
@@ -1,8 +1,8 @@
1
1
  # noqa: E741
2
2
  import math
3
- from typing import Any, TypeAlias, overload
4
3
 
5
4
  from pygame.math import Vector2
5
+ from typing_extensions import Any, TypeAlias, overload
6
6
 
7
7
  EPSILON = 1e-3
8
8
 
@@ -1,6 +1,5 @@
1
- from typing import Protocol
2
-
3
1
  from pygame import BLEND_RGBA_MIN, Surface, Vector2
2
+ from typing_extensions import Protocol
4
3
 
5
4
  TRANSPARENT_COLOR = (254, 252, 253)
6
5
 
@@ -1,9 +1,8 @@
1
- import itertools
2
1
  import logging
3
2
  import math
4
- from typing import Generic, TypeVar, overload
5
3
 
6
4
  from pygame import Vector2
5
+ from typing_extensions import Generic, TypeVar, overload
7
6
 
8
7
  LOG = logging.getLogger(__name__)
9
8
  T = TypeVar("T")
@@ -17,69 +16,67 @@ class SpatialGrid(Generic[T]):
17
16
  self._n_cols = int(math.ceil(world_size.x / cell_size))
18
17
  self._n_rows = int(math.ceil(world_size.y / cell_size))
19
18
 
20
- # self._cells: dict[int, list[T]] = {
21
- # i: [] for i in range(self._n_cols * self._n_rows)
22
- # }
23
19
  self._cells: list[list[T]] = [[] for _ in range(self._n_cols * self._n_rows)]
24
- self._object_map: dict[T, int] = {}
20
+ self._object_map: dict[T, list[int]] = {}
25
21
  self.n_objects = 0
26
22
 
27
- def insert(self, obj: T, pos: Vector2) -> None:
23
+ def insert(self, obj: T, pos: Vector2, size: Vector2 | None = None) -> None:
28
24
  """Insert object at given position in the grid."""
29
- idx = self.get_grid_index(pos)
30
- self._cells[idx].append(obj)
31
- self._object_map[obj] = idx
25
+ size = Vector2(1, 1) if size is None else size
26
+ indices = cells_for_aabb(pos, size, self._cell_size, self._n_rows, self._n_cols)
27
+
28
+ for idx in indices:
29
+ self._cells[idx].append(obj)
30
+
31
+ self._object_map[obj] = indices
32
32
  self.n_objects += 1
33
33
 
34
- def remove(self, obj: T, pos: Vector2) -> None:
35
- """Remove object at given position from the grid."""
36
- idx = self.get_grid_index(pos)
37
- self._cells[idx].remove(obj)
34
+ def remove(self, obj: T) -> None:
35
+ """Remove object from all grid cells it occupies."""
36
+ indices = self._object_map.get(obj)
37
+ if indices is None:
38
+ return
39
+
40
+ for idx in indices:
41
+ if obj in self._cells[idx]:
42
+ self._cells[idx].remove(obj)
43
+
38
44
  self._object_map.pop(obj)
39
45
  self.n_objects -= 1
40
46
 
41
- def relocate(self, obj: T, old_pos: Vector2, new_pos: Vector2) -> None:
42
- """Move object from old position to new position in the grid."""
43
- if old_pos == new_pos:
44
- return
47
+ def relocate(self, obj: T, new_pos: Vector2, size: Vector2 | None = None) -> None:
48
+ """Move object to a new position in the grid."""
45
49
 
46
- old_idx_from_pos = self.get_grid_index(old_pos)
47
- if (old_idx := self._object_map[obj]) != old_idx_from_pos:
48
- LOG.error(
49
- "Cell mismatch for object %s: saved index %d != %d",
50
- str(obj),
51
- self._object_map[obj],
52
- old_idx,
50
+ old_indices = self._object_map.get(obj)
51
+ if old_indices is None:
52
+ LOG.warning(
53
+ "Objects %s not in grid. Performing insertion instead.", str(obj)
53
54
  )
54
- new_idx = self.get_grid_index(new_pos)
55
+ return self.insert(obj, new_pos, size)
55
56
 
56
- if old_idx == new_idx:
57
+ size = Vector2(1, 1) if size is None else size
58
+
59
+ new_indices = cells_for_aabb(
60
+ new_pos, size, self._cell_size, self._n_rows, self._n_cols
61
+ )
62
+ if old_indices == new_indices:
57
63
  return
58
64
 
59
65
  LOG.debug(
60
- "%s moving from (%.1f, %.1f) (cell %d) to (%.1f, %.1f) (cell %d)",
66
+ "Object %s (%s) moving from cells %s to %s",
61
67
  str(obj),
62
- old_pos.x,
63
- old_pos.y,
64
- old_idx,
65
- new_pos.x,
66
- new_pos.y,
67
- new_idx,
68
+ new_pos,
69
+ old_indices,
70
+ new_indices,
68
71
  )
72
+ for idx in old_indices:
73
+ if obj in self._cells[idx]:
74
+ self._cells[idx].remove(obj)
69
75
 
70
- if old_idx < 0 or old_idx >= len(self._cells):
71
- LOG.error(
72
- "Old cell %d of object does not exist. Number of cells %d.",
73
- old_idx,
74
- len(self._cells),
75
- )
76
+ for idx in new_indices:
77
+ self._cells[idx].append(obj)
76
78
 
77
- if obj not in self._cells[old_idx]:
78
- LOG.error("Object %s not in cell %d", str(obj), old_idx)
79
-
80
- self._cells[old_idx].remove(obj)
81
- self._cells[new_idx].append(obj)
82
- self._object_map[obj] = new_idx
79
+ self._object_map[obj] = new_indices
83
80
 
84
81
  def get_grid_index(self, pos: Vector2) -> int:
85
82
  x, y = self.get_grid_coords(pos)
@@ -93,7 +90,7 @@ class SpatialGrid(Generic[T]):
93
90
 
94
91
  def get_all_objects(self) -> list[T]:
95
92
  """Return all objects stored in the grid."""
96
- return [val for vals in self._cells for val in vals]
93
+ return list(self._object_map.keys())
97
94
 
98
95
  def get_objects_in_region(self, pos: Vector2, size: Vector2) -> list[T]:
99
96
  """Return all objects in the area defined by pos and size."""
@@ -105,15 +102,14 @@ class SpatialGrid(Generic[T]):
105
102
  ex = int(min(self._n_cols - 1, (pos.x + size.x - 1e-9) // self._cell_size))
106
103
  ey = int(min(self._n_rows - 1, (pos.y + size.y - 1e-9) // self._cell_size))
107
104
 
108
- return list(
109
- itertools.chain(
110
- *[
111
- self._cells[gx + gy * self._n_cols]
112
- for gy in range(sy, ey + 1) # include last index
113
- for gx in range(sx, ex + 1)
114
- ]
115
- )
116
- )
105
+ result: set[T] = set()
106
+
107
+ for gy in range(sy, ey + 1):
108
+ row_offset = gy * self._n_cols
109
+ for gx in range(sx, ex + 1):
110
+ result.update(self._cells[gx + row_offset])
111
+
112
+ return list(result)
117
113
 
118
114
  def get_cells_in_region(
119
115
  self, pos: Vector2, size: Vector2
@@ -163,3 +159,28 @@ def clamp(val: float, low: float, high: float) -> float: ...
163
159
 
164
160
  def clamp(val: int | float, low: int | float, high: int | float) -> int | float:
165
161
  return max(low, min(high, val))
162
+
163
+
164
+ def vmax(val: Vector2, other: Vector2) -> Vector2:
165
+ return Vector2(max(val.x, other.x), max(val.y, other.y))
166
+
167
+
168
+ def vmin(val: Vector2, other: Vector2) -> Vector2:
169
+ return Vector2(min(val.x, other.x), min(val.y, other.y))
170
+
171
+
172
+ def cells_for_aabb(
173
+ pos: Vector2, size: Vector2, cell_size: int, n_rows: int, n_cols: int
174
+ ) -> list[int]:
175
+ tl = pos // cell_size
176
+ br = (pos + size) // cell_size
177
+ v_cols = Vector2(n_cols - 1, n_rows - 1)
178
+ tl = vmax(Vector2(), vmin(tl, v_cols))
179
+ br = vmax(Vector2(), vmin(br, v_cols))
180
+
181
+ indices: list[int] = []
182
+ for y in range(int(tl.y), int(br.y) + 1):
183
+ for x in range(int(tl.x), int(br.x) + 1):
184
+ indices.append(x + y * n_cols)
185
+
186
+ return indices
@@ -1,9 +1,7 @@
1
- from collections import defaultdict
2
1
  from enum import Enum
3
- from typing import Any, Generic, Protocol, TypeVar
4
2
 
5
- import pygame
6
3
  from pygame import Surface, Vector2
4
+ from typing_extensions import Any, Generic, Protocol, TypeVar
7
5
 
8
6
  GS = TypeVar("GS", bound=Enum)
9
7
  D = TypeVar("D", bound=Enum)
@@ -6,12 +6,12 @@ import math
6
6
  from dataclasses import dataclass
7
7
  from io import StringIO
8
8
  from pathlib import Path
9
- from typing import Any, Protocol, Self, TypeAlias, overload
10
9
  from xml.etree import ElementTree
11
10
  from xml.etree.ElementTree import Element
12
11
 
13
12
  import pygame
14
13
  from pygame import Surface, Vector2
14
+ from typing_extensions import Any, Protocol, Self, TypeAlias, overload
15
15
 
16
16
  LOG = logging.getLogger(__name__)
17
17
 
@@ -299,7 +299,8 @@ class TiledObject(_TiledBase):
299
299
  self.pos.y -= self.size.y
300
300
  else:
301
301
  self.size = Vector2(
302
- float(o_xtree.attrib["width"]), float(o_xtree.attrib.get("height", 0.0))
302
+ float(o_xtree.attrib.get("width", 0.0)),
303
+ float(o_xtree.attrib.get("height", 0.0)),
303
304
  )
304
305
 
305
306
  self.name = o_xtree.attrib.get("name", self.name)
@@ -1,9 +1,10 @@
1
1
  import logging
2
2
  import math
3
- from typing import TypeAlias, Union
4
3
 
5
4
  import pygame
6
- from pygame import Event, Surface, Vector2
5
+ from pygame import Surface, Vector2
6
+ from pygame.event import Event
7
+ from typing_extensions import TypeAlias, Union
7
8
 
8
9
  LOG = logging.getLogger(__name__)
9
10
  Color: TypeAlias = Union[tuple[int, int, int], tuple[int, int, int, int]]
@@ -197,7 +198,7 @@ class TransformedView:
197
198
  self, pos: Vector2, color: tuple[int, int, int] | tuple[int, int, int, int]
198
199
  ) -> None:
199
200
  pos = self.world_to_screen(pos)
200
- self._screen.set_at(pos, color)
201
+ self._screen.set_at((int(pos.x), int(pos.y)), color)
201
202
 
202
203
  def draw_line(
203
204
  self, pos1: Vector2, pos2: Vector2, color: Color | None = None, width: int = 1
@@ -1,8 +1,8 @@
1
1
  from dataclasses import dataclass
2
2
  from enum import Enum
3
- from typing import Protocol, TypeVar
4
3
 
5
4
  import pygame
5
+ from typing_extensions import Protocol, TypeVar
6
6
 
7
7
 
8
8
  class Input(Enum):
@@ -23,7 +23,6 @@ GAME_VIEW = 1
23
23
  MENU_VIEW = 2
24
24
 
25
25
 
26
-
27
26
  class TitleView(View[int]):
28
27
  def __init__(self) -> None:
29
28
  super().__init__(TITLE_VIEW, screen)
@@ -65,6 +64,40 @@ class TitleView(View[int]):
65
64
  def draw(self) -> None:
66
65
  self.ttv.fill_rect(self._pos, self._size, (246, 204, 64))
67
66
 
67
+ self.ttv.draw_surface(
68
+ pygame.Vector2(16, 32), my_font.render("TITLE VIEW", False, (0, 0, 0))
69
+ )
70
+
71
+ self.ttv.draw_surface(
72
+ pygame.Vector2(16, 64), my_font.render("d: Next Scene", False, (0, 0, 0))
73
+ )
74
+
75
+ self.ttv.draw_surface(
76
+ pygame.Vector2(16, 96),
77
+ my_font.render(
78
+ "f: Next Scene (Top / Bottom Split Screen)", False, (0, 0, 0)
79
+ ),
80
+ )
81
+
82
+ self.ttv.draw_surface(
83
+ pygame.Vector2(16, 128),
84
+ my_font.render(
85
+ "c: Next Scene (Left / Right Split Screen)", False, (0, 0, 0)
86
+ ),
87
+ )
88
+
89
+ self.ttv.draw_surface(
90
+ pygame.Vector2(16, 160),
91
+ my_font.render("x: Next Scene (4-player Split Screen)", False, (0, 0, 0)),
92
+ )
93
+
94
+ self.ttv.draw_surface(
95
+ pygame.Vector2(16, 192),
96
+ my_font.render(
97
+ "a: Return to this scene (on any Next Scene)", False, (0, 0, 0)
98
+ ),
99
+ )
100
+
68
101
 
69
102
  class GameView(View[int]):
70
103
  def __init__(self) -> None:
@@ -104,10 +137,25 @@ class GameView(View[int]):
104
137
  self.ttv.fill_rect(pygame.Vector2(0, 0), self._size, color)
105
138
 
106
139
  self.ttv.draw_surface(
107
- pygame.Vector2(10, 10),
108
- my_font.render(f"{self._position.name}", False, (255, 255, 255)),
140
+ pygame.Vector2(16, 32),
141
+ my_font.render(f"GAME VIEW {self._position.name}", False, (255, 255, 255)),
109
142
  )
110
143
 
144
+ if self._position in [
145
+ Position.FULL,
146
+ Position.TOP,
147
+ Position.LEFT,
148
+ Position.TOP_LEFT,
149
+ ]:
150
+ self.ttv.draw_surface(
151
+ pygame.Vector2(16, 64),
152
+ my_font.render("s: Go to Menu View", False, (255, 255, 255)),
153
+ )
154
+ self.ttv.draw_surface(
155
+ pygame.Vector2(16, 96),
156
+ my_font.render("a: Back to Title Scene", False, (255, 255, 255)),
157
+ )
158
+
111
159
 
112
160
  class MenuView(View[int]):
113
161
  def __init__(self) -> None:
@@ -137,12 +185,26 @@ class MenuView(View[int]):
137
185
  def draw(self) -> None:
138
186
  self.ttv.fill_rect(pygame.Vector2(0, 0), self._size, (0, 144, 54))
139
187
 
140
- txt = f"{self._position.name}"
141
-
142
188
  self.ttv.draw_surface(
143
- pygame.Vector2(10, 10), my_font.render(txt, False, (255, 255, 255))
189
+ pygame.Vector2(16, 32),
190
+ my_font.render(f"MENU VIEW {self._position.name}", False, (255, 255, 255)),
144
191
  )
145
192
 
193
+ if self._position in [
194
+ Position.FULL,
195
+ Position.TOP,
196
+ Position.LEFT,
197
+ Position.TOP_LEFT,
198
+ ]:
199
+ self.ttv.draw_surface(
200
+ pygame.Vector2(16, 64),
201
+ my_font.render("w: Go to Game View", False, (255, 255, 255)),
202
+ )
203
+ self.ttv.draw_surface(
204
+ pygame.Vector2(16, 96),
205
+ my_font.render("a: Back to Title Scene", False, (255, 255, 255)),
206
+ )
207
+
146
208
 
147
209
  class TitleScene(Scene):
148
210
  def enter_focus(self, data: dict[str, Any]) -> None:
@@ -155,6 +217,11 @@ class TitleScene(Scene):
155
217
  self._windows.clear()
156
218
  return {}
157
219
 
220
+ def draw(self) -> None:
221
+ screen.blit(
222
+ my_font.render("TITLE SCENE", False, (0, 0, 0)), pygame.Vector2(900, 8)
223
+ )
224
+
158
225
 
159
226
  class GameScene(Scene):
160
227
  def __init__(self):
@@ -173,6 +240,12 @@ class GameScene(Scene):
173
240
  self._windows.clear()
174
241
  return {}
175
242
 
243
+ def draw(self) -> None:
244
+ screen.blit(
245
+ my_font.render(" GAME SCENE", False, (255, 255, 255)),
246
+ pygame.Vector2(900, 8),
247
+ )
248
+
176
249
 
177
250
  sm = SceneManager[int, int]()
178
251
  sm.add_scene(TitleScene(), TITLE_SCENE)