batframework 1.0.9a11__py3-none-any.whl → 1.0.9a13__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.
- batFramework/__init__.py +3 -11
- batFramework/action.py +280 -279
- batFramework/actionContainer.py +105 -82
- batFramework/animatedSprite.py +80 -58
- batFramework/animation.py +91 -77
- batFramework/audioManager.py +156 -131
- batFramework/baseScene.py +249 -240
- batFramework/camera.py +245 -317
- batFramework/constants.py +57 -51
- batFramework/cutscene.py +239 -253
- batFramework/cutsceneManager.py +34 -34
- batFramework/drawable.py +107 -77
- batFramework/dynamicEntity.py +30 -30
- batFramework/easingController.py +58 -58
- batFramework/entity.py +130 -130
- batFramework/enums.py +171 -135
- batFramework/fontManager.py +65 -65
- batFramework/gui/__init__.py +28 -25
- batFramework/gui/animatedLabel.py +90 -89
- batFramework/gui/button.py +17 -17
- batFramework/gui/clickableWidget.py +244 -244
- batFramework/gui/collapseContainer.py +98 -0
- batFramework/gui/constraints/__init__.py +1 -1
- batFramework/gui/constraints/constraints.py +1066 -980
- batFramework/gui/container.py +220 -206
- batFramework/gui/debugger.py +140 -130
- batFramework/gui/draggableWidget.py +63 -44
- batFramework/gui/image.py +61 -58
- batFramework/gui/indicator.py +116 -113
- batFramework/gui/interactiveWidget.py +243 -239
- batFramework/gui/label.py +147 -344
- batFramework/gui/layout.py +442 -429
- batFramework/gui/meter.py +155 -96
- batFramework/gui/radioButton.py +43 -35
- batFramework/gui/root.py +228 -228
- batFramework/gui/scrollingContainer.py +282 -0
- batFramework/gui/selector.py +232 -250
- batFramework/gui/shape.py +286 -276
- batFramework/gui/slider.py +353 -397
- batFramework/gui/style.py +10 -10
- batFramework/gui/styleManager.py +49 -54
- batFramework/gui/syncedVar.py +43 -49
- batFramework/gui/textInput.py +331 -306
- batFramework/gui/textWidget.py +308 -0
- batFramework/gui/toggle.py +140 -128
- batFramework/gui/tooltip.py +35 -30
- batFramework/gui/widget.py +546 -521
- batFramework/manager.py +131 -134
- batFramework/particle.py +118 -118
- batFramework/propertyEaser.py +79 -79
- batFramework/renderGroup.py +34 -34
- batFramework/resourceManager.py +130 -130
- batFramework/scene.py +31 -31
- batFramework/sceneLayer.py +134 -138
- batFramework/sceneManager.py +200 -197
- batFramework/scrollingSprite.py +115 -115
- batFramework/sprite.py +46 -51
- batFramework/stateMachine.py +49 -54
- batFramework/templates/__init__.py +2 -1
- batFramework/templates/character.py +15 -0
- batFramework/templates/controller.py +158 -97
- batFramework/templates/stateMachine.py +39 -0
- batFramework/tileset.py +46 -46
- batFramework/timeManager.py +213 -213
- batFramework/transition.py +162 -162
- batFramework/triggerZone.py +22 -22
- batFramework/utils.py +306 -306
- {batframework-1.0.9a11.dist-info → batframework-1.0.9a13.dist-info}/LICENSE +20 -20
- {batframework-1.0.9a11.dist-info → batframework-1.0.9a13.dist-info}/METADATA +24 -17
- batframework-1.0.9a13.dist-info/RECORD +72 -0
- batframework-1.0.9a11.dist-info/RECORD +0 -67
- {batframework-1.0.9a11.dist-info → batframework-1.0.9a13.dist-info}/WHEEL +0 -0
- {batframework-1.0.9a11.dist-info → batframework-1.0.9a13.dist-info}/top_level.txt +0 -0
batFramework/timeManager.py
CHANGED
@@ -1,213 +1,213 @@
|
|
1
|
-
import batFramework as bf
|
2
|
-
from typing import Callable, Union, Self,Any
|
3
|
-
|
4
|
-
class Timer:
|
5
|
-
_count: int = 0
|
6
|
-
_available_ids: set[int] = set()
|
7
|
-
|
8
|
-
def __init__(self, duration: float, end_callback: Callable[[], Any], loop: int = 0, register: str = "global") -> None:
|
9
|
-
if Timer._available_ids:
|
10
|
-
self.uid = Timer._available_ids.pop()
|
11
|
-
else:
|
12
|
-
self.uid = Timer._count
|
13
|
-
Timer._count += 1
|
14
|
-
|
15
|
-
self.register = register
|
16
|
-
self.duration: float = duration
|
17
|
-
self.end_callback = end_callback
|
18
|
-
|
19
|
-
self.elapsed_time: float = 0
|
20
|
-
self.is_over: bool = False
|
21
|
-
self.loop: int = loop # Number of loops (-1 for infinite)
|
22
|
-
self.is_paused: bool = False
|
23
|
-
self.do_delete: bool = False
|
24
|
-
self.is_stopped: bool = True
|
25
|
-
|
26
|
-
def __bool__(self) -> bool:
|
27
|
-
return self.elapsed_time != -1 and self.is_over
|
28
|
-
|
29
|
-
def __str__(self) -> str:
|
30
|
-
loop_info = "infinite" if self.loop == -1 else f"{self.loop} loops left"
|
31
|
-
return f"Timer ({self.uid}) {self.elapsed_time}/{self.duration} | {loop_info} {'(D) ' if self.do_delete else ''}"
|
32
|
-
|
33
|
-
def stop(self) -> Self:
|
34
|
-
"""
|
35
|
-
Cancels all progression and stops the timer.
|
36
|
-
Does not mark it for deletion and does not call the end_callback.
|
37
|
-
Prevents automatic restart if looping.
|
38
|
-
"""
|
39
|
-
self.is_stopped = True
|
40
|
-
self.is_paused = False
|
41
|
-
self.is_over = False
|
42
|
-
self.elapsed_time = 0
|
43
|
-
return self
|
44
|
-
|
45
|
-
def start(self, force: bool = False) -> Self:
|
46
|
-
"""
|
47
|
-
Starts the timer only if not already started (unless force is used, which resets it).
|
48
|
-
"""
|
49
|
-
if self.elapsed_time > 0 and not force:
|
50
|
-
return self
|
51
|
-
if not bf.TimeManager().add_timer(self, self.register):
|
52
|
-
return self
|
53
|
-
self.elapsed_time = 0
|
54
|
-
self.is_paused = False
|
55
|
-
self.is_over = False
|
56
|
-
self.is_stopped = False
|
57
|
-
return self
|
58
|
-
|
59
|
-
def pause(self) -> Self:
|
60
|
-
"""
|
61
|
-
Momentarily stops the timer until resume is called.
|
62
|
-
"""
|
63
|
-
self.is_paused = True
|
64
|
-
return self
|
65
|
-
|
66
|
-
def resume(self) -> Self:
|
67
|
-
"""
|
68
|
-
Resumes from a paused state.
|
69
|
-
"""
|
70
|
-
self.is_paused = False
|
71
|
-
return self
|
72
|
-
|
73
|
-
def delete(self) -> Self:
|
74
|
-
"""
|
75
|
-
Marks the timer for deletion.
|
76
|
-
"""
|
77
|
-
self.do_delete = True
|
78
|
-
return self
|
79
|
-
|
80
|
-
def has_started(self) -> bool:
|
81
|
-
"""
|
82
|
-
Returns True if the timer has started.
|
83
|
-
"""
|
84
|
-
return not self.is_stopped
|
85
|
-
|
86
|
-
def get_progression(self) -> float:
|
87
|
-
"""
|
88
|
-
Returns the progression of the timer (0 to 1) as a float.
|
89
|
-
"""
|
90
|
-
if self.is_stopped:
|
91
|
-
return 0
|
92
|
-
if self.elapsed_time >= self.duration:
|
93
|
-
return 1
|
94
|
-
return self.elapsed_time / self.duration
|
95
|
-
|
96
|
-
def update(self, dt) -> None:
|
97
|
-
if self.is_stopped or self.is_paused or self.is_over:
|
98
|
-
return
|
99
|
-
self.elapsed_time += dt
|
100
|
-
if self.get_progression() == 1:
|
101
|
-
self.end()
|
102
|
-
|
103
|
-
def end(self):
|
104
|
-
"""
|
105
|
-
Ends the timer progression (calls the end_callback function).
|
106
|
-
Is called automatically once the timer is over.
|
107
|
-
Will not mark the timer for deletion.
|
108
|
-
If it is looping, it will restart the timer **only if it wasn't stopped**.
|
109
|
-
"""
|
110
|
-
self.is_over = True
|
111
|
-
if self.end_callback:
|
112
|
-
self.end_callback()
|
113
|
-
|
114
|
-
# Handle looping
|
115
|
-
if self.loop == -1: # Infinite looping
|
116
|
-
self.elapsed_time = 0
|
117
|
-
self.start()
|
118
|
-
return
|
119
|
-
elif self.loop > 0: # Decrease loop count and restart
|
120
|
-
self.loop -= 1
|
121
|
-
self.elapsed_time = 0
|
122
|
-
self.start()
|
123
|
-
return
|
124
|
-
|
125
|
-
# Stop the timer if no loops are left
|
126
|
-
self.is_stopped = True
|
127
|
-
|
128
|
-
def should_delete(self) -> bool:
|
129
|
-
"""
|
130
|
-
Method that returns if the timer is to be deleted.
|
131
|
-
Required for timer management.
|
132
|
-
"""
|
133
|
-
return self.is_over or self.do_delete
|
134
|
-
|
135
|
-
def _release_id(self):
|
136
|
-
Timer._available_ids.add(self.uid)
|
137
|
-
|
138
|
-
class SceneTimer(Timer):
|
139
|
-
"""
|
140
|
-
A timer that is only updated while the given scene is active (being updated)
|
141
|
-
"""
|
142
|
-
def __init__(self, duration: float | int, end_callback, loop: int = 0, scene_name:str = "global") -> None:
|
143
|
-
super().__init__(duration, end_callback, loop, scene_name)
|
144
|
-
|
145
|
-
class TimeManager(metaclass=bf.Singleton):
|
146
|
-
class TimerRegister:
|
147
|
-
def __init__(self, active=True):
|
148
|
-
self.active = active
|
149
|
-
self.timers: dict[int | str, Timer] = {}
|
150
|
-
|
151
|
-
def __iter__(self):
|
152
|
-
return iter(self.timers.values())
|
153
|
-
|
154
|
-
def add_timer(self, timer: Timer):
|
155
|
-
self.timers[timer.uid] = timer
|
156
|
-
|
157
|
-
def update(self, dt):
|
158
|
-
expired_timers = []
|
159
|
-
for timer in list(self.timers.values()):
|
160
|
-
if not timer.is_paused:
|
161
|
-
timer.update(dt)
|
162
|
-
if timer.should_delete():
|
163
|
-
expired_timers.append(timer.uid)
|
164
|
-
for uid in expired_timers:
|
165
|
-
self.timers[uid]._release_id()
|
166
|
-
del self.timers[uid]
|
167
|
-
|
168
|
-
def __init__(self):
|
169
|
-
self.registers = {"global": TimeManager.TimerRegister()}
|
170
|
-
|
171
|
-
def add_register(self, name, active=True):
|
172
|
-
if name not in self.registers:
|
173
|
-
self.registers[name] = TimeManager.TimerRegister(active)
|
174
|
-
|
175
|
-
def remove_register(self, name):
|
176
|
-
if name not in self.registers:
|
177
|
-
return
|
178
|
-
|
179
|
-
self.registers.pop(name)
|
180
|
-
|
181
|
-
|
182
|
-
def add_timer(self, timer, register="global") -> bool:
|
183
|
-
if register in self.registers:
|
184
|
-
self.registers[register].add_timer(timer)
|
185
|
-
return True
|
186
|
-
print(f"Register '{register}' does not exist.")
|
187
|
-
return False
|
188
|
-
|
189
|
-
def get_active_registers(self) -> list[TimerRegister]:
|
190
|
-
return [t for t in self.registers.values() if t.active]
|
191
|
-
|
192
|
-
def update(self, dt):
|
193
|
-
for register in self.registers.values():
|
194
|
-
if register.active:
|
195
|
-
register.update(dt)
|
196
|
-
|
197
|
-
def activate_register(self, name, active=True):
|
198
|
-
if name in self.registers:
|
199
|
-
self.registers[name].active = active
|
200
|
-
else:
|
201
|
-
print(f"Register '{name}' does not exist.")
|
202
|
-
|
203
|
-
def deactivate_register(self, name):
|
204
|
-
self.activate_register(name, active=False)
|
205
|
-
|
206
|
-
def __str__(self)->str:
|
207
|
-
res = ""
|
208
|
-
for name,reg in self.registers.items():
|
209
|
-
if not reg.timers:continue
|
210
|
-
res +=name+"\n"
|
211
|
-
for t in reg.timers.values():
|
212
|
-
res +="\t"+str(t)+"\n"
|
213
|
-
return res
|
1
|
+
import batFramework as bf
|
2
|
+
from typing import Callable, Union, Self,Any
|
3
|
+
|
4
|
+
class Timer:
|
5
|
+
_count: int = 0
|
6
|
+
_available_ids: set[int] = set()
|
7
|
+
|
8
|
+
def __init__(self, duration: float, end_callback: Callable[[], Any], loop: int = 0, register: str = "global") -> None:
|
9
|
+
if Timer._available_ids:
|
10
|
+
self.uid = Timer._available_ids.pop()
|
11
|
+
else:
|
12
|
+
self.uid = Timer._count
|
13
|
+
Timer._count += 1
|
14
|
+
|
15
|
+
self.register = register
|
16
|
+
self.duration: float = duration
|
17
|
+
self.end_callback = end_callback
|
18
|
+
|
19
|
+
self.elapsed_time: float = 0
|
20
|
+
self.is_over: bool = False
|
21
|
+
self.loop: int = loop # Number of loops (-1 for infinite)
|
22
|
+
self.is_paused: bool = False
|
23
|
+
self.do_delete: bool = False
|
24
|
+
self.is_stopped: bool = True
|
25
|
+
|
26
|
+
def __bool__(self) -> bool:
|
27
|
+
return self.elapsed_time != -1 and self.is_over
|
28
|
+
|
29
|
+
def __str__(self) -> str:
|
30
|
+
loop_info = "infinite" if self.loop == -1 else f"{self.loop} loops left"
|
31
|
+
return f"Timer ({self.uid}) {self.elapsed_time}/{self.duration} | {loop_info} {'(D) ' if self.do_delete else ''}"
|
32
|
+
|
33
|
+
def stop(self) -> Self:
|
34
|
+
"""
|
35
|
+
Cancels all progression and stops the timer.
|
36
|
+
Does not mark it for deletion and does not call the end_callback.
|
37
|
+
Prevents automatic restart if looping.
|
38
|
+
"""
|
39
|
+
self.is_stopped = True
|
40
|
+
self.is_paused = False
|
41
|
+
self.is_over = False
|
42
|
+
self.elapsed_time = 0
|
43
|
+
return self
|
44
|
+
|
45
|
+
def start(self, force: bool = False) -> Self:
|
46
|
+
"""
|
47
|
+
Starts the timer only if not already started (unless force is used, which resets it).
|
48
|
+
"""
|
49
|
+
if self.elapsed_time > 0 and not force:
|
50
|
+
return self
|
51
|
+
if not bf.TimeManager().add_timer(self, self.register):
|
52
|
+
return self
|
53
|
+
self.elapsed_time = 0
|
54
|
+
self.is_paused = False
|
55
|
+
self.is_over = False
|
56
|
+
self.is_stopped = False
|
57
|
+
return self
|
58
|
+
|
59
|
+
def pause(self) -> Self:
|
60
|
+
"""
|
61
|
+
Momentarily stops the timer until resume is called.
|
62
|
+
"""
|
63
|
+
self.is_paused = True
|
64
|
+
return self
|
65
|
+
|
66
|
+
def resume(self) -> Self:
|
67
|
+
"""
|
68
|
+
Resumes from a paused state.
|
69
|
+
"""
|
70
|
+
self.is_paused = False
|
71
|
+
return self
|
72
|
+
|
73
|
+
def delete(self) -> Self:
|
74
|
+
"""
|
75
|
+
Marks the timer for deletion.
|
76
|
+
"""
|
77
|
+
self.do_delete = True
|
78
|
+
return self
|
79
|
+
|
80
|
+
def has_started(self) -> bool:
|
81
|
+
"""
|
82
|
+
Returns True if the timer has started.
|
83
|
+
"""
|
84
|
+
return not self.is_stopped
|
85
|
+
|
86
|
+
def get_progression(self) -> float:
|
87
|
+
"""
|
88
|
+
Returns the progression of the timer (0 to 1) as a float.
|
89
|
+
"""
|
90
|
+
if self.is_stopped:
|
91
|
+
return 0
|
92
|
+
if self.elapsed_time >= self.duration:
|
93
|
+
return 1
|
94
|
+
return self.elapsed_time / self.duration
|
95
|
+
|
96
|
+
def update(self, dt) -> None:
|
97
|
+
if self.is_stopped or self.is_paused or self.is_over:
|
98
|
+
return
|
99
|
+
self.elapsed_time += dt
|
100
|
+
if self.get_progression() == 1:
|
101
|
+
self.end()
|
102
|
+
|
103
|
+
def end(self):
|
104
|
+
"""
|
105
|
+
Ends the timer progression (calls the end_callback function).
|
106
|
+
Is called automatically once the timer is over.
|
107
|
+
Will not mark the timer for deletion.
|
108
|
+
If it is looping, it will restart the timer **only if it wasn't stopped**.
|
109
|
+
"""
|
110
|
+
self.is_over = True
|
111
|
+
if self.end_callback:
|
112
|
+
self.end_callback()
|
113
|
+
|
114
|
+
# Handle looping
|
115
|
+
if self.loop == -1: # Infinite looping
|
116
|
+
self.elapsed_time = 0
|
117
|
+
self.start()
|
118
|
+
return
|
119
|
+
elif self.loop > 0: # Decrease loop count and restart
|
120
|
+
self.loop -= 1
|
121
|
+
self.elapsed_time = 0
|
122
|
+
self.start()
|
123
|
+
return
|
124
|
+
|
125
|
+
# Stop the timer if no loops are left
|
126
|
+
self.is_stopped = True
|
127
|
+
|
128
|
+
def should_delete(self) -> bool:
|
129
|
+
"""
|
130
|
+
Method that returns if the timer is to be deleted.
|
131
|
+
Required for timer management.
|
132
|
+
"""
|
133
|
+
return self.is_over or self.do_delete
|
134
|
+
|
135
|
+
def _release_id(self):
|
136
|
+
Timer._available_ids.add(self.uid)
|
137
|
+
|
138
|
+
class SceneTimer(Timer):
|
139
|
+
"""
|
140
|
+
A timer that is only updated while the given scene is active (being updated)
|
141
|
+
"""
|
142
|
+
def __init__(self, duration: float | int, end_callback, loop: int = 0, scene_name:str = "global") -> None:
|
143
|
+
super().__init__(duration, end_callback, loop, scene_name)
|
144
|
+
|
145
|
+
class TimeManager(metaclass=bf.Singleton):
|
146
|
+
class TimerRegister:
|
147
|
+
def __init__(self, active=True):
|
148
|
+
self.active = active
|
149
|
+
self.timers: dict[int | str, Timer] = {}
|
150
|
+
|
151
|
+
def __iter__(self):
|
152
|
+
return iter(self.timers.values())
|
153
|
+
|
154
|
+
def add_timer(self, timer: Timer):
|
155
|
+
self.timers[timer.uid] = timer
|
156
|
+
|
157
|
+
def update(self, dt):
|
158
|
+
expired_timers = []
|
159
|
+
for timer in list(self.timers.values()):
|
160
|
+
if not timer.is_paused:
|
161
|
+
timer.update(dt)
|
162
|
+
if timer.should_delete():
|
163
|
+
expired_timers.append(timer.uid)
|
164
|
+
for uid in expired_timers:
|
165
|
+
self.timers[uid]._release_id()
|
166
|
+
del self.timers[uid]
|
167
|
+
|
168
|
+
def __init__(self):
|
169
|
+
self.registers = {"global": TimeManager.TimerRegister()}
|
170
|
+
|
171
|
+
def add_register(self, name, active=True):
|
172
|
+
if name not in self.registers:
|
173
|
+
self.registers[name] = TimeManager.TimerRegister(active)
|
174
|
+
|
175
|
+
def remove_register(self, name):
|
176
|
+
if name not in self.registers:
|
177
|
+
return
|
178
|
+
|
179
|
+
self.registers.pop(name)
|
180
|
+
|
181
|
+
|
182
|
+
def add_timer(self, timer, register="global") -> bool:
|
183
|
+
if register in self.registers:
|
184
|
+
self.registers[register].add_timer(timer)
|
185
|
+
return True
|
186
|
+
print(f"Register '{register}' does not exist.")
|
187
|
+
return False
|
188
|
+
|
189
|
+
def get_active_registers(self) -> list[TimerRegister]:
|
190
|
+
return [t for t in self.registers.values() if t.active]
|
191
|
+
|
192
|
+
def update(self, dt):
|
193
|
+
for register in self.registers.values():
|
194
|
+
if register.active:
|
195
|
+
register.update(dt)
|
196
|
+
|
197
|
+
def activate_register(self, name, active=True):
|
198
|
+
if name in self.registers:
|
199
|
+
self.registers[name].active = active
|
200
|
+
else:
|
201
|
+
print(f"Register '{name}' does not exist.")
|
202
|
+
|
203
|
+
def deactivate_register(self, name):
|
204
|
+
self.activate_register(name, active=False)
|
205
|
+
|
206
|
+
def __str__(self)->str:
|
207
|
+
res = ""
|
208
|
+
for name,reg in self.registers.items():
|
209
|
+
if not reg.timers:continue
|
210
|
+
res +=name+"\n"
|
211
|
+
for t in reg.timers.values():
|
212
|
+
res +="\t"+str(t)+"\n"
|
213
|
+
return res
|