crystalwindow 3.8.3__tar.gz → 3.8.4__tar.gz

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 (43) hide show
  1. {crystalwindow-3.8.3 → crystalwindow-3.8.4}/LICENSE +1 -1
  2. {crystalwindow-3.8.3/crystalwindow.egg-info → crystalwindow-3.8.4}/PKG-INFO +1 -1
  3. {crystalwindow-3.8.3 → crystalwindow-3.8.4}/crystalwindow/__init__.py +4 -0
  4. {crystalwindow-3.8.3 → crystalwindow-3.8.4}/crystalwindow/assets.py +41 -0
  5. {crystalwindow-3.8.3 → crystalwindow-3.8.4}/crystalwindow/sprites.py +1 -1
  6. {crystalwindow-3.8.3 → crystalwindow-3.8.4/crystalwindow.egg-info}/PKG-INFO +1 -1
  7. {crystalwindow-3.8.3 → crystalwindow-3.8.4}/setup.py +1 -1
  8. {crystalwindow-3.8.3 → crystalwindow-3.8.4}/MANIFEST.in +0 -0
  9. {crystalwindow-3.8.3 → crystalwindow-3.8.4}/README.md +0 -0
  10. {crystalwindow-3.8.3 → crystalwindow-3.8.4}/crystalwindow/FileHelper.py +0 -0
  11. {crystalwindow-3.8.3 → crystalwindow-3.8.4}/crystalwindow/Icons/default_icon.png +0 -0
  12. {crystalwindow-3.8.3 → crystalwindow-3.8.4}/crystalwindow/animation.py +0 -0
  13. {crystalwindow-3.8.3 → crystalwindow-3.8.4}/crystalwindow/camera.py +0 -0
  14. {crystalwindow-3.8.3 → crystalwindow-3.8.4}/crystalwindow/clock.py +0 -0
  15. {crystalwindow-3.8.3 → crystalwindow-3.8.4}/crystalwindow/collision.py +0 -0
  16. {crystalwindow-3.8.3 → crystalwindow-3.8.4}/crystalwindow/crystal3d.py +0 -0
  17. {crystalwindow-3.8.3 → crystalwindow-3.8.4}/crystalwindow/docs/getting_started.md +0 -0
  18. {crystalwindow-3.8.3 → crystalwindow-3.8.4}/crystalwindow/docs/index.md +0 -0
  19. {crystalwindow-3.8.3 → crystalwindow-3.8.4}/crystalwindow/draw_helpers.py +0 -0
  20. {crystalwindow-3.8.3 → crystalwindow-3.8.4}/crystalwindow/draw_rects.py +0 -0
  21. {crystalwindow-3.8.3 → crystalwindow-3.8.4}/crystalwindow/draw_text_helper.py +0 -0
  22. {crystalwindow-3.8.3 → crystalwindow-3.8.4}/crystalwindow/draw_tool.py +0 -0
  23. {crystalwindow-3.8.3 → crystalwindow-3.8.4}/crystalwindow/fun_helpers.py +0 -0
  24. {crystalwindow-3.8.3 → crystalwindow-3.8.4}/crystalwindow/gametests/3dsquare.py +0 -0
  25. {crystalwindow-3.8.3 → crystalwindow-3.8.4}/crystalwindow/gametests/__init__.py +0 -0
  26. {crystalwindow-3.8.3 → crystalwindow-3.8.4}/crystalwindow/gametests/__main__.py +0 -0
  27. {crystalwindow-3.8.3 → crystalwindow-3.8.4}/crystalwindow/gametests/gravitytest.py +0 -0
  28. {crystalwindow-3.8.3 → crystalwindow-3.8.4}/crystalwindow/gametests/guitesting.py +0 -0
  29. {crystalwindow-3.8.3 → crystalwindow-3.8.4}/crystalwindow/gametests/sandbox.py +0 -0
  30. {crystalwindow-3.8.3 → crystalwindow-3.8.4}/crystalwindow/gametests/squaremove.py +0 -0
  31. {crystalwindow-3.8.3 → crystalwindow-3.8.4}/crystalwindow/gametests/windowtesting.py +0 -0
  32. {crystalwindow-3.8.3 → crystalwindow-3.8.4}/crystalwindow/gravity.py +0 -0
  33. {crystalwindow-3.8.3 → crystalwindow-3.8.4}/crystalwindow/gui.py +0 -0
  34. {crystalwindow-3.8.3 → crystalwindow-3.8.4}/crystalwindow/gui_ext.py +0 -0
  35. {crystalwindow-3.8.3 → crystalwindow-3.8.4}/crystalwindow/math.py +0 -0
  36. {crystalwindow-3.8.3 → crystalwindow-3.8.4}/crystalwindow/player.py +0 -0
  37. {crystalwindow-3.8.3 → crystalwindow-3.8.4}/crystalwindow/tilemap.py +0 -0
  38. {crystalwindow-3.8.3 → crystalwindow-3.8.4}/crystalwindow/ver_warner.py +0 -0
  39. {crystalwindow-3.8.3 → crystalwindow-3.8.4}/crystalwindow/window.py +0 -0
  40. {crystalwindow-3.8.3 → crystalwindow-3.8.4}/crystalwindow.egg-info/SOURCES.txt +0 -0
  41. {crystalwindow-3.8.3 → crystalwindow-3.8.4}/crystalwindow.egg-info/dependency_links.txt +0 -0
  42. {crystalwindow-3.8.3 → crystalwindow-3.8.4}/crystalwindow.egg-info/top_level.txt +0 -0
  43. {crystalwindow-3.8.3 → crystalwindow-3.8.4}/setup.cfg +0 -0
@@ -1,6 +1,6 @@
1
1
  MIT License
2
2
 
3
- Copyright (c) 2025 C
3
+ Copyright (c) 2025 CrystalBallyHereXD
4
4
 
5
5
  Permission is hereby granted, free of charge, to any person obtaining a copy
6
6
  of this software and associated documentation files (the "Software"), to deal
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: crystalwindow
3
- Version: 3.8.3
3
+ Version: 3.8.4
4
4
  Summary: A Tkinter powered window + GUI toolkit made by Crystal (MEEEEEE)! Easier apps, smoother UI and all-in-one helpers!
5
5
  Home-page: https://pypi.org/project/crystalwindow/
6
6
  Author: CrystalBallyHereXD
@@ -20,6 +20,8 @@ from .assets import (
20
20
  flip_image,
21
21
  flip_horizontal,
22
22
  flip_vertical,
23
+ LoopAnim,
24
+ loop_image,
23
25
  )
24
26
  from .animation import Animation
25
27
 
@@ -60,6 +62,8 @@ __all__ = [
60
62
  "flip_horizontal",
61
63
  "flip_vertical",
62
64
  "Animation",
65
+ "LoopAnim",
66
+ "loop_image",
63
67
 
64
68
  # --- Collision ---
65
69
  "check_collision", "resolve_collision",
@@ -118,6 +118,47 @@ def flip_horizontal(img):
118
118
  def flip_vertical(img):
119
119
  return flip_image(img, flip_v=True)
120
120
 
121
+ # --------------------------------------------------------
122
+ # LOOPING ANIMAITONS/IMAGES
123
+ # --------------------------------------------------------
124
+ class LoopAnim:
125
+ def __init__(self, frames, speed=0.2):
126
+ self.frames = frames
127
+ self.i = 0
128
+ self.speed = speed
129
+
130
+ def next(self):
131
+ """Return next frame automatically looping."""
132
+ if not self.frames:
133
+ return None
134
+
135
+ self.i += self.speed
136
+ if self.i >= len(self.frames):
137
+ self.i = 0
138
+
139
+ return self.frames[int(self.i)]
140
+
141
+
142
+ def loop_image(*imgs, speed=0.2):
143
+ """
144
+ Usage:
145
+ anim = loop_image(img1, img2, img3)
146
+ anim = loop_image(load_image("p1.png"), load_image("p2.png"))
147
+
148
+ Returns a LoopAnim object.
149
+ """
150
+ frames = [x for x in imgs if x is not None]
151
+
152
+ # If nothing was passed → fallback
153
+ if not frames:
154
+ print("⚠️ loop_image() got no frames.")
155
+ fb = load_image("fallback.png") if os.path.exists("fallback.png") else None
156
+ if fb is None:
157
+ return LoopAnim([None], speed=speed)
158
+ return LoopAnim([fb], speed=speed)
159
+
160
+ return LoopAnim(frames, speed=speed)
161
+
121
162
 
122
163
  # --------------------------------------------------------
123
164
  # FOLDER LOADING
@@ -90,7 +90,7 @@ class Sprite:
90
90
  self.x + getattr(self, "width", 0) > other.x and
91
91
  self.y < other.y + getattr(other, "height", 0) and
92
92
  self.y + getattr(self, "height", 0) > other.y
93
- ), # returns tuple for consistency
93
+ ) # returns tuple for consistency
94
94
 
95
95
  def set_image(self, img):
96
96
  """Update sprite's image at runtime (like flipping)"""
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: crystalwindow
3
- Version: 3.8.3
3
+ Version: 3.8.4
4
4
  Summary: A Tkinter powered window + GUI toolkit made by Crystal (MEEEEEE)! Easier apps, smoother UI and all-in-one helpers!
5
5
  Home-page: https://pypi.org/project/crystalwindow/
6
6
  Author: CrystalBallyHereXD
@@ -7,7 +7,7 @@ with open("README.md", encoding="utf-8") as f:
7
7
 
8
8
  setup(
9
9
  name="crystalwindow",
10
- version="3.8.3", # Force metadata refresh
10
+ version="3.8.4", # Force metadata refresh
11
11
  packages=find_packages(include=["crystalwindow", "crystalwindow.*"]),
12
12
 
13
13
  include_package_data=True, # include package_data files
File without changes
File without changes
File without changes