Vertex2D 1.0.0__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.
@@ -0,0 +1,25 @@
1
+ Metadata-Version: 2.4
2
+ Name: Vertex2D
3
+ Version: 1.0.0
4
+ Summary: Простой движок-api с использованием видеокарты
5
+ Author-email: Teme20xx <jgh71346@gmail.com>
6
+ Project-URL: Homepage, https://t.me/+JV288wfV0SMxNzky
7
+ Requires-Python: >=3.7
8
+ Description-Content-Type: text/markdown
9
+ Requires-Dist: pygame-ce>=2.3.0
10
+
11
+
12
+ Это простой фреймворк (или движок) для создания графических приложений (игр) на рендере видеокарты.
13
+ установка: pip install Vertex
14
+
15
+ пример максимальн базового кода (версия 1.0.0):
16
+ import Vertex # импортируем библиотеку
17
+ vertex = Vertex.Build("базовое окно", 600, 400) #создаем окно
18
+ def Main():
19
+ Api = vertex.GetFell() #получаем доступ к библиотеке (его Api)
20
+ Api.NewCanvas((75, 75, 75, 255)) #цвет фона
21
+ Api.AllDraw() #теперь рисует все на окно
22
+ vertex.NewScene("Main", main.run) #создаем сцену
23
+ vertex.SetScene("Main") #устанавливаем сцену
24
+ vertex.run() #запускаем
25
+ vertex.Destroy() #уничтожаем
@@ -0,0 +1,15 @@
1
+
2
+ Это простой фреймворк (или движок) для создания графических приложений (игр) на рендере видеокарты.
3
+ установка: pip install Vertex
4
+
5
+ пример максимальн базового кода (версия 1.0.0):
6
+ import Vertex # импортируем библиотеку
7
+ vertex = Vertex.Build("базовое окно", 600, 400) #создаем окно
8
+ def Main():
9
+ Api = vertex.GetFell() #получаем доступ к библиотеке (его Api)
10
+ Api.NewCanvas((75, 75, 75, 255)) #цвет фона
11
+ Api.AllDraw() #теперь рисует все на окно
12
+ vertex.NewScene("Main", main.run) #создаем сцену
13
+ vertex.SetScene("Main") #устанавливаем сцену
14
+ vertex.run() #запускаем
15
+ vertex.Destroy() #уничтожаем
@@ -0,0 +1,931 @@
1
+ import inspect
2
+ import pygame as pg
3
+ import pygame._sdl2
4
+ from types import SimpleNamespace
5
+ import os
6
+ import sys
7
+ import traceback
8
+ from datetime import datetime
9
+ import platform
10
+ import time
11
+ pg.init()
12
+ pg.display.init()
13
+
14
+ VERSION = "1.0.0"
15
+
16
+ class Build:
17
+ MGL = SimpleNamespace()
18
+ sell = SimpleNamespace()
19
+ fell = SimpleNamespace()
20
+ fell.Data = fell.data = SimpleNamespace()
21
+ sell.data_Texture = {}
22
+ sell.data_Music = {}
23
+ sell.Cache = {}
24
+ sell.Events = {}
25
+
26
+ def __init__(self, name="My Game", left=800, up=600, ot_pos=True, SafeMode=True, logs=True, DeveLoperMode=True, vsync=True,
27
+ black_window=True, size_window_standart=(800, 600), size_window_how=(800, 600)):
28
+ global VERSION
29
+ if logs: print(f"\033[90mInitializing Engine {VERSION}\033[0m")
30
+ if getattr(sys, 'frozen', False): self.sell.PATH = sys._MEIPASS
31
+ else: self.sell.PATH = os.path.dirname(os.path.abspath(__file__))
32
+ self.sell.PATH = os.path.dirname(self.sell.PATH.rstrip(os.sep))
33
+
34
+ self.sell.screen = pg._sdl2.video.Window(name, size=(left, up), opengl=1)
35
+ self.sell.left, self.sell.up = left, up
36
+ self.sell.render = pg._sdl2.video.Renderer(self.sell.screen, index=-1, accelerated=1, vsync=vsync)
37
+ self.sell.render_texture = pg._sdl2.video.Texture(self.sell.render, size=(left, up), target=1)
38
+ self.sell.war = True
39
+ self.sell.ot_pos = ot_pos
40
+ def Event_List_def(events):
41
+ res = {
42
+ "quit": False,
43
+ "mouse down left": False,
44
+ "mouse down right": False,
45
+ "mouse down center": False,
46
+ "mouse up left": False,
47
+ "mouse up right": False,
48
+ "mouse up center": False,
49
+ "touch down": False,
50
+ "touch up": False,
51
+ "scroll +": False,
52
+ "scroll -": False,
53
+ "mouse down additional 1": False,
54
+ "mouse down additional 2": False,
55
+ "mouse up additional 1": False,
56
+ "mouse up additional 2": False
57
+ }
58
+
59
+ for ev in events:
60
+ if ev.type == pg.QUIT:
61
+ res["quit"] = True
62
+ elif ev.type == pg.MOUSEBUTTONDOWN:
63
+ if ev.button == pg.BUTTON_LEFT: res["mouse down left"] = True
64
+ elif ev.button == pg.BUTTON_RIGHT: res["mouse down right"] = True
65
+ elif ev.button == pg.BUTTON_MIDDLE: res["mouse down center"] = True
66
+ elif ev.button == pg.BUTTON_X1: res["mouse down additional 1"] = True
67
+ elif ev.button == pg.BUTTON_X2: res["mouse down additional 2"] = True
68
+ elif ev.type == pg.MOUSEBUTTONUP:
69
+ if ev.button == pg.BUTTON_LEFT: res["mouse up left"] = True
70
+ elif ev.button == pg.BUTTON_RIGHT: res["mouse up right"] = True
71
+ elif ev.button == pg.BUTTON_MIDDLE: res["mouse up center"] = True
72
+ elif ev.button == pg.BUTTON_X1: res["mouse up additional 1"] = True
73
+ elif ev.button == pg.BUTTON_X2: res["mouse up additional 2"] = True
74
+ elif ev.type == pg.FINGERDOWN:
75
+ res["touch down"] = True
76
+ elif ev.type == pg.FINGERUP:
77
+ res["touch up"] = True
78
+ elif ev.type == pg.MOUSEWHEEL:
79
+ if ev.y < 0: res["scroll +"] = True
80
+ elif ev.y > 0: res["scroll -"] = True
81
+
82
+ return res
83
+ self.sell.Event_List_def = Event_List_def
84
+ self.sell.Scene = {}
85
+ self.sell.falt = None
86
+ self.sell.vsync = vsync
87
+ self.sell.SafeMode = SafeMode
88
+ self.sell.logs = logs
89
+ self.sell.Clock = pg.time.Clock()
90
+ self.sell.FPS = 0
91
+ self.sell.PressedButton = None
92
+ self.sell.DeltaTimeHow = None
93
+ self.sell.DeveLoperMode = DeveLoperMode
94
+ self.sell.DeveLoperMode_font = pg.font.SysFont(None, 20)
95
+ self.sell.DeveLoperMode_text = f"DeveLoperMode: fps: {0} | ... "
96
+ self.sell.DeveLoperMode_render = self.sell.DeveLoperMode_font.render(self.sell.DeveLoperMode_text, True, (255, 255, 255))
97
+ self.sell.DeveLoperMode_Texture = pg._sdl2.Texture.from_surface(self.sell.render, self.sell.DeveLoperMode_render)
98
+ self.sell.touch = {}
99
+ self.sell.black_window = black_window
100
+ self.sell.size_window_standart = size_window_standart
101
+ self.sell.size_window_how = size_window_how
102
+ self.sell.TextureScreen = pg._sdl2.Texture.from_surface(self.sell.render, pg.Surface(size_window_how))
103
+ self.sell.PyGame = pg
104
+ pg.key.set_repeat(500, 50)
105
+ if logs: print("\033[92mcompleted successfully\033[0m")
106
+
107
+ if logs: print("\033[90mInitializing Functions\033[0m")
108
+ def NewCanvas(color=None):
109
+ if not color is None: self.sell.render.draw_color = color
110
+ self.sell.render.clear()
111
+ self.fell.NewCanvas = NewCanvas
112
+
113
+ def End(): self.sell.war = False
114
+ self.fell.End = End
115
+
116
+ def Draw():
117
+ if self.sell.DeveLoperMode:
118
+ if not self.sell.DeveLoperMode_text == f"DeveLoperMode: fps: {Build.fell.GetFPS()} | ... ":
119
+ self.sell.DeveLoperMode_text = f"DeveLoperMode: fps: {Build.fell.GetFPS()} | ... "
120
+ self.sell.DeveLoperMode_render = self.sell.DeveLoperMode_font.render(self.sell.DeveLoperMode_text, True, (255, 255, 255))
121
+ self.sell.DeveLoperMode_Texture = pg._sdl2.Texture.from_surface(
122
+ self.sell.render, self.sell.DeveLoperMode_font.render(self.sell.DeveLoperMode_text, True, (255, 255, 255)))
123
+ self.sell.DeveLoperMode_Texture.draw(None, pg.Rect(0, 0, self.sell.DeveLoperMode_render.get_width(), self.sell.DeveLoperMode_render.get_height()))
124
+
125
+ pg._sdl2.video.Renderer.present(self.sell.render)
126
+ self.fell.Draw = Draw
127
+
128
+ def File(path): return os.path.join(Build.sell.PATH, path)
129
+ self.fell.File = File
130
+
131
+ def LoadedTexture(path):
132
+ if path in Build.sell.Cache: return Build.sell.Cache[path]
133
+ else:
134
+ surf = pg.image.load(File(path))
135
+ tex = pg._sdl2.video.Texture.from_surface(Build.sell.render, surf)
136
+ Build.sell.Cache[path] = tex
137
+ return tex
138
+ self.fell.LoadedTexture = LoadedTexture
139
+
140
+ class Texture:
141
+ def __init__(self, name, file, x=100, y=100, w=100, h=100, angle=0, static=False):
142
+ if ot_pos: x, y, w, h = left*x, up*y, left*w, up*h
143
+ self.scripts = []
144
+ self.type = "Texture"
145
+ if logs:
146
+ if ot_pos:
147
+ print(f"\033[90mCreate {self.type} with parameters:\n- name:",\
148
+ f" {name};\n- file: {file};\n- position: {x, y};\n- size: {w, h};\n- angle: {angle};\n- static: {static};\033[0m")
149
+ else:
150
+ print(f"\033[90mCreate {self.type} with parameters:\n- name:",\
151
+ f" {name};\n- file: {file};\n- position: {x, y};\n- size: {w, h};\n- angle: {angle};\n- static: {static};\033[0m")
152
+ self.static = static
153
+ if file in Build.sell.Cache: tex = Build.sell.Cache[file]
154
+ else:
155
+ surf = pg.image.load(File(file))
156
+ if surf.get_size() != (w, h): surf = pg.transform.scale(surf, (w, h))
157
+ tex = pg._sdl2.video.Texture.from_surface(Build.sell.render, surf)
158
+ Build.sell.Cache[file] = tex
159
+ del surf
160
+ self.texture = tex
161
+ self.angle = angle
162
+ self.pos = [x, y]
163
+ self.size = [w, h]
164
+ Build.sell.data_Texture[name] = {"tex": self}
165
+ print(f"\033[92mCreate {self.type} completed successfully\033[0m")
166
+ def AddScript(self, script):
167
+ self.scripts.append(script)
168
+ if logs: print(f"\033[90mAdd script {script} to {self.type} completed successfully\033[0m")
169
+ def TextureUpdate(self):
170
+ for script in self.scripts: script.run()
171
+ def RemoveScript(self, script): self.scripts.remove(script)
172
+ def GetScripts(self): return self.scripts
173
+ def get_size(self): return self.size
174
+ def get_type(self): return self.type
175
+ def get_static(self): return self.static
176
+ def get_angle(self): return self.angle
177
+ def set_angle(self, angle): self.angle = angle
178
+ def set_static(self, static): self.static = static
179
+ def get_pos(self): return self.pos
180
+ def get_texture(self): return self.texture
181
+ def set_pos(self, x, y):
182
+ if ot_pos: x, y = left*x, up*y
183
+ self.pos = [x, y]
184
+ def Move(self, x, y): self.pos[0] += x; self.pos[1] += y
185
+ def MoveY(self, y): self.pos[1] += y
186
+ def MoveX(self, x): self.pos[0] += x
187
+ def AngleAdd(self, angle): self.angle += angle
188
+ def AngleSub(self, angle): self.angle -= angle
189
+ def MoveMent(self, keys, speed):
190
+ keys = keys.split(".")
191
+ if ot_pos:
192
+ if Build.fell.ButtonPressed(keys[0]): self.MoveY(up*-speed)
193
+ if Build.fell.ButtonPressed(keys[1]): self.MoveX(left*-speed)
194
+ if Build.fell.ButtonPressed(keys[2]): self.MoveY(up*speed)
195
+ if Build.fell.ButtonPressed(keys[3]): self.MoveX(left*speed)
196
+ else:
197
+ if Build.fell.ButtonPressed(keys[0]): self.MoveY(-speed)
198
+ if Build.fell.ButtonPressed(keys[1]): self.MoveX(-speed)
199
+ if Build.fell.ButtonPressed(keys[2]): self.MoveY(speed)
200
+ if Build.fell.ButtonPressed(keys[3]): self.MoveX(speed)
201
+ def TextureDraw(self):
202
+ if self.pos[0] + self.size[0] > -Build.fell.Camera.pos[0] and self.pos[0] < -Build.fell.Camera.pos[0] + Build.sell.left and \
203
+ self.pos[1] + self.size[1] > -Build.fell.Camera.pos[1] and self.pos[1] < -Build.fell.Camera.pos[1] + Build.sell.up:
204
+ try:
205
+ self.texture.draw(None, pg.Rect(
206
+ (self.pos[0] + Build.fell.Camera.pos[0] - self.size[0] / 2, self.pos[1] + Build.fell.Camera.pos[1] - self.size[1] / 2), self.size)\
207
+ if not self.static else pg.Rect((self.pos[0] - self.size[0] / 2, self.pos[1] - self.size[1] / 2), self.size),
208
+ float(self.angle), (self.size[0] / 2., self.size[1] / 2.))
209
+ except Exception as f: print(f"\033[31mFATAL ERROR: {f}\033[0m")
210
+ self.fell.Texture = Texture
211
+
212
+ def DrawSquare(color=None, x=100, y=100, w=100, h=100, static=False):
213
+ if ot_pos: x, y, w, h = left*x, up*y, left*w, up*h
214
+ if not color is None: self.sell.render.draw_color = color
215
+ if static: self.sell.render.fill_rect(pg.Rect(x, y, w, h))
216
+ else: self.sell.render.fill_rect(pg.Rect(x - Build.fell.Camera.pos[0], y - Build.fell.Camera.pos[1], w, h))
217
+ self.fell.DrawSquare = DrawSquare
218
+
219
+ class Square:
220
+ def __init__(self, name, color=None, x=100, y=100, w=100, h=100, angle=0, static=False):
221
+ if ot_pos: x, y, w, h = left*x, up*y, left*w, up*h
222
+ self.scripts = []
223
+ self.type = "Square"
224
+ if logs: print(f"\033[90mCreate {self.type} with parameters:\n- name:",\
225
+ f" {name};\n- position: {x, y};\n- size: {w, h};\n- angle: {angle};\n- static: {static};\033[0m")
226
+ self.static = static
227
+ surf = pg.Surface((w, h))
228
+ surf.fill(color if color is not None else Build.sell.render.draw_color)
229
+ self.texture = pg._sdl2.video.Texture.from_surface(Build.sell.render, surf)
230
+ del surf
231
+ self.angle = angle
232
+ self.pos = [x, y]
233
+ self.size = [w, h]
234
+ self.color = name if not color is not None else color
235
+ Build.sell.data_Texture[name] = {"tex": self}
236
+ print(f"\033[92mCreate {self.type} completed successfully\033[0m")
237
+ def AddScript(self, script):
238
+ self.scripts.append(script)
239
+ if logs: print(f"\033[90mAdd script {script} to {self.type} completed successfully\033[0m")
240
+ def SquareUpdate(self):
241
+ for script in self.scripts: script.run()
242
+ def RemoveScript(self, script): self.scripts.remove(script)
243
+ def GetScripts(self): return self.scripts
244
+ def get_color(self): return self.color
245
+ def get_name(self): return self.name
246
+ def set_color(self, color): self.color = color
247
+ def get_size(self): return self.size
248
+ def get_type(self): return self.type
249
+ def get_static(self): return self.static
250
+ def get_angle(self): return self.angle
251
+ def set_angle(self, angle): self.angle = angle
252
+ def set_static(self, static): self.static = static
253
+ def get_pos(self): return self.pos
254
+ def get_texture(self): return self.texture
255
+ def set_pos(self, x, y):
256
+ if ot_pos: x, y = left*x, up*y
257
+ self.pos = [x, y]
258
+ def Move(self, x, y): self.pos[0] += x; self.pos[1] += y
259
+ def MoveY(self, y): self.pos[1] += y
260
+ def MoveX(self, x): self.pos[0] += x
261
+ def AngleAdd(self, angle): self.angle += angle
262
+ def AngleSub(self, angle): self.angle -= angle
263
+ def MoveMent(self, keys, speed):
264
+ keys = keys.split(".")
265
+ if ot_pos:
266
+ if Build.fell.ButtonPressed(keys[0]): self.MoveY(up*-speed)
267
+ if Build.fell.ButtonPressed(keys[1]): self.MoveX(left*-speed)
268
+ if Build.fell.ButtonPressed(keys[2]): self.MoveY(up*speed)
269
+ if Build.fell.ButtonPressed(keys[3]): self.MoveX(left*speed)
270
+ else:
271
+ if Build.fell.ButtonPressed(keys[0]): self.MoveY(-speed)
272
+ if Build.fell.ButtonPressed(keys[1]): self.MoveX(-speed)
273
+ if Build.fell.ButtonPressed(keys[2]): self.MoveY(speed)
274
+ if Build.fell.ButtonPressed(keys[3]): self.MoveX(speed)
275
+ def SquareDraw(self):
276
+ if self.pos[0] + self.size[0] > -Build.fell.Camera.pos[0] and self.pos[0] < -Build.fell.Camera.pos[0] + Build.sell.left and \
277
+ self.pos[1] + self.size[1] > -Build.fell.Camera.pos[1] and self.pos[1] < -Build.fell.Camera.pos[1] + Build.sell.up:
278
+ try:
279
+ self.texture.draw(None, pg.Rect(
280
+ (self.pos[0] + Build.fell.Camera.pos[0], self.pos[1] + Build.fell.Camera.pos[1]), self.size)\
281
+ if not self.static else pg.Rect((self.pos[0], self.pos[1]), self.size),
282
+ float(self.angle), (self.size[0] / 2., self.size[1] / 2.))
283
+ except Exception as f: print(f"\033[31mFATAL ERROR: {f}\033[0m")
284
+ self.fell.Square = Square
285
+
286
+ class Text:
287
+ def __init__(self, name, text, x, y, size, angle, color, static=False, center=True):
288
+ if ot_pos: x, y, size = left*x, up*y, up*size
289
+ if text == "": text = " "
290
+ self.name = name
291
+ self.angle = angle
292
+ self.text = text
293
+ self.pos = [x, y]
294
+ self.size = size
295
+ self.color = color
296
+ self.scripts = []
297
+ self.render = pg.font.SysFont(None, int(size)).render(text, True, color)
298
+ self.texture = pg._sdl2.video.Texture.from_surface(Build.sell.render, self.render)
299
+ self.type = "Text"
300
+ if logs: print(f"\033[90mCreate {self.type} with parameters:\n- name:",\
301
+ f" {name};\n- text: {text};\n- position: {x, y};\n- size: {size};\n- color: {color};\n- static: {static};\n- center: {center};\033[0m")
302
+ self.static = static
303
+ self.center = center
304
+ Build.sell.data_Texture[name] = {"tex": self}
305
+ self.size_Rect = [*self.render.get_size()]
306
+ if logs: print(f"\033[92mCreate {self.type} completed successfully\033[0m")
307
+ def AddScript(self, script):
308
+ self.scripts.append(script)
309
+ if logs: print(f"\033[90mAdd script {script} to {self.type} completed successfully\033[0m")
310
+ def TextUpdate(self):
311
+ for script in self.scripts: script.run()
312
+ def RemoveScript(self, script): self.scripts.remove(script)
313
+ def GetScripts(self): return self.scripts
314
+ def get_color(self): return self.color
315
+ def get_name(self): return self.name
316
+ def set_color(self, color): self.color = color
317
+ def get_size(self): return self.size
318
+ def get_type(self): return self.type
319
+ def get_static(self): return self.static
320
+ def get_pos(self): return self.pos
321
+ def get_texture(self): return self.texture
322
+ def set_text(self, text):
323
+ self.text = text
324
+ self.render = pg.font.SysFont(None, int(self.size)).render(text, True, self.color)
325
+ self.size_Rect = self.render.get_size()
326
+ self.texture = pg._sdl2.video.Texture.from_surface(Build.sell.render, self.render)
327
+ def set_pos(self, x, y):
328
+ if ot_pos: x, y = left*x, up*y
329
+ self.pos = [x, y]
330
+ def Move(self, x, y): self.pos[0] += x; self.pos[1] += y
331
+ def MoveY(self, y): self.pos[1] += y
332
+ def MoveX(self, x): self.pos[0] += x
333
+ def MoveMent(self, keys, speed):
334
+ keys = keys.split(".")
335
+ if ot_pos:
336
+ if Build.fell.ButtonPressed(keys[0]): self.MoveY(up*-speed)
337
+ if Build.fell.ButtonPressed(keys[1]): self.MoveX(left*-speed)
338
+ if Build.fell.ButtonPressed(keys[2]): self.MoveY(up*speed)
339
+ if Build.fell.ButtonPressed(keys[3]): self.MoveX(left*speed)
340
+ else:
341
+ if Build.fell.ButtonPressed(keys[0]): self.MoveY(-speed)
342
+ if Build.fell.ButtonPressed(keys[1]): self.MoveX(-speed)
343
+ if Build.fell.ButtonPressed(keys[2]): self.MoveY(speed)
344
+ if Build.fell.ButtonPressed(keys[3]): self.MoveX(speed)
345
+ def TextDraw(self):
346
+ if self.center:
347
+ if self.pos[0] + self.size_Rect[0] > -Build.fell.Camera.pos[0] and self.pos[0] < -Build.fell.Camera.pos[0] + Build.sell.left and \
348
+ self.pos[1] + self.size_Rect[1] > -Build.fell.Camera.pos[1] and self.pos[1] < -Build.fell.Camera.pos[1] + Build.sell.up:
349
+ try:
350
+ self.texture.draw(None, pg.Rect(
351
+ (self.pos[0] + Build.fell.Camera.pos[0] - self.size_Rect[0] / 2, self.pos[1] + Build.fell.Camera.pos[1] - self.size_Rect[1] / 2), self.size_Rect)\
352
+ if not self.static else pg.Rect((self.pos[0] - self.size_Rect[0] / 2, self.pos[1] - self.size_Rect[1] / 2), self.size_Rect),
353
+ float(self.angle), (self.size_Rect[0] / 2., self.size_Rect[1] / 2.))
354
+ except Exception as f: print(f"\033[31mFATAL ERROR: {f}\033[0m")
355
+ else:
356
+ if self.pos[0] + self.size_Rect[0] > -Build.fell.Camera.pos[0] and self.pos[0] < -Build.fell.Camera.pos[0] + Build.sell.left and \
357
+ self.pos[1] + self.size_Rect[1] > -Build.fell.Camera.pos[1] and self.pos[1] < -Build.fell.Camera.pos[1] + Build.sell.up:
358
+ try:
359
+ self.texture.draw(None, pg.Rect(
360
+ (self.pos[0] + Build.fell.Camera.pos[0], self.pos[1] + Build.fell.Camera.pos[1]), self.size_Rect)\
361
+ if not self.static else pg.Rect(self.pos, self.size_Rect),
362
+ float(self.angle))
363
+ except Exception as f: print(f"\033[31mFATAL ERROR: {f}\033[0m")
364
+ self.fell.Text = Text
365
+
366
+ class Button:
367
+ def __init__(self, name, text, x, y, size, angle, color, func, mouse="mouse down left", static=False, center=True):
368
+ self.type = "Button"
369
+ if ot_pos: x, y, size = left*x, up*y, up*size
370
+ self.angle = angle
371
+ self.center = center
372
+ self.mouse = mouse
373
+ self.func = func
374
+ self.name = name
375
+ self.text = text
376
+ self.x = x
377
+ self.y = y
378
+ self.pos = [x, y]
379
+ self.size = size
380
+ self.color = color
381
+ self.font = pg.font.SysFont(None, int(size))
382
+ self.render = self.font.render(text, True, color)
383
+ texture_noText = pg.Surface((x, y), pg.SRCALPHA)
384
+ texture_noText.fill((255, 255, 255, 255))
385
+ self.texture_noText = pg._sdl2.video.Texture.from_surface(Build.sell.render, texture_noText)
386
+ self.texture = pg._sdl2.video.Texture.from_surface(Build.sell.render, self.render)
387
+ self.type = "Button"
388
+ if logs: print(f"\033[90mCreate {self.type} with parameters:\n- name:",\
389
+ f" {name};\n- text: {text};\n- position: {x, y};\n- size: {size};\n- color: {color};\n- static: {static};\033[0m")
390
+ self.static = static
391
+ self.size_Rect = [*self.render.get_size()]
392
+ Build.sell.Events[name] = self
393
+ Build.sell.data_Texture[name] = {"tex": self}
394
+ if logs: print(f"\033[92mCreate {self.type} completed successfully\033[0m")
395
+ def AddScript(self, script):
396
+ self.scripts.append(script)
397
+ if logs: print(f"\033[90mAdd script {script} to {self.type} completed successfully\033[0m")
398
+ def TextUpdate(self):
399
+ for script in self.scripts: script.run()
400
+ def RemoveScript(self, script): self.scripts.remove(script)
401
+ def GetScripts(self): return self.scripts
402
+ def GetFunc(self): return self.func
403
+ def get_type(self): return self.type
404
+ def get_name(self): return self.name
405
+ def get_text(self): return self.text
406
+ def get_color(self): return self.color
407
+ def get_size(self): return self.size
408
+ def get_texture(self): return self.texture
409
+ def get_static(self): return self.static
410
+ def get_pos(self): return self.pos
411
+ def get_angle(self): return self.angle
412
+ def get_func(self): return self.func
413
+ def set_func(self, func): self.func = func
414
+ def set_angle(self, angle): self.angle = angle
415
+ def set_color(self, color):
416
+ self.color = color
417
+ self.texture = pg._sdl2.video.Texture.from_surface(Build.sell.render, self.font.render(self.text, True, color).convert_alpha())
418
+ def set_text(self, text):
419
+ self.text = text
420
+ self.texture = pg._sdl2.video.Texture.from_surface(Build.sell.render, self.font.render(text, True, self.color).convert_alpha())
421
+ def set_size(self, size):
422
+ self.size = size
423
+ self.font = pg.SysFont(None, size)
424
+ self.texture = pg._sdl2.video.Texture.from_surface(Build.sell.render, self.font.render(self.text, True, self.color).convert_alpha())
425
+ def set_pos(self, x, y):
426
+ if ot_pos: x, y = left*x, up*y
427
+ self.pos = [x, y]
428
+ def Move(self, x, y): self.pos[0] += x; self.pos[1] += y
429
+ def MoveY(self, y): self.pos[1] += y
430
+ def MoveX(self, x): self.pos[0] += x
431
+ def is_hovered(self):
432
+ m_pos = pg.mouse.get_pos()
433
+ if self.center: rect = pg.Rect(self.pos[0] - self.size_Rect[0]/2, self.pos[1] - self.size_Rect[1]/2, *self.size_Rect)
434
+ else: rect = pg.Rect(*self.pos, *self.size_Rect)
435
+ return rect.collidepoint(m_pos)
436
+ def MoveMent(self, keys, speed):
437
+ keys = keys.split(".")
438
+ if ot_pos:
439
+ if Build.fell.ButtonPressed(keys[0]): self.MoveY(up*-speed)
440
+ if Build.fell.ButtonPressed(keys[1]): self.MoveX(left*-speed)
441
+ if Build.fell.ButtonPressed(keys[2]): self.MoveY(up*speed)
442
+ if Build.fell.ButtonPressed(keys[3]): self.MoveX(left*speed)
443
+ else:
444
+ if Build.fell.ButtonPressed(keys[0]): self.MoveY(-speed)
445
+ if Build.fell.ButtonPressed(keys[1]): self.MoveX(-speed)
446
+ if Build.fell.ButtonPressed(keys[2]): self.MoveY(speed)
447
+ if Build.fell.ButtonPressed(keys[3]): self.MoveX(speed)
448
+ def ButtonDraw(self):
449
+ if self.center:
450
+ if pg.mouse.get_pos()[0] > self.pos[0] - self.size_Rect[0] / 2 - 10 and pg.mouse.get_pos()[0] < self.pos[0] + self.size_Rect[0] / 2 + 10 and \
451
+ pg.mouse.get_pos()[1] > self.pos[1] - self.size_Rect[1] / 2 - 10 and pg.mouse.get_pos()[1] < self.pos[1] + self.size_Rect[1] / 2 + 10:
452
+ self.texture_noText.color = (100, 100, 100)
453
+ else: self.texture_noText.color = (0, 0, 0)
454
+ if self.pos[0] + self.size_Rect[0] > -Build.fell.Camera.pos[0] and self.pos[0] < -Build.fell.Camera.pos[0] + Build.sell.left and \
455
+ self.pos[1] + self.size_Rect[1] > -Build.fell.Camera.pos[1] and self.pos[1] < -Build.fell.Camera.pos[1] + Build.sell.up:
456
+ try:
457
+ self.texture_noText.draw(None, pg.Rect(
458
+ (self.pos[0] + Build.fell.Camera.pos[0] - self.size_Rect[0] / 2 - 10, self.pos[1] + Build.fell.Camera.pos[1] - self.size_Rect[1] / 2 - 10), (self.size_Rect[0] + 20, self.size_Rect[1] + 10))\
459
+ if not self.static else pg.Rect((self.pos[0] - 10 - self.size_Rect[0] / 2, self.pos[1] - 10 - self.size_Rect[1] / 2), (self.size_Rect[0] + 20, self.size_Rect[1] + 20)),
460
+ float(self.angle), (self.size_Rect[0] / 2., self.size_Rect[1] / 2.)
461
+ )
462
+ self.texture.draw(None, pg.Rect(
463
+ (self.pos[0] + Build.fell.Camera.pos[0] - self.size_Rect[0] / 2, self.pos[1] + Build.fell.Camera.pos[1] - self.size_Rect[1] / 2), self.size_Rect)\
464
+ if not self.static else pg.Rect((self.pos[0] - self.size_Rect[0] / 2, self.pos[1] - self.size_Rect[1] / 2), self.size_Rect),
465
+ float(self.angle), (self.size_Rect[0] / 2., self.size_Rect[1] / 2.))
466
+ except Exception as f: print(f"\033[31mFATAL ERROR: {f}\033[0m")
467
+ else:
468
+ if pg.mouse.get_pos()[0] > self.pos[0] and pg.mouse.get_pos()[0] < self.pos[0] + self.size_Rect[0] and \
469
+ pg.mouse.get_pos()[1] > self.pos[1] and pg.mouse.get_pos()[1] < self.pos[1] + self.size_Rect[1]:
470
+ self.texture_noText.color = (100, 100, 100)
471
+ else: self.texture_noText.color = (0, 0, 0)
472
+ if self.pos[0] + self.size_Rect[0] > -Build.fell.Camera.pos[0] and self.pos[0] < -Build.fell.Camera.pos[0] + Build.sell.left and \
473
+ self.pos[1] + self.size_Rect[1] > -Build.fell.Camera.pos[1] and self.pos[1] < -Build.fell.Camera.pos[1] + Build.sell.up:
474
+ try:
475
+ self.texture_noText.draw(None, pg.Rect(
476
+ (self.pos[0] + Build.fell.Camera.pos[0] - 10, self.pos[1] + Build.fell.Camera.pos[1] - 10), (self.size_Rect[0] + 20, self.size_Rect[1] + 10))\
477
+ if not self.static else pg.Rect((self.pos[0] - 10, self.pos[1] - 10), (self.size_Rect[0] + 20, self.size_Rect[1] + 20)),
478
+ float(self.angle))
479
+ self.texture.draw(None, pg.Rect(
480
+ (self.pos[0] + Build.fell.Camera.pos[0], self.pos[1] + Build.fell.Camera.pos[1]), self.size_Rect)\
481
+ if not self.static else pg.Rect(self.pos, self.size_Rect),
482
+ float(self.angle))
483
+ except Exception as f: print(f"\033[31mFATAL ERROR: {f}\033[0m")
484
+ self.fell.Button = Button
485
+
486
+ class Input_Field:
487
+ def __init__(self, name, default_text, x, y, w, h, angle, static=False, center=False):
488
+ if ot_pos: x, y, w, h = left*x, up*y, left*w, up*h
489
+ self.name = name
490
+ self.type = "Input_Field"
491
+ self.default_text = default_text
492
+ self.text = ""
493
+ self.Focus = False
494
+ self.angle = angle
495
+ self.x = x
496
+ self.y = y
497
+ self.w = w
498
+ self.h = h
499
+ self.time = 0
500
+ self.static = static
501
+ self.center = center
502
+ self.pos = [x, y]
503
+ self.size = [w, h]
504
+ self.font = pg.font.SysFont(None, int(h))
505
+ self.render_text_pg = pg.font.SysFont(None, int(h)).render(default_text, True, (0, 0, 0))
506
+ self.render_text_pg.fill((255, 255, 255))
507
+ self.render_size = self.render_text_pg.get_size()
508
+ self.render = pg._sdl2.video.Texture.from_surface(Build.sell.render, pg.Surface((w, h), pg.SRCALPHA))
509
+ texture = pg.Surface((left * 0.01, self.render_text_pg.get_size()[1]))
510
+ self.render_text_pg = pg._sdl2.video.Texture.from_surface(Build.sell.render, self.render_text_pg)
511
+ texture.fill((255, 255, 255, 255))
512
+ self.texture = pg._sdl2.video.Texture.from_surface(Build.sell.render, texture); self.texture_size = texture.get_size()
513
+ Fon = pg.Surface((w, h), pg.SRCALPHA)
514
+ Fon.fill((0, 0, 0, 255))
515
+ self.Fon = pg._sdl2.video.Texture.from_surface(Build.sell.render, Fon)
516
+ Build.sell.data_Texture[name] = {"tex": self}
517
+ if logs:
518
+ print(f"\033[90mCreate {self.type} with name:"\
519
+ f" {name};\n- default text: {default_text};\n- position: {x, y};\n- size: {w, h};\n- angle: {angle};\n- static: {static};\n- center: {center};\033[0m")
520
+ print(f"\033[92mCreate {self.type} completed successfully\033[0m")
521
+ self._update_texture()
522
+
523
+ def Input_FieldDraw(self):
524
+ if self.Focus: self.time += 1
525
+ if self.center:
526
+ if self.pos[0] - self.w / 2 + self.render_size[0] > -Build.fell.Camera.pos[0] and self.pos[0] - self.w / 2 < -Build.fell.Camera.pos[0] + Build.sell.left and \
527
+ self.pos[1] - self.h / 2 + self.render_size[1] > -Build.fell.Camera.pos[1] and self.pos[1] - self.h / 2 < -Build.fell.Camera.pos[1] + Build.sell.up:
528
+
529
+ self.Fon.draw(None, pg.Rect(self.x + Build.fell.Camera.pos[0] - self.w / 2, self.y + Build.fell.Camera.pos[1] - self.y / 2, self.w, self.h) if\
530
+ not self.static else pg.Rect(self.x - self.w / 2, self.y - self.h / 2, self.w, self.h), float(self.angle), (self.w / 2., self.h / 2.))
531
+
532
+ self.render.draw(None, pg.Rect(self.x + Build.fell.Camera.pos[0] - self.w / 2, self.y + Build.fell.Camera.pos[1] + 10 - self.h / 2, *self.render_size) if\
533
+ not self.static else pg.Rect(self.x - self.w / 2, self.y + 10 - self.h / 2, *self.render_size), float(self.angle), (self.w / 2., self.h / 2.))
534
+
535
+ if (self.time // 100) % 2 == 1 and self.Focus:
536
+ if self.text == "":
537
+ self.texture.draw(None, pg.Rect(self.x + Build.fell.Camera.pos[0] - self.w / 2, self.y + Build.fell.Camera.pos[1] + 7.5 - self.h / 2, *self.texture_size) if\
538
+ not self.static else pg.Rect(self.x - self.w / 2, self.y + 7.5 - self.h / 2, *self.texture_size), float(self.angle), (self.w / 2., self.h / 2.))
539
+ else:
540
+ self.texture.draw(None, pg.Rect(self.x + Build.fell.Camera.pos[0] + self.render_size[0] - self.w / 2, self.y + Build.fell.Camera.pos[1] + 7.5 - self.h / 2, *self.texture_size) if\
541
+ not self.static else pg.Rect(self.x + self.render_size[0] - self.w / 2, self.y + 7.5 - self.h / 2, *self.texture_size), float(self.angle), (self.w / 2., self.h / 2.))
542
+ else:
543
+ if self.pos[0] + self.render_size[0] > -Build.fell.Camera.pos[0] and self.pos[0] < -Build.fell.Camera.pos[0] + Build.sell.left and \
544
+ self.pos[1] + self.render_size[1] > -Build.fell.Camera.pos[1] and self.pos[1] < -Build.fell.Camera.pos[1] + Build.sell.up:
545
+
546
+ self.Fon.draw(None, pg.Rect(self.x + Build.fell.Camera.pos[0], self.y + Build.fell.Camera.pos[1], self.w, self.h) if\
547
+ not self.static else pg.Rect(self.x, self.y, self.w, self.h), float(self.angle), (0, 0))
548
+
549
+ self.render.draw(None, pg.Rect(self.x + Build.fell.Camera.pos[0], self.y + Build.fell.Camera.pos[1] + 10, *self.render_size) if\
550
+ not self.static else pg.Rect(self.x, self.y + 10, *self.render_size), float(self.angle), (0, 0))
551
+
552
+ if (self.time // 100) % 2 == 1 and self.Focus:
553
+ if self.text == "":
554
+ self.texture.draw(None, pg.Rect(self.x + Build.fell.Camera.pos[0], self.y + Build.fell.Camera.pos[1] + 7.5, *self.texture_size) if\
555
+ not self.static else pg.Rect(self.x, self.y + 7.5, *self.texture_size), float(self.angle), (0, 0))
556
+ else:
557
+ self.texture.draw(None, pg.Rect(self.x + Build.fell.Camera.pos[0] + self.render_size[0], self.y + Build.fell.Camera.pos[1] + 7.5, *self.texture_size) if\
558
+ not self.static else pg.Rect(self.x + self.render_size[0], self.y + 7.5, *self.texture_size), float(self.angle), (0, 0))
559
+
560
+ def event(self, events):
561
+ if events.type == pg.MOUSEBUTTONDOWN:
562
+ if self.pos[0] - self.size[0] / 2 < events.pos[0] < self.pos[0] + self.size[0] / 2 and self.pos[1] - self.size[1] / 2 < events.pos[1] < self.pos[1] + self.size[1] / 2: self.Focus = True
563
+ else: self.Focus = False
564
+
565
+ if not self.Focus: return
566
+
567
+ is_changed = False
568
+ if events.type == pg.TEXTINPUT: self.text += events.text; is_changed = True
569
+ elif events.type == pg.KEYDOWN:
570
+ if events.key == pg.K_BACKSPACE: self.text = self.text[:-1]; is_changed = True
571
+ if is_changed: self._update_texture()
572
+
573
+ def Clear_Input(self): self.text = ""; self._update_texture()
574
+
575
+ def get_type(self): return self.type
576
+ def get_text(self): return self.text
577
+ def get_name(self): return self.name
578
+ def get_pos(self): return self.pos
579
+ def get_size(self): return self.size
580
+ def get_angle(self): return self.angle
581
+ def get_static(self): return self.static
582
+ def get_center(self): return self.center
583
+ def set_angle(self, angle): self.angle = angle
584
+ def set_static(self, static): self.static = static
585
+ def set_center(self, center): self.center = center
586
+ def set_pos(self, x, y):
587
+ if ot_pos: x, y = left*x, up*y
588
+ self.pos = [x, y]
589
+ def set_size(self, w, h):
590
+ if ot_pos: w, h = left*w, up*h
591
+ self.size = [w, h]
592
+ def set_text(self, text): self.text = text; self._update_texture()
593
+
594
+ def _update_texture(self):
595
+ if self.text == "":
596
+ self.render_text_pg = self.font.render(self.default_text, True, (150, 150, 150))
597
+ self.render_size = self.render_text_pg.get_size()
598
+ time_text = self.default_text
599
+ else:
600
+ self.render_text_pg = self.font.render(self.text, True, (255, 255, 255))
601
+ self.render_size = self.render_text_pg.get_size()
602
+ time_text = self.text
603
+ self.metrics = self.font.metrics(time_text)
604
+ if self.render_size[0] > self.w:
605
+ self.render_text_pg = self.font.render(f"{time_text}...", True, (255, 255, 255))
606
+ self.render_size = self.render_text_pg.get_size()
607
+ num = [0, 0]
608
+ while self.render_size[0] - num[1] > self.w:
609
+ num[0] += 1
610
+ num[1] += self.metrics[-num[0]][4]
611
+ if num[0] > 0: self.render_text_pg = self.font.render(f"{time_text[:-num[0]]}...", True, (255, 255, 255))
612
+ self.render_size = self.render_text_pg.get_size()
613
+ self.render = pg._sdl2.video.Texture.from_surface(Build.sell.render, self.render_text_pg)
614
+ self.fell.Input_Field = Input_Field
615
+
616
+ def SetColor(color): self.sell.render.draw_color = color
617
+ self.fell.SetColor = SetColor
618
+
619
+ def AllDrawTexture():
620
+ for t in Build.sell.data_Texture.values():
621
+ if t["tex"].get_type() == "Texture": t["tex"].TextureDraw()
622
+ self.fell.AllDrawTexture = AllDrawTexture
623
+
624
+ def AllDrawSquare():
625
+ for t in Build.sell.data_Texture.values():
626
+ if t["tex"].get_type() == "Square": t["tex"].SquareDraw()
627
+ self.fell.AllDrawSquare = AllDrawSquare
628
+
629
+ def AllDrawText():
630
+ for t in Build.sell.data_Texture.values():
631
+ if t["tex"].get_type() == "Text": t["tex"].TextDraw()
632
+ self.fell.AllDrawText = AllDrawText
633
+
634
+ def AllDrawButton():
635
+ for t in Build.sell.data_Texture.values():
636
+ if t["tex"].get_type() == "Button": t["tex"].ButtonDraw()
637
+ self.fell.AllDrawButton = AllDrawButton
638
+
639
+ def AllDrawInputField():
640
+ for t in Build.sell.data_Texture.values():
641
+ if t["tex"].get_type() == "Input_Field": t["tex"].Input_FieldDraw()
642
+ self.fell.AllDrawInputField = AllDrawInputField
643
+
644
+ def AllDraw():
645
+ for t in Build.sell.data_Texture.values():
646
+ obj = t["tex"]
647
+ obj_type = obj.get_type()
648
+ if obj_type == "Texture": obj.TextureDraw()
649
+ elif obj_type == "Square": obj.SquareDraw()
650
+ elif obj_type == "Text": obj.TextDraw()
651
+ elif obj_type == "Button": obj.ButtonDraw()
652
+ elif obj_type == "Input_Field": obj.Input_FieldDraw()
653
+ self.fell.AllDraw = AllDraw
654
+ def AllUpdate():
655
+ for t in Build.sell.data_Texture.values():
656
+ obj = t["tex"]
657
+ obj_type = obj.get_type()
658
+ if obj_type == "Texture": obj.TextureUpdate()
659
+ elif obj_type == "Square": obj.SquareUpdate()
660
+ elif obj_type == "Text": obj.TextUpdate()
661
+ self.fell.AllUpdate = AllUpdate
662
+
663
+ def MoveMent(keys, Texture, speed):
664
+ keys = keys.split(".")
665
+ if ot_pos:
666
+ if Build.fell.ButtonPressed(keys[0]): Texture.MoveY(up*-speed)
667
+ if Build.fell.ButtonPressed(keys[1]): Texture.MoveX(left*-speed)
668
+ if Build.fell.ButtonPressed(keys[2]): Texture.MoveY(up*speed)
669
+ if Build.fell.ButtonPressed(keys[3]): Texture.MoveX(left*speed)
670
+ else:
671
+ if Build.fell.ButtonPressed(keys[0]): Texture.MoveY(-speed)
672
+ if Build.fell.ButtonPressed(keys[1]): Texture.MoveX(-speed)
673
+ if Build.fell.ButtonPressed(keys[2]): Texture.MoveY(speed)
674
+ if Build.fell.ButtonPressed(keys[3]): Texture.MoveX(speed)
675
+ self.fell.MoveMent = MoveMent
676
+
677
+ def event(events, list_obj=[]):
678
+ self = Build
679
+ EV = pg.event.get()
680
+ event_dict = self.sell.Event_List_def(EV)
681
+
682
+ for ev in EV:
683
+ for obj in list_obj: obj.event(ev)
684
+
685
+ if ev.type == pg.FINGERDOWN: self.sell.touch[ev.finger_id] = {'x': ev.x, 'y': ev.y}
686
+ elif ev.type == pg.FINGERUP:
687
+ if ev.finger_id in self.sell.touch: del self.sell.touch[ev.finger_id]
688
+
689
+ for btn_name in self.sell.Events:
690
+ obj = self.sell.Events[btn_name]
691
+ if event_dict.get(getattr(obj, 'mouse', '')) and obj.is_hovered(): obj.func()
692
+
693
+ for event_name in events.keys():
694
+ if event_dict.get(event_name): events[event_name]()
695
+
696
+ self.fell.Event = event
697
+
698
+ def SetScene(name): self.sell.falt = name
699
+ self.fell.ChangeScene = SetScene
700
+
701
+ def ChangeScene(name): self.sell.falt = name
702
+ self.fell.ChangeScene = ChangeScene
703
+
704
+ def SetFPSValue(fps): self.sell.FPS = fps
705
+ self.fell.SetFPSValue = SetFPSValue
706
+
707
+ def GetFPSValue(): return self.sell.FPS
708
+ self.fell.GetFPSValue = GetFPSValue
709
+
710
+ def GetFPS(): return self.sell.Clock.get_fps()
711
+ self.fell.GetFPS = GetFPS
712
+
713
+ def ClockUse(stabilize_fps=True):
714
+ if stabilize_fps: self.sell.Clock.tick_busy_loop(self.sell.FPS)
715
+ else: self.sell.Clock.tick(self.sell.FPS)
716
+ self.fell.ClockUse = ClockUse
717
+
718
+ class Camera:
719
+ def __init__(self):
720
+ self.pos = [0, 0]
721
+
722
+ def SetPos(self, x, y):
723
+ if ot_pos: x, y = left*x, up*y
724
+ self.pos = [x, y]
725
+ def GetPos(self): return self.pos
726
+
727
+ def Move(self, x, y): self.pos[0] += x; self.pos[1] += y
728
+ def MoveY(self, y): self.pos[1] += y
729
+ def MoveX(self, x): self.pos[0] += x
730
+ self.fell.Camera = Camera()
731
+
732
+ def UpdateButtonPressedHow(): self.sell.PressedButton = pg.key.get_pressed()
733
+ self.fell.UpdateButtonPressedHow = UpdateButtonPressedHow
734
+ self.fell.UBPH = UpdateButtonPressedHow
735
+
736
+ def ButtonPressed(key):
737
+ if self.sell.PressedButton is None: print("\033[33mWARNING: ButtonPressedHow not updated\033[0m"); return None
738
+ return self.sell.PressedButton[pg.key.key_code(key)]
739
+ self.fell.ButtonPressed = ButtonPressed
740
+
741
+ def Get_DeltaTime(): self.sell.DeltaTimeHow = self.sell.Clock.get_time() / 1000.; return self.sell.DeltaTimeHow
742
+ self.fell.Get_DeltaTime = Get_DeltaTime
743
+
744
+ def Get_DeltaTimeHow(): return self.sell.DeltaTimeHow
745
+ self.fell.Get_DeltaTimeHow = Get_DeltaTimeHow
746
+
747
+ def ClearCache(): self.sell.data_Texture = {}
748
+ self.fell.ClearCache = ClearCache
749
+
750
+ def GetCache(): return self.sell.data_Texture
751
+ self.fell.GetCache = GetCache
752
+
753
+ if logs: print("\033[92mcompleted successfully\033[0m")
754
+
755
+ def NewScene(self, name, func):
756
+ if self.sell.logs: print(f"\033[90mCreating Scene {name}\033[0m")
757
+ name = str(name)
758
+ if not callable(func): print("\033[31mERROR: Code must be a function\033[0m"); return
759
+ self.sell.Scene[name] = func
760
+ if self.sell.logs: print("\033[92mcompleted successfully\033[0m")
761
+
762
+ def SetScene(self, name):
763
+ if self.sell.logs: print(f"\033[90mChanging Scene{name}\033[0m")
764
+ self.sell.falt = name
765
+ if self.sell.logs: print("\033[92mcompleted successfully\033[0m")
766
+
767
+ def ChangeScene(self, name):
768
+ self.sell.falt = name
769
+ if self.sell.logs: print(f"\033[90mChanging Scene {name}\033[0m")
770
+ if self.sell.logs: print("\033[92mcompleted successfully\033[0m")
771
+
772
+ def SetSHADES(self, SHADERS):
773
+ if self.sell.logs: print(f"\033[90mSetting SHADERS to {SHADERS}\033[0m")
774
+ self.sell.SHADER = SHADERS
775
+ if self.sell.logs: print("\033[92mcompleted successfully\033[0m")
776
+
777
+ def ExecuteOneFrame(self, name=None):
778
+ if self.sell.SafeMode:
779
+ try:
780
+ if self.sell.logs: print(f"\033[90mExecuting a single-frame scene {name if not name is None else self.sell.falt}\033[0m")
781
+ if not name is None: self.sell.Scene[name]()
782
+ else: self.sell.Scene[self.sell.falt]()
783
+ if self.sell.logs: print("\033[92mcompleted successfully\033[0m")
784
+ except: ERROR()
785
+ else:
786
+ if self.sell.logs: print(f"\033[90mExecuting a single-frame scene {name if not name is None else self.sell.falt}\033[0m")
787
+ if not name is None: self.sell.Scene[name]()
788
+ else: self.sell.Scene[self.sell.falt]()
789
+ if self.sell.logs: print("\033[92mcompleted successfully\033[0m")
790
+ def ExecuteOnceCode(self, code):
791
+ if self.sell.SafeMode:
792
+ try:
793
+ if self.sell.logs: print(f"\033[90mExecuting a single-frame code\033[0m")
794
+ if callable(code):
795
+ if len(inspect.signature(code).parameters) == 1: code(self.fell)
796
+ else: print("\033[31mERROR: Code must be a function with one parameter\033[0m"); return
797
+ else: print("\033[31mERROR: Code must be a function\033[0m"); return
798
+ if self.sell.logs: print("\033[92mcompleted successfully\033[0m")
799
+ except: ERROR()
800
+ else:
801
+ if self.sell.logs: print(f"\033[90mExecuting a single-frame code\033[0m")
802
+ if callable(code):
803
+ if len(inspect.signature(code).parameters) == 1: code(self.fell)
804
+ else: print("\033[31mERROR: Code must be a function with one parameter\033[0m"); return
805
+ else: print("\033[31mERROR: Code must be a function\033[0m"); return
806
+ if self.sell.logs: print("\033[92mcompleted successfully\033[0m")
807
+
808
+ def SetSafeMode(self, SafeMode):
809
+ self.sell.SafeMode = SafeMode
810
+ if self.sell.logs: print(f"\033[90mSetting SafeMode to {SafeMode}\033[0m")
811
+ def GetSafeMode(self):
812
+ if self.sell.logs: print(f"\033[90mGetting SafeMode\033[0m")
813
+ return self.sell.SafeMode
814
+
815
+ def SetLogs(self, logs):
816
+ self.sell.logs = logs
817
+ if self.sell.logs: print(f"\033[90mSetting logs to {logs}\033[0m")
818
+ def GetLogs(self):
819
+ if self.sell.logs: print("\033[90mGetting logs\033[0m")
820
+ return self.sell.logs
821
+
822
+ def SetDeveLoperMode(self, DeveLoperMode):
823
+ self.sell.DeveLoperMode = DeveLoperMode
824
+ if self.sell.logs: print(f"\033[90mSetting DeveLoperMode to {DeveLoperMode}\033[0m")
825
+
826
+ def GetDeveLoperMode(self):
827
+ if self.sell.logs: print(f"\033[90mGetting DeveLoperMode\033[0m")
828
+ return self.sell.DeveLoperMode
829
+
830
+ def SetVsync(self, Vsync):
831
+ self.sell.Vsync = Vsync
832
+ if self.sell.logs: print(f"\033[90mSetting Vsync to {Vsync}\033[0m")
833
+
834
+ def GetVsync(self):
835
+ if self.sell.logs: print(f"\033[90mGetting Vsync\033[0m")
836
+ return self.sell.Vsync
837
+
838
+ def GetFell(self):
839
+ if self.sell.logs: print(f"\033[90mGetting Fell\033[0m")
840
+ return self.sell
841
+ def _GetSell(self):
842
+ if self.sell.logs: print(f"\033[90mGetting Sell\033[0m")
843
+ return self.sell
844
+
845
+ def GetVersion(self):
846
+ if self.sell.logs: print(f"\033[90mGetting Version\033[0m")
847
+ return VERSION
848
+
849
+ def Destroy(self):
850
+ if self.sell.SafeMode:
851
+ self.sell.war = False
852
+ try:
853
+ if self.sell.logs: print(f"\033[90mDestroying Engine Version {VERSION}\033[0m")
854
+ self.sell.screen.destroy()
855
+ del self.sell.render
856
+ except: print("\033[31mFATAL ERROR: An error has fatal error.\033[0m")
857
+ else:
858
+ if self.sell.logs: print(f"\033[90mDestroying Engine Version {VERSION}\033[0m")
859
+ self.sell.screen.destroy()
860
+ del self.sell.render
861
+ def run(self):
862
+ if self.sell.logs: print(f"\033[90mStarting engine with parameters:\n- SafeMode: {self.sell.SafeMode};\n- logs: {\
863
+ self.sell.logs}\033[0m")
864
+ if self.sell.SafeMode:
865
+ try:
866
+ while self.sell.war: self.sell.Scene[self.sell.falt]()
867
+ except: ERROR()
868
+ else:
869
+ while self.sell.war: self.sell.Scene[self.sell.falt]()
870
+
871
+ if self.sell.logs: print("\033[90mDone.\033[0m")
872
+
873
+ class ERROR(Build):
874
+ def __init__(self):
875
+ if self.sell.logs: print("\033[31mFATAL ERROR: An error has fatal error.\033[0m")
876
+ try: self.sell.screen.destroy()
877
+ except: ...
878
+ try: del self.sell.render
879
+ except: ...
880
+ screen = pg.display.set_mode((800, 600))
881
+ pg.display.set_caption("Sorry, it looks like an error has fatal error (TT)")
882
+ left, up = pg.display.Info().current_w, pg.display.Info().current_h
883
+ clock = pg.time.Clock()
884
+ ERROR_Font = pg.font.SysFont(None, int(up / 25.))
885
+ w = True
886
+ e = traceback.format_exc()
887
+ errors = []
888
+ errors.append(e)
889
+ er = "\n".join(errors)
890
+ print(er)
891
+ RENDER = []
892
+ Time = 0
893
+ error_lines = er.splitlines() if er else []
894
+ global VERSION
895
+ fatal_errors = [
896
+ ("FATAL ERROR :(", (255, 0, 0)),
897
+ ("", (0, 0, 0)),
898
+ (f"Platform: {platform.platform()}", (255, 255, 0)),
899
+ (f"PyGame version: {pg.__version__}", (255, 255, 0)),
900
+ (f"Python version: {sys.version}", (255, 255, 0)),
901
+ (f"_sdl2 version: {".".join(map(str, pg.get_sdl_version()))}", (255, 255, 0)),
902
+ (f"Engine version: {VERSION}", (255, 255, 0)),
903
+ ("", (0, 0, 0)),
904
+ (f"Date: {datetime.now().strftime('%Y-%m-%d %H:%M:%S')}", (255, 255, 0)),
905
+ ("", (0, 0, 0))
906
+ ]
907
+
908
+ while w:
909
+ for ev in pg.event.get():
910
+ if not error_lines and not fatal_errors:
911
+ if ev.type == pg.QUIT: w = False; break
912
+ if ev.type == pg.KEYDOWN: w = False; break
913
+ if ev.type == pg.MOUSEBUTTONDOWN: w = False; break
914
+ screen.fill((0, 0, 0))
915
+ for index in range(len(RENDER)):
916
+ render = RENDER[index]
917
+ #screen.blit(render, (left / 2 - render.get_size()[0] / 2, index * render.get_size()[1]))
918
+ screen.blit(render, (0., index * render.get_size()[1]))
919
+
920
+ if Time == 0:
921
+ Time = 0
922
+ if fatal_errors:
923
+ text, color = fatal_errors[0]
924
+ RENDER.append(ERROR_Font.render(text, True, color))
925
+ del fatal_errors[0]
926
+ elif error_lines:
927
+ RENDER.append(ERROR_Font.render(error_lines[0], True, (255, 255, 255)))
928
+ del error_lines[0]
929
+ else: Time += 1
930
+ clock.tick(30)
931
+ pg.display.update()
@@ -0,0 +1,25 @@
1
+ Metadata-Version: 2.4
2
+ Name: Vertex2D
3
+ Version: 1.0.0
4
+ Summary: Простой движок-api с использованием видеокарты
5
+ Author-email: Teme20xx <jgh71346@gmail.com>
6
+ Project-URL: Homepage, https://t.me/+JV288wfV0SMxNzky
7
+ Requires-Python: >=3.7
8
+ Description-Content-Type: text/markdown
9
+ Requires-Dist: pygame-ce>=2.3.0
10
+
11
+
12
+ Это простой фреймворк (или движок) для создания графических приложений (игр) на рендере видеокарты.
13
+ установка: pip install Vertex
14
+
15
+ пример максимальн базового кода (версия 1.0.0):
16
+ import Vertex # импортируем библиотеку
17
+ vertex = Vertex.Build("базовое окно", 600, 400) #создаем окно
18
+ def Main():
19
+ Api = vertex.GetFell() #получаем доступ к библиотеке (его Api)
20
+ Api.NewCanvas((75, 75, 75, 255)) #цвет фона
21
+ Api.AllDraw() #теперь рисует все на окно
22
+ vertex.NewScene("Main", main.run) #создаем сцену
23
+ vertex.SetScene("Main") #устанавливаем сцену
24
+ vertex.run() #запускаем
25
+ vertex.Destroy() #уничтожаем
@@ -0,0 +1,8 @@
1
+ README.md
2
+ Vertex.py
3
+ pyproject.toml
4
+ Vertex2D.egg-info/PKG-INFO
5
+ Vertex2D.egg-info/SOURCES.txt
6
+ Vertex2D.egg-info/dependency_links.txt
7
+ Vertex2D.egg-info/requires.txt
8
+ Vertex2D.egg-info/top_level.txt
@@ -0,0 +1 @@
1
+ pygame-ce>=2.3.0
@@ -0,0 +1 @@
1
+ Vertex
@@ -0,0 +1,18 @@
1
+ [build-system]
2
+ requires = ["setuptools>=61.0"]
3
+ build-backend = "setuptools.build_meta"
4
+
5
+ [project]
6
+ name = "Vertex2D"
7
+ version = "1.0.0"
8
+ description = "Простой движок-api с использованием видеокарты"
9
+ authors = [{ name="Teme20xx", email="jgh71346@gmail.com" }]
10
+ readme = "README.md"
11
+ requires-python = ">=3.7"
12
+ dependencies = ["pygame-ce>=2.3.0"]
13
+
14
+ [project.urls]
15
+ "Homepage" = "https://t.me/+JV288wfV0SMxNzky"
16
+
17
+ [tool.setuptools]
18
+ py-modules = ["Vertex"]
@@ -0,0 +1,4 @@
1
+ [egg_info]
2
+ tag_build =
3
+ tag_date = 0
4
+