batframework 1.0.8a3__py3-none-any.whl → 1.0.8a4__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 +1 -1
- batFramework/animatedSprite.py +49 -55
- batFramework/audioManager.py +2 -2
- batFramework/cutscene.py +5 -2
- batFramework/cutsceneBlocks.py +3 -5
- batFramework/dynamicEntity.py +10 -4
- batFramework/gui/clickableWidget.py +4 -2
- batFramework/gui/constraints/constraints.py +158 -18
- batFramework/gui/interactiveWidget.py +1 -1
- batFramework/gui/label.py +24 -20
- batFramework/gui/root.py +7 -1
- batFramework/gui/shape.py +21 -15
- batFramework/gui/slider.py +17 -33
- batFramework/gui/textInput.py +1 -1
- batFramework/gui/toggle.py +22 -34
- batFramework/gui/widget.py +3 -3
- batFramework/particle.py +4 -4
- batFramework/resourceManager.py +18 -2
- batFramework/scene.py +49 -19
- batFramework/sceneManager.py +9 -14
- batFramework/scrollingSprite.py +7 -8
- batFramework/time.py +32 -27
- batFramework/transition.py +23 -10
- batFramework/utils.py +63 -2
- {batframework-1.0.8a3.dist-info → batframework-1.0.8a4.dist-info}/METADATA +1 -1
- {batframework-1.0.8a3.dist-info → batframework-1.0.8a4.dist-info}/RECORD +29 -29
- {batframework-1.0.8a3.dist-info → batframework-1.0.8a4.dist-info}/LICENCE +0 -0
- {batframework-1.0.8a3.dist-info → batframework-1.0.8a4.dist-info}/WHEEL +0 -0
- {batframework-1.0.8a3.dist-info → batframework-1.0.8a4.dist-info}/top_level.txt +0 -0
batFramework/gui/label.py
CHANGED
@@ -101,6 +101,12 @@ class Label(Shape):
|
|
101
101
|
self.dirty_surface = True
|
102
102
|
return self
|
103
103
|
|
104
|
+
def set_text_outline_mask_size(self,size:tuple[int,int])->Self:
|
105
|
+
old_size = self._text_outline_mask.get_size()
|
106
|
+
m = [[self._text_outline_mask.get_at((x,y)) for x in range(min(old_size[0],size[0]))] for y in range(min(old_size[1],size[1]))]
|
107
|
+
self._text_outline_mask = pygame.Mask(size, fill=True)
|
108
|
+
self.set_text_outline_matrix(m)
|
109
|
+
|
104
110
|
def set_text_outline_matrix(self, matrix: list[list[0 | 1]]) -> Self:
|
105
111
|
if matrix is None:
|
106
112
|
matrix = [[0 for _ in range(3)] for _ in range(3)]
|
@@ -125,12 +131,12 @@ class Label(Shape):
|
|
125
131
|
self.dirty_surface = True
|
126
132
|
return self
|
127
133
|
|
128
|
-
def set_alignment(self, alignment: bf.alignment) ->
|
134
|
+
def set_alignment(self, alignment: bf.alignment) -> Self:
|
129
135
|
self.alignment = alignment
|
130
136
|
self.dirty_surface = True
|
131
137
|
return self
|
132
138
|
|
133
|
-
def set_auto_wraplength(self, val: bool) ->
|
139
|
+
def set_auto_wraplength(self, val: bool) -> Self:
|
134
140
|
self.auto_wraplength = val
|
135
141
|
if self.autoresize_h or self.autoresize_w:
|
136
142
|
self.dirty_shape = True
|
@@ -186,18 +192,7 @@ class Label(Shape):
|
|
186
192
|
if not (self.autoresize_w or self.autoresize_h):
|
187
193
|
return self.rect.size
|
188
194
|
if not self.text_rect:
|
189
|
-
|
190
|
-
"font_name": self.font_object.name,
|
191
|
-
"text": self.text,
|
192
|
-
"antialias": False,
|
193
|
-
"color": "white",
|
194
|
-
"bgcolor": "black", # if (self.has_alpha_color() or self.draw_mode == bf.drawMode.TEXTURED) else self.color,
|
195
|
-
"wraplength": (
|
196
|
-
int(self.get_padded_width()) if self.auto_wraplength else 0
|
197
|
-
),
|
198
|
-
}
|
199
|
-
|
200
|
-
self.text_rect.size = self._render_font(params).get_size()
|
195
|
+
self.text_rect.size = self._get_text_rect_required_size()
|
201
196
|
res = self.inflate_rect_by_padding((0, 0, *self.text_rect.size)).size
|
202
197
|
# return res
|
203
198
|
return res[0] if self.autoresize_w else self.rect.w, (
|
@@ -242,9 +237,7 @@ class Label(Shape):
|
|
242
237
|
surf = self.font_object.render(**params)
|
243
238
|
|
244
239
|
return surf
|
245
|
-
|
246
|
-
def _build_layout(self) -> None:
|
247
|
-
|
240
|
+
def _get_text_rect_required_size(self):
|
248
241
|
params = {
|
249
242
|
"font_name": self.font_object.name,
|
250
243
|
"text": self.text,
|
@@ -254,7 +247,13 @@ class Label(Shape):
|
|
254
247
|
"wraplength": int(self.get_padded_width()) if self.auto_wraplength else 0,
|
255
248
|
}
|
256
249
|
|
257
|
-
|
250
|
+
size = self._render_font(params).get_size()
|
251
|
+
s = self._text_outline_mask.get_size()
|
252
|
+
return size[0] + s[0]//2, size[1] + s[1]//2
|
253
|
+
def _build_layout(self) -> None:
|
254
|
+
|
255
|
+
self.text_rect.size = self._get_text_rect_required_size()
|
256
|
+
|
258
257
|
if self.autoresize_h or self.autoresize_w:
|
259
258
|
target_rect = self.inflate_rect_by_padding((0, 0, *self.text_rect.size))
|
260
259
|
if not self.autoresize_w:
|
@@ -268,6 +267,10 @@ class Label(Shape):
|
|
268
267
|
padded = self.get_padded_rect().move(-self.rect.x, -self.rect.y)
|
269
268
|
self.align_text(self.text_rect, padded, self.alignment)
|
270
269
|
|
270
|
+
def _get_outline_offset(self)->tuple[int,int]:
|
271
|
+
mask_size = self._text_outline_mask.get_size()
|
272
|
+
return mask_size[0]//2,mask_size[1]//2
|
273
|
+
|
271
274
|
def _paint_text(self) -> None:
|
272
275
|
if self.font_object is None:
|
273
276
|
print(f"No font for widget with text : '{self}' :(")
|
@@ -291,15 +294,16 @@ class Label(Shape):
|
|
291
294
|
)
|
292
295
|
|
293
296
|
l = []
|
297
|
+
outline_offset = self._get_outline_offset()
|
294
298
|
if self.show_text_outline:
|
295
299
|
l.append(
|
296
300
|
(
|
297
301
|
self.text_outline_surface,
|
298
|
-
self.text_rect.move(
|
302
|
+
self.text_rect.move(0, self.relief - self.get_relief()),
|
299
303
|
)
|
300
304
|
)
|
301
305
|
l.append(
|
302
|
-
(self.text_surface, self.text_rect.move(0, self.relief - self.get_relief()))
|
306
|
+
(self.text_surface, self.text_rect.move(outline_offset[0], self.relief - self.get_relief() + outline_offset[1]))
|
303
307
|
)
|
304
308
|
self.surface.fblits(l)
|
305
309
|
|
batFramework/gui/root.py
CHANGED
@@ -95,6 +95,8 @@ class Root(InteractiveWidget):
|
|
95
95
|
return self
|
96
96
|
|
97
97
|
def do_handle_event(self, event):
|
98
|
+
if not self.parent_scene.get_sharedVar("player_has_control"):
|
99
|
+
return
|
98
100
|
if self.focused:
|
99
101
|
if event.type == pygame.KEYDOWN:
|
100
102
|
if self.focused.on_key_down(event.key):
|
@@ -128,6 +130,8 @@ class Root(InteractiveWidget):
|
|
128
130
|
|
129
131
|
def update(self, dt: float) -> None:
|
130
132
|
super().update(dt)
|
133
|
+
if not self.parent_scene.get_sharedVar("player_has_control",True):
|
134
|
+
return
|
131
135
|
old = self.hovered
|
132
136
|
transposed = self.drawing_camera.screen_to_world(pygame.mouse.get_pos())
|
133
137
|
self.hovered = self.top_at(*transposed) if self.top_at(*transposed) else None
|
@@ -139,8 +143,10 @@ class Root(InteractiveWidget):
|
|
139
143
|
if self.hovered and isinstance(self.hovered, InteractiveWidget):
|
140
144
|
self.hovered.on_enter()
|
141
145
|
|
142
|
-
def draw(self, camera: bf.Camera) ->
|
146
|
+
def draw(self, camera: bf.Camera) -> None:
|
143
147
|
super().draw(camera)
|
148
|
+
if not self.parent_scene.get_sharedVar("player_has_control"):
|
149
|
+
return
|
144
150
|
if (
|
145
151
|
self.parent_scene
|
146
152
|
and self.parent_scene.active
|
batFramework/gui/shape.py
CHANGED
@@ -10,7 +10,7 @@ class Shape(Widget):
|
|
10
10
|
super().__init__(size=size, convert_alpha=True)
|
11
11
|
self.color = (0, 0, 0, 0)
|
12
12
|
self.border_radius: list[int] = [0]
|
13
|
-
self.
|
13
|
+
self.outline_width: int = 0
|
14
14
|
self.outline_color: tuple[int, int, int] | str = (0, 0, 0, 255)
|
15
15
|
self.texture_surface = None
|
16
16
|
self.texture_subsize = (0, 0)
|
@@ -97,7 +97,7 @@ class Shape(Widget):
|
|
97
97
|
return self
|
98
98
|
|
99
99
|
def set_outline_width(self, value: int) -> Self:
|
100
|
-
self.
|
100
|
+
self.outline_width = value
|
101
101
|
self.dirty_surface = True
|
102
102
|
return self
|
103
103
|
|
@@ -107,11 +107,11 @@ class Shape(Widget):
|
|
107
107
|
return
|
108
108
|
if self.border_radius == [0]:
|
109
109
|
self._paint_shape()
|
110
|
-
if self.
|
110
|
+
if self.outline_width:
|
111
111
|
self._paint_outline()
|
112
112
|
else:
|
113
113
|
self._paint_rounded_shape()
|
114
|
-
if self.
|
114
|
+
if self.outline_width:
|
115
115
|
self._paint_rounded_outline()
|
116
116
|
|
117
117
|
def _paint_textured(self) -> None:
|
@@ -223,17 +223,23 @@ class Shape(Widget):
|
|
223
223
|
return pygame.FRect(0, self.rect.h - self.relief, self.rect.w, self.relief)
|
224
224
|
|
225
225
|
def _paint_shape(self) -> None:
|
226
|
-
self.
|
227
|
-
|
228
|
-
|
226
|
+
if self.relief!=0:
|
227
|
+
self.surface.fill((0, 0, 0, 0))
|
228
|
+
self.surface.fill(self.shadow_color, self._get_base_rect())
|
229
|
+
self.surface.fill(self.color, self._get_elevated_rect())
|
230
|
+
else:
|
231
|
+
self.surface.fill(self.color, self._get_elevated_rect())
|
229
232
|
|
230
233
|
def _paint_rounded_shape(self) -> None:
|
231
234
|
self.surface.fill((0, 0, 0, 0))
|
232
235
|
e = self._get_elevated_rect()
|
233
|
-
|
234
|
-
|
235
|
-
|
236
|
-
|
236
|
+
if self.relief != 0:
|
237
|
+
b = e.copy()
|
238
|
+
b.bottom = self.rect.h
|
239
|
+
pygame.draw.rect(self.surface, self.shadow_color, b, 0, *self.border_radius)
|
240
|
+
pygame.draw.rect(self.surface, self.color, e, 0, *self.border_radius)
|
241
|
+
else:
|
242
|
+
pygame.draw.rect(self.surface, self.color, e, 0, *self.border_radius)
|
237
243
|
|
238
244
|
def _paint_outline(self) -> None:
|
239
245
|
if self.relief:
|
@@ -246,7 +252,7 @@ class Shape(Widget):
|
|
246
252
|
self.rect.w,
|
247
253
|
self.rect.h - self.relief,
|
248
254
|
),
|
249
|
-
self.
|
255
|
+
self.outline_width,
|
250
256
|
)
|
251
257
|
pygame.draw.rect(
|
252
258
|
self.surface,
|
@@ -257,7 +263,7 @@ class Shape(Widget):
|
|
257
263
|
self.rect.w,
|
258
264
|
self.rect.h - (self.relief - self.get_relief()),
|
259
265
|
),
|
260
|
-
self.
|
266
|
+
self.outline_width,
|
261
267
|
)
|
262
268
|
|
263
269
|
def _paint_rounded_outline(self) -> None:
|
@@ -269,7 +275,7 @@ class Shape(Widget):
|
|
269
275
|
self.surface,
|
270
276
|
self.outline_color,
|
271
277
|
e,
|
272
|
-
self.
|
278
|
+
self.outline_width,
|
273
279
|
*self.border_radius,
|
274
280
|
)
|
275
281
|
if self.relief:
|
@@ -277,6 +283,6 @@ class Shape(Widget):
|
|
277
283
|
self.surface,
|
278
284
|
self.outline_color,
|
279
285
|
b,
|
280
|
-
self.
|
286
|
+
self.outline_width,
|
281
287
|
*self.border_radius,
|
282
288
|
)
|
batFramework/gui/slider.py
CHANGED
@@ -11,6 +11,7 @@ class SliderHandle(Indicator, DraggableWidget):
|
|
11
11
|
def __init__(self):
|
12
12
|
super().__init__()
|
13
13
|
self.set_color(bf.color.CLOUD_SHADE)
|
14
|
+
self.old_key_repeat: tuple = (0, 0)
|
14
15
|
|
15
16
|
def __str__(self) -> str:
|
16
17
|
return "SliderHandle"
|
@@ -68,8 +69,6 @@ class Slider(Button):
|
|
68
69
|
self.add(self.meter, self.handle)
|
69
70
|
self.meter.set_debug_color(bf.color.RED)
|
70
71
|
self.set_value(default_value, True)
|
71
|
-
# print(self.handle.rect)
|
72
|
-
# self.handle.set_visible(False)
|
73
72
|
|
74
73
|
def set_visible(self, value: bool) -> Self:
|
75
74
|
self.handle.set_visible(value)
|
@@ -84,20 +83,19 @@ class Slider(Button):
|
|
84
83
|
self.gap = value
|
85
84
|
return self
|
86
85
|
|
86
|
+
def do_on_get_focus(self) -> None:
|
87
|
+
super().do_on_get_focus()
|
88
|
+
self.old_key_repeat = pygame.key.get_repeat()
|
89
|
+
pygame.key.set_repeat(200, 50)
|
90
|
+
|
91
|
+
def do_on_lose_focus(self) -> None:
|
92
|
+
super().do_on_lose_focus()
|
93
|
+
pygame.key.set_repeat(*self.old_key_repeat)
|
94
|
+
|
87
95
|
def get_min_required_size(self) -> tuple[float, float]:
|
88
96
|
gap = self.gap if self.text else 0
|
89
97
|
if not self.text_rect:
|
90
|
-
|
91
|
-
"font_name": self.font_object.name,
|
92
|
-
"text": self.text,
|
93
|
-
"antialias": False,
|
94
|
-
"color": "white",
|
95
|
-
"bgcolor": "black", # if (self.has_alpha_color() or self.draw_mode == bf.drawMode.TEXTURED) else self.color,
|
96
|
-
"wraplength": (
|
97
|
-
int(self.get_padded_width()) if self.auto_wraplength else 0
|
98
|
-
),
|
99
|
-
}
|
100
|
-
self.text_rect.size = self._render_font(params).get_size()
|
98
|
+
self.text_rect.size = self._get_text_rect_required_size()
|
101
99
|
w, h = self.text_rect.size
|
102
100
|
return self.inflate_rect_by_padding((0, 0, w + gap + self.meter.rect.w, h)).size
|
103
101
|
|
@@ -134,10 +132,8 @@ class Slider(Button):
|
|
134
132
|
def do_on_key_down(self, key):
|
135
133
|
if key == pygame.K_RIGHT:
|
136
134
|
self.set_value(self.meter.get_value() + self.meter.step)
|
137
|
-
bf.AudioManager().play_sound(self.click_down_sound)
|
138
135
|
elif key == pygame.K_LEFT:
|
139
136
|
self.set_value(self.meter.get_value() - self.meter.step)
|
140
|
-
bf.AudioManager().play_sound(self.click_down_sound)
|
141
137
|
|
142
138
|
def do_on_click_down(self, button) -> None:
|
143
139
|
if button == 1:
|
@@ -151,8 +147,6 @@ class Slider(Button):
|
|
151
147
|
value_range = self.meter.get_range()
|
152
148
|
value = round(value / self.meter.step) * self.meter.step
|
153
149
|
position_ratio = (value - self.meter.min_value) / value_range
|
154
|
-
# print(self.handle.rect)
|
155
|
-
# print(rect.left + (self.handle.rect.w/2) + position_ratio * (rect.width - self.handle.rect.w),self.handle.rect.w,self.rect.right)
|
156
150
|
return (
|
157
151
|
rect.left
|
158
152
|
+ (self.handle.rect.w / 2)
|
@@ -178,16 +172,7 @@ class Slider(Button):
|
|
178
172
|
|
179
173
|
gap = self.gap if self.text else 0
|
180
174
|
|
181
|
-
|
182
|
-
"font_name": self.font_object.name,
|
183
|
-
"text": self.text,
|
184
|
-
"antialias": False,
|
185
|
-
"color": "white",
|
186
|
-
"bgcolor": "black", # if (self.has_alpha_color() or self.draw_mode == bf.drawMode.TEXTURED) else self.color,
|
187
|
-
"wraplength": int(self.get_padded_width()) if self.auto_wraplength else 0,
|
188
|
-
}
|
189
|
-
|
190
|
-
self.text_rect.size = self._render_font(params).get_size()
|
175
|
+
self.text_rect.size = self._get_text_rect_required_size()
|
191
176
|
|
192
177
|
meter_size = [self.text_rect.h * 10, self.font_object.point_size]
|
193
178
|
if not self.autoresize_w:
|
@@ -209,20 +194,19 @@ class Slider(Button):
|
|
209
194
|
return
|
210
195
|
|
211
196
|
# ------------------------------------ size is ok
|
212
|
-
|
197
|
+
padded_rect = self.get_padded_rect()
|
198
|
+
padded_relative = padded_rect.move(-self.rect.x, -self.rect.y)
|
213
199
|
|
214
|
-
self.meter.set_size_if_autoresize(meter_size)
|
215
|
-
handle_size = 2 * [self.meter.get_padded_height()]
|
216
200
|
|
217
|
-
self.
|
201
|
+
self.meter.set_size_if_autoresize(meter_size)
|
218
202
|
|
219
|
-
self.align_text(tmp_rect,
|
203
|
+
self.align_text(tmp_rect, padded_relative, self.alignment)
|
220
204
|
self.text_rect.midleft = tmp_rect.midleft
|
221
205
|
|
222
206
|
if self.text:
|
223
207
|
match self.spacing:
|
224
208
|
case bf.spacing.MAX:
|
225
|
-
gap =
|
209
|
+
gap = padded_relative.right - self.text_rect.right - self.meter.rect.w
|
226
210
|
case bf.spacing.MIN:
|
227
211
|
gap = 0
|
228
212
|
|
batFramework/gui/textInput.py
CHANGED
@@ -42,10 +42,10 @@ class TextInput(Label, InteractiveWidget):
|
|
42
42
|
pygame.mouse.set_cursor(bf.const.DEFAULT_CURSOR)
|
43
43
|
|
44
44
|
def do_on_get_focus(self):
|
45
|
-
self.old_key_repeat = pygame.key.get_repeat()
|
46
45
|
self.cursor_timer.resume()
|
47
46
|
self._cursor_toggle(True)
|
48
47
|
self.set_cursor_position(len(self.get_text()))
|
48
|
+
self.old_key_repeat = pygame.key.get_repeat()
|
49
49
|
pygame.key.set_repeat(200, 50)
|
50
50
|
|
51
51
|
def do_on_lose_focus(self):
|
batFramework/gui/toggle.py
CHANGED
@@ -13,6 +13,7 @@ class Toggle(Button):
|
|
13
13
|
self.spacing: bf.spacing = bf.spacing.MANUAL
|
14
14
|
super().__init__(text, callback)
|
15
15
|
self.add(self.indicator)
|
16
|
+
self.set_clip_children(False)
|
16
17
|
# self.set_gap(int(max(4, self.get_padded_width() / 3)))
|
17
18
|
|
18
19
|
def set_visible(self, value: bool) -> Self:
|
@@ -53,24 +54,16 @@ class Toggle(Button):
|
|
53
54
|
|
54
55
|
def get_min_required_size(self) -> tuple[float, float]:
|
55
56
|
if not self.text_rect:
|
56
|
-
|
57
|
-
"font_name": self.font_object.name,
|
58
|
-
"text": self.text,
|
59
|
-
"antialias": False,
|
60
|
-
"color": "white",
|
61
|
-
"bgcolor": "black", # if (self.has_alpha_color() or self.draw_mode == bf.drawMode.TEXTURED) else self.color,
|
62
|
-
"wraplength": (
|
63
|
-
int(self.get_padded_width()) if self.auto_wraplength else 0
|
64
|
-
),
|
65
|
-
}
|
66
|
-
self.text_rect.size = self._render_font(params).get_size()
|
57
|
+
self.text_rect.size = self._get_text_rect_required_size()
|
67
58
|
w, h = self.text_rect.size
|
59
|
+
outline_offset = self._get_outline_offset()
|
60
|
+
|
68
61
|
size = (
|
69
62
|
max(
|
70
63
|
self.indicator.rect.w,
|
71
64
|
w + self.font_object.point_size + (self.gap if self.text else 0),
|
72
65
|
),
|
73
|
-
self.text_rect.h,
|
66
|
+
self.text_rect.h + outline_offset[1],
|
74
67
|
)
|
75
68
|
return self.inflate_rect_by_padding((0, 0, *size)).size
|
76
69
|
|
@@ -78,24 +71,19 @@ class Toggle(Button):
|
|
78
71
|
|
79
72
|
gap = self.gap if self.text else 0
|
80
73
|
|
81
|
-
|
82
|
-
"font_name": self.font_object.name,
|
83
|
-
"text": self.text,
|
84
|
-
"antialias": False,
|
85
|
-
"color": "white",
|
86
|
-
"bgcolor": "black", # if (self.has_alpha_color() or self.draw_mode == bf.drawMode.TEXTURED) else self.color,
|
87
|
-
"wraplength": int(self.get_padded_width()) if self.auto_wraplength else 0,
|
88
|
-
}
|
89
|
-
self.text_rect.size = self._render_font(params).get_size()
|
90
|
-
|
91
|
-
indicator_height = self.font_object.point_size
|
74
|
+
self.text_rect.size = self._get_text_rect_required_size()
|
92
75
|
|
93
|
-
self.
|
76
|
+
outline_offset = self._get_outline_offset()
|
94
77
|
|
95
78
|
tmp_rect = pygame.FRect(
|
96
|
-
0, 0,
|
79
|
+
0, 0,
|
80
|
+
self.text_rect.w + gap + self.indicator.rect.w + outline_offset[0],
|
81
|
+
self.text_rect.h + outline_offset[1]
|
97
82
|
)
|
98
83
|
|
84
|
+
point_size = min(tmp_rect.h, self.font_object.point_size)
|
85
|
+
self.indicator.set_size_if_autoresize((point_size,point_size))
|
86
|
+
|
99
87
|
if self.autoresize_h or self.autoresize_w:
|
100
88
|
target_rect = self.inflate_rect_by_padding(tmp_rect)
|
101
89
|
if not self.autoresize_w:
|
@@ -107,20 +95,20 @@ class Toggle(Button):
|
|
107
95
|
self.build()
|
108
96
|
return
|
109
97
|
|
110
|
-
padded = self.get_padded_rect().move(-self.rect.x, -self.rect.y)
|
111
98
|
|
112
|
-
|
99
|
+
padded_rect = self.get_padded_rect()
|
100
|
+
padded_relative = padded_rect.move(-self.rect.x, -self.rect.y)
|
101
|
+
|
102
|
+
|
103
|
+
|
104
|
+
self.align_text(tmp_rect, padded_relative, self.alignment)
|
113
105
|
self.text_rect.midleft = tmp_rect.midleft
|
114
106
|
if self.text:
|
115
107
|
match self.spacing:
|
116
108
|
case bf.spacing.MAX:
|
117
|
-
gap =
|
109
|
+
gap = padded_relative.right - self.text_rect.right - self.indicator.rect.w
|
118
110
|
case bf.spacing.MIN:
|
119
111
|
gap = 0
|
120
112
|
|
121
|
-
self.indicator.
|
122
|
-
|
123
|
-
self.rect.x + gap,
|
124
|
-
self.rect.y + (self.text_rect.h / 2) - self.indicator.rect.h / 2,
|
125
|
-
).topright
|
126
|
-
)
|
113
|
+
self.indicator.rect.x = self.rect.x + self.text_rect.right + gap
|
114
|
+
self.indicator.rect.centery = self.rect.y + padded_relative.top + self.text_rect.h // 2
|
batFramework/gui/widget.py
CHANGED
@@ -188,7 +188,7 @@ class Widget(bf.Entity, metaclass=WidgetMeta):
|
|
188
188
|
seen = set()
|
189
189
|
result = []
|
190
190
|
for c in self.constraints:
|
191
|
-
if c
|
191
|
+
if not any(c == o for o in seen):
|
192
192
|
result.append(c)
|
193
193
|
seen.add(c.name)
|
194
194
|
self.constraints = result
|
@@ -271,9 +271,7 @@ class Widget(bf.Entity, metaclass=WidgetMeta):
|
|
271
271
|
size = list(size)
|
272
272
|
size[0] = size[0] if self.autoresize_w else None
|
273
273
|
size[1] = size[1] if self.autoresize_h else None
|
274
|
-
|
275
274
|
self.set_size(size)
|
276
|
-
|
277
275
|
return self
|
278
276
|
|
279
277
|
def set_size(self, size: tuple) -> Self:
|
@@ -305,10 +303,12 @@ class Widget(bf.Entity, metaclass=WidgetMeta):
|
|
305
303
|
def build(self) -> None:
|
306
304
|
new_size = tuple(map(int, self.rect.size))
|
307
305
|
if self.surface.get_size() != new_size:
|
306
|
+
old_alpha = self.surface.get_alpha()
|
308
307
|
new_size = [max(0, i) for i in new_size]
|
309
308
|
self.surface = pygame.Surface(new_size, self.surface_flags)
|
310
309
|
if self.convert_alpha:
|
311
310
|
self.surface = self.surface.convert_alpha()
|
311
|
+
self.surface.set_alpha(old_alpha)
|
312
312
|
|
313
313
|
def paint(self) -> None:
|
314
314
|
self.surface.fill((0, 0, 0, 0))
|
batFramework/particle.py
CHANGED
@@ -36,8 +36,9 @@ class BasicParticle(TimedParticle):
|
|
36
36
|
**kwargs,
|
37
37
|
):
|
38
38
|
super().__init__(duration)
|
39
|
-
self.rect = pygame.FRect(
|
40
|
-
self.
|
39
|
+
self.rect = pygame.FRect(0,0, *size)
|
40
|
+
self.rect.center = start_pos
|
41
|
+
self.surface = pygame.Surface(size)
|
41
42
|
self.velocity = Vector2(start_vel)
|
42
43
|
if color:
|
43
44
|
self.surface.fill(color)
|
@@ -57,7 +58,6 @@ class BasicParticle(TimedParticle):
|
|
57
58
|
|
58
59
|
class DirectionalParticle(BasicParticle):
|
59
60
|
def start(self):
|
60
|
-
self.surface = self.surface.convert_alpha()
|
61
61
|
self.original_surface = self.surface.copy()
|
62
62
|
|
63
63
|
def update_surface(self):
|
@@ -96,6 +96,6 @@ class ParticleGenerator(bf.Entity):
|
|
96
96
|
|
97
97
|
def draw(self, camera) -> bool:
|
98
98
|
camera.surface.fblits(
|
99
|
-
[(p.surface, camera.world_to_screen(p.rect)
|
99
|
+
[(p.surface, camera.world_to_screen(p.rect)) for p in self.particles]
|
100
100
|
)
|
101
101
|
return len(self.particles)
|
batFramework/resourceManager.py
CHANGED
@@ -3,6 +3,7 @@ import os
|
|
3
3
|
import pygame
|
4
4
|
import sys
|
5
5
|
import json
|
6
|
+
from typing import Any
|
6
7
|
from .utils import Singleton
|
7
8
|
|
8
9
|
if getattr(sys, "frozen", False):
|
@@ -16,6 +17,7 @@ else:
|
|
16
17
|
|
17
18
|
class ResourceManager(metaclass=Singleton):
|
18
19
|
def __init__(self):
|
20
|
+
self.shared_variables: dict[str,Any] = {}
|
19
21
|
self.convert_image_cache = {}
|
20
22
|
self.convert_alpha_image_cache = {}
|
21
23
|
self.sound_cache = {}
|
@@ -33,11 +35,11 @@ class ResourceManager(metaclass=Singleton):
|
|
33
35
|
# print(f"Loaded image : '{file_path}'")
|
34
36
|
|
35
37
|
elif file.lower().endswith((".mp3", ".wav")):
|
36
|
-
bf.AudioManager().load_sound(file.
|
38
|
+
bf.AudioManager().load_sound(file.split(".")[0], file_path)
|
37
39
|
# print(f"Loaded sound : '{file_path}'")
|
38
40
|
|
39
41
|
elif file.lower().endswith((".ttf", ".otf")):
|
40
|
-
bf.FontManager().load_font(file_path, file.
|
42
|
+
bf.FontManager().load_font(file_path, file.split(".")[0])
|
41
43
|
# print(f"Loaded font : '{file_path}'")
|
42
44
|
|
43
45
|
print(f"Loaded resources in directory : '{path}'")
|
@@ -82,3 +84,17 @@ class ResourceManager(metaclass=Singleton):
|
|
82
84
|
return True
|
83
85
|
except FileNotFoundError:
|
84
86
|
return False
|
87
|
+
|
88
|
+
|
89
|
+
def set_sharedVar(self, name, value) -> bool:
|
90
|
+
"""
|
91
|
+
Set a shared variable of any type. This will be accessible (read/write) from any scene
|
92
|
+
"""
|
93
|
+
self.shared_variables[name] = value
|
94
|
+
return True
|
95
|
+
|
96
|
+
def get_sharedVar(self, name, error_value=None):
|
97
|
+
"""
|
98
|
+
Get a shared variable
|
99
|
+
"""
|
100
|
+
return self.shared_variables.get(name, error_value)
|