batframework 1.0.9a10__py3-none-any.whl → 1.0.9a12__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.
Files changed (73) hide show
  1. batFramework/__init__.py +2 -0
  2. batFramework/action.py +280 -279
  3. batFramework/actionContainer.py +105 -82
  4. batFramework/animatedSprite.py +80 -58
  5. batFramework/animation.py +91 -77
  6. batFramework/audioManager.py +156 -131
  7. batFramework/baseScene.py +249 -240
  8. batFramework/camera.py +245 -317
  9. batFramework/constants.py +57 -51
  10. batFramework/cutscene.py +239 -253
  11. batFramework/cutsceneManager.py +34 -34
  12. batFramework/drawable.py +107 -77
  13. batFramework/dynamicEntity.py +30 -30
  14. batFramework/easingController.py +58 -58
  15. batFramework/entity.py +130 -130
  16. batFramework/enums.py +171 -135
  17. batFramework/fontManager.py +65 -65
  18. batFramework/gui/__init__.py +28 -25
  19. batFramework/gui/animatedLabel.py +90 -89
  20. batFramework/gui/button.py +17 -17
  21. batFramework/gui/clickableWidget.py +244 -245
  22. batFramework/gui/collapseContainer.py +98 -0
  23. batFramework/gui/constraints/__init__.py +1 -1
  24. batFramework/gui/constraints/constraints.py +1066 -980
  25. batFramework/gui/container.py +220 -201
  26. batFramework/gui/debugger.py +140 -130
  27. batFramework/gui/draggableWidget.py +63 -44
  28. batFramework/gui/image.py +61 -58
  29. batFramework/gui/indicator.py +116 -113
  30. batFramework/gui/interactiveWidget.py +243 -239
  31. batFramework/gui/label.py +147 -344
  32. batFramework/gui/layout.py +442 -426
  33. batFramework/gui/meter.py +155 -96
  34. batFramework/gui/radioButton.py +43 -35
  35. batFramework/gui/root.py +228 -228
  36. batFramework/gui/scrollingContainer.py +282 -0
  37. batFramework/gui/selector.py +232 -250
  38. batFramework/gui/shape.py +286 -276
  39. batFramework/gui/slider.py +353 -397
  40. batFramework/gui/style.py +10 -10
  41. batFramework/gui/styleManager.py +49 -54
  42. batFramework/gui/syncedVar.py +43 -49
  43. batFramework/gui/textInput.py +331 -306
  44. batFramework/gui/textWidget.py +308 -0
  45. batFramework/gui/toggle.py +140 -128
  46. batFramework/gui/tooltip.py +35 -30
  47. batFramework/gui/widget.py +546 -521
  48. batFramework/manager.py +131 -134
  49. batFramework/particle.py +118 -118
  50. batFramework/propertyEaser.py +79 -79
  51. batFramework/renderGroup.py +34 -34
  52. batFramework/resourceManager.py +130 -130
  53. batFramework/scene.py +31 -31
  54. batFramework/sceneLayer.py +134 -138
  55. batFramework/sceneManager.py +200 -197
  56. batFramework/scrollingSprite.py +115 -115
  57. batFramework/sprite.py +46 -51
  58. batFramework/stateMachine.py +49 -54
  59. batFramework/templates/__init__.py +2 -1
  60. batFramework/templates/character.py +15 -0
  61. batFramework/templates/controller.py +158 -97
  62. batFramework/templates/stateMachine.py +39 -0
  63. batFramework/tileset.py +46 -46
  64. batFramework/timeManager.py +213 -213
  65. batFramework/transition.py +162 -162
  66. batFramework/triggerZone.py +22 -22
  67. batFramework/utils.py +306 -306
  68. {batframework-1.0.9a10.dist-info → batframework-1.0.9a12.dist-info}/LICENSE +20 -20
  69. {batframework-1.0.9a10.dist-info → batframework-1.0.9a12.dist-info}/METADATA +24 -17
  70. batframework-1.0.9a12.dist-info/RECORD +72 -0
  71. batframework-1.0.9a10.dist-info/RECORD +0 -67
  72. {batframework-1.0.9a10.dist-info → batframework-1.0.9a12.dist-info}/WHEEL +0 -0
  73. {batframework-1.0.9a10.dist-info → batframework-1.0.9a12.dist-info}/top_level.txt +0 -0
@@ -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