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.
- vertex2d-1.0.0/PKG-INFO +25 -0
- vertex2d-1.0.0/README.md +15 -0
- vertex2d-1.0.0/Vertex.py +931 -0
- vertex2d-1.0.0/Vertex2D.egg-info/PKG-INFO +25 -0
- vertex2d-1.0.0/Vertex2D.egg-info/SOURCES.txt +8 -0
- vertex2d-1.0.0/Vertex2D.egg-info/dependency_links.txt +1 -0
- vertex2d-1.0.0/Vertex2D.egg-info/requires.txt +1 -0
- vertex2d-1.0.0/Vertex2D.egg-info/top_level.txt +1 -0
- vertex2d-1.0.0/pyproject.toml +18 -0
- vertex2d-1.0.0/setup.cfg +4 -0
vertex2d-1.0.0/PKG-INFO
ADDED
|
@@ -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() #уничтожаем
|
vertex2d-1.0.0/README.md
ADDED
|
@@ -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() #уничтожаем
|
vertex2d-1.0.0/Vertex.py
ADDED
|
@@ -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 @@
|
|
|
1
|
+
|
|
@@ -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"]
|
vertex2d-1.0.0/setup.cfg
ADDED