mini-arcade-core 0.10.0__py3-none-any.whl → 1.0.1__py3-none-any.whl
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.
- mini_arcade_core/__init__.py +51 -63
- mini_arcade_core/backend/__init__.py +2 -6
- mini_arcade_core/backend/backend.py +148 -8
- mini_arcade_core/backend/events.py +1 -1
- mini_arcade_core/{keymaps/sdl.py → backend/sdl_map.py} +1 -1
- mini_arcade_core/engine/__init__.py +0 -0
- mini_arcade_core/engine/commands.py +169 -0
- mini_arcade_core/engine/game.py +369 -0
- mini_arcade_core/engine/render/__init__.py +0 -0
- mini_arcade_core/engine/render/packet.py +56 -0
- mini_arcade_core/engine/render/pipeline.py +63 -0
- mini_arcade_core/engine/render/viewport.py +203 -0
- mini_arcade_core/managers/__init__.py +0 -22
- mini_arcade_core/managers/cheats.py +71 -240
- mini_arcade_core/managers/inputs.py +5 -3
- mini_arcade_core/runtime/__init__.py +0 -0
- mini_arcade_core/runtime/audio/__init__.py +0 -0
- mini_arcade_core/runtime/audio/audio_adapter.py +20 -0
- mini_arcade_core/runtime/audio/audio_port.py +36 -0
- mini_arcade_core/runtime/capture/__init__.py +0 -0
- mini_arcade_core/runtime/capture/capture_adapter.py +143 -0
- mini_arcade_core/runtime/capture/capture_port.py +51 -0
- mini_arcade_core/runtime/context.py +53 -0
- mini_arcade_core/runtime/file/__init__.py +0 -0
- mini_arcade_core/runtime/file/file_adapter.py +20 -0
- mini_arcade_core/runtime/file/file_port.py +31 -0
- mini_arcade_core/runtime/input/__init__.py +0 -0
- mini_arcade_core/runtime/input/input_adapter.py +49 -0
- mini_arcade_core/runtime/input/input_port.py +31 -0
- mini_arcade_core/runtime/input_frame.py +71 -0
- mini_arcade_core/runtime/scene/__init__.py +0 -0
- mini_arcade_core/runtime/scene/scene_adapter.py +97 -0
- mini_arcade_core/runtime/scene/scene_port.py +149 -0
- mini_arcade_core/runtime/services.py +35 -0
- mini_arcade_core/runtime/window/__init__.py +0 -0
- mini_arcade_core/runtime/window/window_adapter.py +90 -0
- mini_arcade_core/runtime/window/window_port.py +109 -0
- mini_arcade_core/scenes/__init__.py +0 -22
- mini_arcade_core/scenes/autoreg.py +1 -1
- mini_arcade_core/scenes/registry.py +21 -19
- mini_arcade_core/scenes/sim_scene.py +41 -0
- mini_arcade_core/scenes/systems/__init__.py +0 -0
- mini_arcade_core/scenes/systems/base_system.py +40 -0
- mini_arcade_core/scenes/systems/system_pipeline.py +57 -0
- mini_arcade_core/sim/__init__.py +0 -0
- mini_arcade_core/sim/protocols.py +41 -0
- mini_arcade_core/sim/runner.py +222 -0
- mini_arcade_core/spaces/__init__.py +0 -12
- mini_arcade_core/spaces/d2/__init__.py +0 -30
- mini_arcade_core/spaces/d2/boundaries2d.py +10 -1
- mini_arcade_core/spaces/d2/collision2d.py +25 -28
- mini_arcade_core/spaces/d2/geometry2d.py +18 -0
- mini_arcade_core/spaces/d2/kinematics2d.py +2 -8
- mini_arcade_core/spaces/d2/physics2d.py +9 -0
- mini_arcade_core/ui/__init__.py +0 -26
- mini_arcade_core/ui/menu.py +271 -85
- mini_arcade_core/utils/__init__.py +10 -0
- mini_arcade_core/utils/deprecated_decorator.py +45 -0
- mini_arcade_core/utils/logging.py +168 -0
- {mini_arcade_core-0.10.0.dist-info → mini_arcade_core-1.0.1.dist-info}/METADATA +1 -1
- mini_arcade_core-1.0.1.dist-info/RECORD +66 -0
- {mini_arcade_core-0.10.0.dist-info → mini_arcade_core-1.0.1.dist-info}/WHEEL +1 -1
- mini_arcade_core/commands.py +0 -84
- mini_arcade_core/entity.py +0 -72
- mini_arcade_core/game.py +0 -287
- mini_arcade_core/keymaps/__init__.py +0 -15
- mini_arcade_core/managers/base.py +0 -132
- mini_arcade_core/managers/entities.py +0 -38
- mini_arcade_core/managers/overlays.py +0 -53
- mini_arcade_core/managers/system.py +0 -26
- mini_arcade_core/scenes/model.py +0 -34
- mini_arcade_core/scenes/runtime.py +0 -29
- mini_arcade_core/scenes/scene.py +0 -109
- mini_arcade_core/scenes/system.py +0 -69
- mini_arcade_core/ui/overlays.py +0 -41
- mini_arcade_core-0.10.0.dist-info/RECORD +0 -40
- /mini_arcade_core/{keymaps → backend}/keys.py +0 -0
- {mini_arcade_core-0.10.0.dist-info → mini_arcade_core-1.0.1.dist-info}/licenses/LICENSE +0 -0
|
@@ -39,25 +39,34 @@ class VerticalBounce:
|
|
|
39
39
|
|
|
40
40
|
bounds: Bounds2D
|
|
41
41
|
|
|
42
|
-
def apply(self, obj: RectKinematic):
|
|
42
|
+
def apply(self, obj: RectKinematic) -> bool:
|
|
43
43
|
"""
|
|
44
44
|
Apply vertical bounce to the given object.
|
|
45
45
|
|
|
46
46
|
:param obj: The object to apply the bounce to.
|
|
47
47
|
:type obj: RectKinematic
|
|
48
|
+
|
|
49
|
+
:return: True if a bounce occurred, False otherwise.
|
|
50
|
+
:rtype: bool
|
|
48
51
|
"""
|
|
49
52
|
top = self.bounds.top
|
|
50
53
|
bottom = self.bounds.bottom
|
|
51
54
|
|
|
55
|
+
bounced = False
|
|
56
|
+
|
|
52
57
|
# Top collision
|
|
53
58
|
if obj.position.y <= top:
|
|
54
59
|
obj.position.y = top
|
|
55
60
|
obj.velocity.vy *= -1
|
|
61
|
+
bounced = True
|
|
56
62
|
|
|
57
63
|
# Bottom collision
|
|
58
64
|
if obj.position.y + obj.size.height >= bottom:
|
|
59
65
|
obj.position.y = bottom - obj.size.height
|
|
60
66
|
obj.velocity.vy *= -1
|
|
67
|
+
bounced = True
|
|
68
|
+
|
|
69
|
+
return bounced
|
|
61
70
|
|
|
62
71
|
|
|
63
72
|
class RectSprite(Protocol):
|
|
@@ -4,45 +4,35 @@
|
|
|
4
4
|
|
|
5
5
|
from __future__ import annotations
|
|
6
6
|
|
|
7
|
+
from abc import ABC, abstractmethod
|
|
7
8
|
from dataclasses import dataclass
|
|
8
9
|
|
|
9
10
|
from .geometry2d import Position2D, Size2D
|
|
10
11
|
|
|
11
12
|
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
pos_b: Position2D,
|
|
16
|
-
size_b: Size2D,
|
|
17
|
-
) -> bool:
|
|
13
|
+
class Collider2D(ABC):
|
|
14
|
+
"""
|
|
15
|
+
Abstract base class for 2D colliders.
|
|
18
16
|
"""
|
|
19
|
-
Low-level AABB check. Internal helper.
|
|
20
|
-
|
|
21
|
-
:param pos_a: Top-left position of rectangle A.
|
|
22
|
-
:type pos_a: Position2D
|
|
23
17
|
|
|
24
|
-
:
|
|
25
|
-
:
|
|
18
|
+
position: Position2D
|
|
19
|
+
size: Size2D
|
|
26
20
|
|
|
27
|
-
|
|
28
|
-
:
|
|
21
|
+
@abstractmethod
|
|
22
|
+
def intersects(self, other: Collider2D) -> bool:
|
|
23
|
+
"""
|
|
24
|
+
Check if this collider intersects with another collider.
|
|
29
25
|
|
|
30
|
-
|
|
31
|
-
|
|
26
|
+
:param other: The other collider to check against.
|
|
27
|
+
:type other: Collider2D
|
|
32
28
|
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
return not (
|
|
37
|
-
pos_a.x + size_a.width < pos_b.x
|
|
38
|
-
or pos_a.x > pos_b.x + size_b.width
|
|
39
|
-
or pos_a.y + size_a.height < pos_b.y
|
|
40
|
-
or pos_a.y > pos_b.y + size_b.height
|
|
41
|
-
)
|
|
29
|
+
:return: True if the colliders intersect.
|
|
30
|
+
:rtype: bool
|
|
31
|
+
"""
|
|
42
32
|
|
|
43
33
|
|
|
44
34
|
@dataclass
|
|
45
|
-
class RectCollider:
|
|
35
|
+
class RectCollider(Collider2D):
|
|
46
36
|
"""
|
|
47
37
|
OOP collision helper that wraps a Position2D + Size2D pair.
|
|
48
38
|
|
|
@@ -66,6 +56,13 @@ class RectCollider:
|
|
|
66
56
|
:return: True if the rectangles intersect.
|
|
67
57
|
:rtype: bool
|
|
68
58
|
"""
|
|
69
|
-
|
|
70
|
-
|
|
59
|
+
pos_a = self.position
|
|
60
|
+
size_a = self.size
|
|
61
|
+
pos_b = other.position
|
|
62
|
+
size_b = other.size
|
|
63
|
+
return not (
|
|
64
|
+
pos_a.x + size_a.width < pos_b.x
|
|
65
|
+
or pos_a.x > pos_b.x + size_b.width
|
|
66
|
+
or pos_a.y + size_a.height < pos_b.y
|
|
67
|
+
or pos_a.y > pos_b.y + size_b.height
|
|
71
68
|
)
|
|
@@ -19,6 +19,15 @@ class Position2D:
|
|
|
19
19
|
x: float
|
|
20
20
|
y: float
|
|
21
21
|
|
|
22
|
+
def to_tuple(self) -> tuple[float, float]:
|
|
23
|
+
"""
|
|
24
|
+
Convert Position2D to a tuple.
|
|
25
|
+
|
|
26
|
+
:return: Tuple of (x, y).
|
|
27
|
+
:rtype: tuple[float, float]
|
|
28
|
+
"""
|
|
29
|
+
return (self.x, self.y)
|
|
30
|
+
|
|
22
31
|
|
|
23
32
|
@dataclass
|
|
24
33
|
class Size2D:
|
|
@@ -32,6 +41,15 @@ class Size2D:
|
|
|
32
41
|
width: int
|
|
33
42
|
height: int
|
|
34
43
|
|
|
44
|
+
def to_tuple(self) -> tuple[int, int]:
|
|
45
|
+
"""
|
|
46
|
+
Convert Size2D to a tuple.
|
|
47
|
+
|
|
48
|
+
:return: Tuple of (width, height).
|
|
49
|
+
:rtype: tuple[int, int]
|
|
50
|
+
"""
|
|
51
|
+
return (self.width, self.height)
|
|
52
|
+
|
|
35
53
|
|
|
36
54
|
@dataclass
|
|
37
55
|
class Bounds2D:
|
|
@@ -7,8 +7,7 @@ from __future__ import annotations
|
|
|
7
7
|
from dataclasses import dataclass
|
|
8
8
|
from typing import Optional
|
|
9
9
|
|
|
10
|
-
from
|
|
11
|
-
|
|
10
|
+
from .collision2d import Collider2D
|
|
12
11
|
from .geometry2d import Position2D, Size2D
|
|
13
12
|
from .physics2d import Velocity2D
|
|
14
13
|
|
|
@@ -28,7 +27,7 @@ class KinematicData:
|
|
|
28
27
|
size: Size2D
|
|
29
28
|
velocity: Velocity2D
|
|
30
29
|
time_scale: float = 1.0
|
|
31
|
-
|
|
30
|
+
collider: Optional[Collider2D] = None
|
|
32
31
|
|
|
33
32
|
# Justification: Convenience factory with many params.
|
|
34
33
|
# pylint: disable=too-many-arguments,too-many-positional-arguments
|
|
@@ -42,7 +41,6 @@ class KinematicData:
|
|
|
42
41
|
vx: float = 0.0,
|
|
43
42
|
vy: float = 0.0,
|
|
44
43
|
time_scale: float = 1.0,
|
|
45
|
-
color: Optional[Color] = None,
|
|
46
44
|
) -> "KinematicData":
|
|
47
45
|
"""
|
|
48
46
|
Convenience factory for rectangular kinematic data.
|
|
@@ -65,9 +63,6 @@ class KinematicData:
|
|
|
65
63
|
:param vy: Velocity in the Y direction.
|
|
66
64
|
:type vy: float
|
|
67
65
|
|
|
68
|
-
:param color: Optional color for rendering.
|
|
69
|
-
:type color: Optional[Color]
|
|
70
|
-
|
|
71
66
|
:return: KinematicData instance with the specified parameters.
|
|
72
67
|
:rtype: KinematicData
|
|
73
68
|
"""
|
|
@@ -76,7 +71,6 @@ class KinematicData:
|
|
|
76
71
|
size=Size2D(int(width), int(height)),
|
|
77
72
|
velocity=Velocity2D(float(vx), float(vy)),
|
|
78
73
|
time_scale=time_scale,
|
|
79
|
-
color=color,
|
|
80
74
|
)
|
|
81
75
|
|
|
82
76
|
# pylint: enable=too-many-arguments,too-many-positional-arguments
|
|
@@ -19,6 +19,15 @@ class Velocity2D:
|
|
|
19
19
|
vx: float = 0.0
|
|
20
20
|
vy: float = 0.0
|
|
21
21
|
|
|
22
|
+
def to_tuple(self) -> tuple[float, float]:
|
|
23
|
+
"""
|
|
24
|
+
Convert Velocity2D to a tuple.
|
|
25
|
+
|
|
26
|
+
:return: Tuple of (vx, vy).
|
|
27
|
+
:rtype: tuple[float, float]
|
|
28
|
+
"""
|
|
29
|
+
return (self.vx, self.vy)
|
|
30
|
+
|
|
22
31
|
def advance(self, x: float, y: float, dt: float) -> tuple[float, float]:
|
|
23
32
|
"""Return new (x, y) after dt seconds."""
|
|
24
33
|
return x + self.vx * dt, y + self.vy * dt
|
mini_arcade_core/ui/__init__.py
CHANGED
|
@@ -1,26 +0,0 @@
|
|
|
1
|
-
"""
|
|
2
|
-
UI utilities and components for Mini Arcade Core.
|
|
3
|
-
Includes buttons, labels, and layout management.
|
|
4
|
-
"""
|
|
5
|
-
|
|
6
|
-
from __future__ import annotations
|
|
7
|
-
|
|
8
|
-
from .menu import (
|
|
9
|
-
BaseMenuScene,
|
|
10
|
-
Menu,
|
|
11
|
-
MenuItem,
|
|
12
|
-
MenuModel,
|
|
13
|
-
MenuStyle,
|
|
14
|
-
MenuSystem,
|
|
15
|
-
)
|
|
16
|
-
from .overlays import BaseOverlay
|
|
17
|
-
|
|
18
|
-
__all__ = [
|
|
19
|
-
"Menu",
|
|
20
|
-
"MenuItem",
|
|
21
|
-
"MenuStyle",
|
|
22
|
-
"MenuModel",
|
|
23
|
-
"MenuSystem",
|
|
24
|
-
"BaseMenuScene",
|
|
25
|
-
"BaseOverlay",
|
|
26
|
-
]
|