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,130 +1,140 @@
1
- from .label import Label
2
- from typing import Self,Callable,Any
3
- import batFramework as bf
4
- import pygame
5
- import sys
6
-
7
-
8
- def convert_to_int(*args):
9
- return [int(arg) for arg in args]
10
-
11
-
12
- class Debugger(Label):
13
- def __init__(self) -> None:
14
- super().__init__("")
15
- self.static_data: dict[str,Any] = {}
16
- self.dynamic_data: dict[str,Callable[[],str]] = {}
17
- self.refresh_rate = 10
18
- self.refresh_counter: float = 0
19
- self.add_tags("debugger")
20
- self.set_visible(False)
21
-
22
- def set_refresh_rate(self, value: int) -> Self:
23
- self.refresh_rate = value
24
- return self
25
-
26
- def add_static(self, key: str, data):
27
- self.static_data[key] = str(data)
28
- self.update_text()
29
-
30
- def add_dynamic(self, key: str, func:Callable[[],str]) -> None:
31
- self.dynamic_data[key] = func
32
- self.update_text()
33
-
34
- def remove_static(self, key:str) -> bool:
35
- try:
36
- self.static_data.pop(key)
37
- return True
38
- except KeyError:
39
- return False
40
-
41
- def remove_dynamic(self, key:str) -> bool:
42
- try:
43
- self.dynamic_data.pop(key)
44
- return True
45
- except KeyError:
46
- return False
47
-
48
- def set_parent_scene(self, scene) -> Self:
49
- super().set_parent_scene(scene)
50
- self.set_render_order(sys.maxsize-100)
51
- self.update_text()
52
- return self
53
-
54
- def set_text(self, text: str) -> Self:
55
- return super().set_text(text)
56
-
57
- def update_text(self) -> None:
58
- if not self.parent_scene:
59
- return
60
-
61
- d = "\n".join(
62
- key + ":" + data if key != "" else data
63
- for key, data in self.static_data.items()
64
- )
65
-
66
- d2 = "\n".join(
67
- key + ":" + str(data()) if key != "" else str(data())
68
- for key, data in self.dynamic_data.items()
69
- )
70
-
71
- self.set_text("\n".join((d, d2)).strip())
72
-
73
- def update(self, dt: float) -> None:
74
- if not self.parent_scene:
75
- return
76
-
77
- if bf.ResourceManager().get_sharedVar("debug_mode") != bf.debugMode.DEBUGGER:
78
- self.set_visible(False)
79
- return
80
-
81
- self.set_visible(True)
82
- self.refresh_counter = self.refresh_counter + (dt * 60)
83
-
84
- if self.refresh_counter > self.refresh_rate:
85
- self.refresh_counter = 0
86
- self.update_text()
87
-
88
-
89
- def __str__(self) -> str:
90
- return "Debugger"
91
-
92
- def top_at(self, x, y):
93
- return None
94
-
95
-
96
- class FPSDebugger(Debugger):
97
- def __init__(self):
98
- super().__init__()
99
-
100
- def do_when_added(self):
101
- if not self.parent_scene or not self.parent_scene.manager:
102
- print("Debugger could not link to the manager")
103
- return
104
- manager_link = self.parent_scene.manager
105
- self.add_dynamic("FPS", lambda: str(round(manager_link.get_fps())))
106
-
107
-
108
- class BasicDebugger(FPSDebugger):
109
- def do_when_added(self):
110
- if not self.parent_scene or not self.parent_scene.manager:
111
- print("Debugger could not link to the manager")
112
- return
113
- self.add_dynamic(
114
- "Resolution", lambda: "x".join(str(i) for i in bf.const.RESOLUTION)
115
- )
116
- super().do_when_added()
117
- self.add_dynamic("Mouse", pygame.mouse.get_pos)
118
-
119
- if not hasattr(self.parent_scene,"root"):
120
- print("Debugger couldn't find 'root' widget in parent scene")
121
- return
122
-
123
- parent_scene = self.parent_scene
124
-
125
- self.add_dynamic(
126
- "Hover",
127
- lambda: (
128
- str(parent_scene.root.hovered) if parent_scene.root.hovered else None
129
- ),
130
- )
1
+ from .label import Label
2
+ from typing import Self,Callable,Any
3
+ import batFramework as bf
4
+ import pygame
5
+ import sys
6
+
7
+
8
+ def convert_to_int(*args):
9
+ return [int(arg) for arg in args]
10
+
11
+
12
+ class Debugger(Label):
13
+ def __init__(self) -> None:
14
+ super().__init__("")
15
+ self.root_link = None
16
+ self.static_data: dict[str,Any] = {}
17
+ self.dynamic_data: dict[str,Callable[[],str]] = {}
18
+ self.refresh_interval :float = .01
19
+ self.refresh_counter: float = 0
20
+ self.add_tags("debugger")
21
+ self.set_visible(False)
22
+
23
+
24
+ def set_parent(self, parent):
25
+ super().set_parent(parent)
26
+ self.root_link = self.get_root()
27
+
28
+ def set_refresh_rate(self, value: float) -> Self:
29
+ """
30
+ seet refresh interval, time in seconds between each refresh of the debugger
31
+ """
32
+ self.refresh_interval = value
33
+ self.refresh_counter = 0
34
+ return self
35
+
36
+ def add_static(self, key: str, data):
37
+ self.static_data[key] = str(data)
38
+ self.update_text()
39
+
40
+ def add_dynamic(self, key: str, func:Callable[[],str]) -> None:
41
+ self.dynamic_data[key] = func
42
+ self.update_text()
43
+
44
+ def remove_static(self, key:str) -> bool:
45
+ try:
46
+ self.static_data.pop(key)
47
+ return True
48
+ except KeyError:
49
+ return False
50
+
51
+ def remove_dynamic(self, key:str) -> bool:
52
+ try:
53
+ self.dynamic_data.pop(key)
54
+ return True
55
+ except KeyError:
56
+ return False
57
+
58
+ def set_parent_scene(self, scene) -> Self:
59
+ super().set_parent_scene(scene)
60
+ self.set_render_order(sys.maxsize-100)
61
+ self.update_text()
62
+ return self
63
+
64
+ def set_text(self, text: str) -> Self:
65
+ return super().set_text(text)
66
+
67
+ def update_text(self) -> None:
68
+ if not self.parent_scene:
69
+ return
70
+
71
+ d = "\n".join(
72
+ key + ":" + data if key != "" else data
73
+ for key, data in self.static_data.items()
74
+ )
75
+
76
+ d2 = "\n".join(
77
+ key + ":" + str(data()) if key != "" else str(data())
78
+ for key, data in self.dynamic_data.items()
79
+ )
80
+
81
+ self.set_text("\n".join((d, d2)).strip())
82
+
83
+ def update(self, dt: float) -> None:
84
+ if not self.parent_scene:
85
+ return
86
+
87
+ if bf.ResourceManager().get_sharedVar("debug_mode") != bf.debugMode.DEBUGGER:
88
+ self.set_visible(False)
89
+ return
90
+
91
+ self.set_visible(True)
92
+ self.refresh_counter = self.refresh_counter + dt
93
+
94
+ if self.refresh_counter > self.refresh_interval:
95
+ self.refresh_counter = 0
96
+ self.update_text()
97
+
98
+
99
+ def __str__(self) -> str:
100
+ return "Debugger"
101
+
102
+ def top_at(self, x, y):
103
+ return None
104
+
105
+
106
+ class FPSDebugger(Debugger):
107
+ def __init__(self):
108
+ super().__init__()
109
+
110
+ def do_when_added(self):
111
+ if not self.parent_scene or not self.parent_scene.manager:
112
+ print("Debugger could not link to the manager")
113
+ return
114
+ manager_link = self.parent_scene.manager
115
+ self.add_dynamic("FPS", lambda: str(round(manager_link.get_fps())))
116
+
117
+
118
+ class BasicDebugger(FPSDebugger):
119
+
120
+ def do_when_added(self):
121
+ if not self.parent_scene or not self.parent_scene.manager:
122
+ print("Debugger could not link to the manager")
123
+ return
124
+ self.add_dynamic(
125
+ "Resolution", lambda: "x".join(str(i) for i in bf.const.RESOLUTION)
126
+ )
127
+ super().do_when_added()
128
+ self.add_dynamic("Mouse", pygame.mouse.get_pos)
129
+
130
+ if self.root_link is None:
131
+ return
132
+
133
+
134
+ self.add_dynamic(
135
+ "Hover",
136
+ lambda: (
137
+ str(self.root_link.hovered) if self.root_link.hovered else None
138
+ ),
139
+ )
140
+
@@ -1,44 +1,63 @@
1
- from .interactiveWidget import InteractiveWidget
2
- import batFramework as bf
3
- import pygame
4
-
5
-
6
- class DraggableWidget(InteractiveWidget):
7
- def __init__(self, *args, **kwargs) -> None:
8
- self.drag_start = None
9
- self.offset = None
10
- self.click_mask = [True,False,False,False,False]
11
- self.is_dragged : bool = False # the widget is following the mouse AND the mouse is in the widget
12
- self.is_dragged_outside : bool = False # the widget is following the mouse BUT the mouse is NOT in the widget
13
- super().__init__(*args, **kwargs)
14
-
15
- def set_click_mask(self,b1=0,b2=0,b3=0,b4=0,b5=0):
16
- self.click_mask = [b1,b2,b3,b4,b5]
17
-
18
- def on_click_down(self, button):
19
- super().on_click_down(button)
20
- return any(i==j and i== True for i,j in zip(self.is_clicked_down,self.click_mask))
21
-
22
- def do_on_drag(
23
- self, drag_start_pos: tuple[float, float], drag_end_pos: tuple[float, float]
24
- ) -> None:
25
- new_pos = drag_end_pos[0] - self.offset[0], drag_end_pos[1] - self.offset[1]
26
- if self.rect.topleft != new_pos:
27
- self.set_position(*new_pos)
28
-
29
- def update(self, dt: float):
30
- self.is_dragged_outside = any(i==j and i== True for i,j in zip(pygame.mouse.get_pressed(5),self.click_mask))
31
- self.is_dragged = any(i==j and i== True for i,j in zip(self.is_clicked_down,self.click_mask))
32
-
33
- if self.is_dragged and self.is_dragged_outside:
34
- x, y = self.parent_layer.camera.screen_to_world(pygame.mouse.get_pos())
35
- if self.drag_start == None:
36
- self.offset = x - self.rect.x, y - self.rect.y
37
- self.drag_start = x, y
38
- else:
39
- self.do_on_drag(self.drag_start, (x, y))
40
- else:
41
- self.drag_start = None
42
- self.offset = None
43
- self.is_clicked_down = [False]*5
44
- super().update(dt)
1
+ from .interactiveWidget import InteractiveWidget
2
+ import batFramework as bf
3
+ import pygame
4
+
5
+
6
+ class DraggableWidget(InteractiveWidget):
7
+ def __init__(self, *args, **kwargs) -> None:
8
+ self.drag_start = None
9
+ self.offset = None
10
+ self.click_mask = [True,False,False,False,False]
11
+ self.is_dragged : bool = False # the widget is following the mouse AND the mouse is in the widget
12
+ self.is_dragged_outside : bool = False # the widget is following the mouse BUT the mouse is NOT in the widget
13
+ super().__init__(*args, **kwargs)
14
+
15
+ def set_click_mask(self,b1=0,b2=0,b3=0,b4=0,b5=0):
16
+ self.click_mask = [b1,b2,b3,b4,b5]
17
+
18
+
19
+ def do_on_drag(
20
+ self, drag_start_pos: tuple[float, float], drag_end_pos: tuple[float, float]
21
+ ) -> None:
22
+
23
+ new_pos = drag_end_pos[0] - self.offset[0], drag_end_pos[1] - self.offset[1]
24
+ if self.rect.topleft != new_pos:
25
+
26
+ self.set_position(*new_pos)
27
+
28
+ def on_click_down(self, button, event=None):
29
+ if button < 1 or button > 5 :
30
+ return
31
+ self.is_clicked_down[button-1] = True
32
+ self.is_dragged = any(i==j and i== True for i,j in zip(self.is_clicked_down,self.click_mask))
33
+ if self.is_dragged:
34
+ event.consumed = True
35
+ self.do_on_click_down(button,event)
36
+
37
+ def on_click_up(self, button, event=None):
38
+ if button < 1 or button > 5 :
39
+ return
40
+ self.is_clicked_down[button-1] = False
41
+ self.is_dragged = any(i==j and i== True for i,j in zip(self.is_clicked_down,self.click_mask))
42
+ self.do_on_click_up(button,event)
43
+
44
+ def update(self, dt: float):
45
+ super().update(dt)
46
+ self.is_dragged_outside = any(i==j and i== True for i,j in zip(pygame.mouse.get_pressed(5),self.click_mask))
47
+
48
+
49
+ if self.is_dragged and self.is_dragged_outside:
50
+ x, y = self.parent_layer.camera.get_mouse_pos()
51
+ if self.drag_start == None:
52
+ self.offset = x - self.rect.x, y - self.rect.y
53
+ self.drag_start = x, y
54
+ else:
55
+ self.do_on_drag(self.drag_start, (x, y))
56
+
57
+ else:
58
+ self.drag_start = None
59
+ self.offset = None
60
+ self.is_clicked_down = [False]*5
61
+
62
+ if not self.is_dragged_outside:
63
+ self.is_dragged = False
batFramework/gui/image.py CHANGED
@@ -1,58 +1,61 @@
1
- import batFramework as bf
2
- from .widget import Widget
3
- from .shape import Shape
4
- import pygame
5
- from typing import Self
6
-
7
-
8
- class Image(Shape):
9
- def __init__(
10
- self,
11
- path: str = None,
12
- convert_alpha=True,
13
- ):
14
- self.original_surface = None
15
- super().__init__(convert_alpha=convert_alpha)
16
- if path is not None:
17
- self.from_path(path)
18
-
19
- def __str__(self) -> str:
20
- return "Image"
21
-
22
- def paint(self) -> None:
23
- super().paint()
24
- if self.original_surface is None:
25
- return
26
- padded = self.get_inner_rect().move(-self.rect.x,-self.rect.y)
27
- target_size = padded.size
28
- if self.original_surface.get_size() != target_size:
29
- self.surface.blit(pygame.transform.scale(self.original_surface, target_size), padded.topleft)
30
- else:
31
- self.surface.blit(self.original_surface, padded.topleft)
32
-
33
- def build(self) -> None:
34
- if self.original_surface is not None:
35
- self.set_size(
36
- self.expand_rect_with_padding((0,0,*self.original_surface.get_size())).size
37
- )
38
- super().build()
39
-
40
-
41
- def from_path(self, path: str) -> Self:
42
- tmp = bf.ResourceManager().get_image(path, self.convert_alpha)
43
- if tmp is None:
44
- return self
45
- self.original_surface = tmp
46
- size = self.original_surface.get_size()
47
- self.set_size(size)
48
- self.dirty_surface = True
49
- return self
50
-
51
- def from_surface(self, surface: pygame.Surface) -> Self:
52
- if surface is None:
53
- return self
54
- self.original_surface = surface
55
- size = self.original_surface.get_size()
56
- self.set_size(size)
57
- self.dirty_surface = True
58
- return self
1
+ import batFramework as bf
2
+ from .widget import Widget
3
+ from .shape import Shape
4
+ import pygame
5
+ from typing import Self
6
+
7
+
8
+ class Image(Shape):
9
+ def __init__(
10
+ self,
11
+ path: str = None,
12
+ convert_alpha=True,
13
+ ):
14
+ self.original_surface = None
15
+ super().__init__(convert_alpha=convert_alpha)
16
+ if path is not None:
17
+ self.from_path(path)
18
+
19
+ def __str__(self) -> str:
20
+ return "Image"
21
+
22
+ def paint(self) -> None:
23
+ super().paint()
24
+ if self.original_surface is None:
25
+ return
26
+ padded = self.get_inner_rect().move(-self.rect.x,-self.rect.y)
27
+ target_size = padded.size
28
+ if self.original_surface.get_size() != target_size:
29
+ self.surface.blit(pygame.transform.scale(self.original_surface, target_size), padded.topleft)
30
+ else:
31
+ self.surface.blit(self.original_surface, padded.topleft)
32
+
33
+ def build(self) -> None:
34
+ if self.original_surface is not None:
35
+ self.set_size(
36
+ self.expand_rect_with_padding((0,0,*self.original_surface.get_size())).size
37
+ )
38
+ super().build()
39
+
40
+
41
+ def from_path(self, path: str) -> Self:
42
+ tmp = bf.ResourceManager().get_image(path, self.convert_alpha)
43
+ if tmp is None:
44
+ return self
45
+ self.original_surface = tmp
46
+ # size = self.original_surface.get_size()
47
+ # self.set_size(size)
48
+ self.dirty_shape = True
49
+ self.dirty_surface = True
50
+ return self
51
+
52
+ def from_surface(self, surface: pygame.Surface) -> Self:
53
+ if surface is None:
54
+ return self
55
+ self.original_surface = surface
56
+ # size = self.original_surface.get_size()
57
+ # self.set_size(size)
58
+ self.dirty_shape = True
59
+
60
+ self.dirty_surface = True
61
+ return self