Skip to content

Commit 39bbfe8

Browse files
committed
v9.5.0 Stable main work, GUI not work
1 parent 60fccb0 commit 39bbfe8

13 files changed

Lines changed: 197 additions & 211 deletions

Engine/Color.py

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -6,9 +6,9 @@ class Color:
66
negative = "\33[7m"
77

88
def rgb_background(r:int=0, g:int=0, b:int=0) -> str:
9-
"""Возвращает символ-код установки цвета фона"""
9+
"""Получение символ-кода установки цвета фона"""
1010
return f"\33[48;2;{r};{g};{b}m"
1111

1212
def rgb_text(r:int=0, g:int=0, b:int=0) -> str:
13-
"""Возвращает символ-код установки цвета основного текста"""
13+
"""Получение символ-кода установки цвета основного текста"""
1414
return f"\33[38;2;{r};{g};{b}m"

Engine/Console.py

Lines changed: 6 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -84,22 +84,23 @@ def print(self, data):
8484
self._send_(request)
8585

8686
def set_size(self, w:int, h:int):
87-
"""Изменение размера консоли"""
88-
if w > 255 or h > 255: return
89-
request = ((5).to_bytes(1, "little")) + ((w).to_bytes(1, "little")) + ((h).to_bytes(1, "little"))
87+
"""Смена размера консоли"""
88+
#if w > 255 or h > 255: return
89+
request = ((5).to_bytes(1, "little")) + ((w).to_bytes(2, "little")) + ((h).to_bytes(2, "little"))
9090
self._send_(request)
91-
time.sleep(0.1)
91+
time.sleep(0.3)
9292

9393
def set_title(self, title:str):
9494
"""Смена заголовка"""
9595
request = ((3).to_bytes(1, "little")) + title.encode()
9696
self._send_(request)
97-
time.sleep(0.01)
97+
time.sleep(0.3)
9898

9999
def set_icon(self, path:str):
100100
"""Смена иконки"""
101101
request = ((4).to_bytes(1, "little")) + path.encode()
102102
self._send_(request)
103+
time.sleep(0.3)
103104

104105
def close(self):
105106
"""Закрытие окна"""

Engine/GUITextbox.py

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -7,15 +7,14 @@ class Textbox(Element):
77
"""[GUI] Текстовое поле"""
88

99
def __init__(self, screen, style, x, y, text="", enable=True, maxLength=0, alphabet="123457890"):
10-
"""Коснтруктор\nПринимает: (Window) screen - окно в котором необходимо рисовать, (Style) style - стиль, (int) x - коорината x, (int) y - координата y, (string) text - текст, (bool) enable - состояние, (int) maxLength - максимальная длина текста, (string) alphabet - алфавит доступных для ввода символов"""
1110
super().__init__(screen, style, x, y, text, enable)
1211
self.value = ""
1312
self.maxLength = maxLength
1413
self.selected = False
1514
self.alphabet = alphabet
1615

1716
def __str__(self):
18-
"""Возвращает текст из текствого поля\nВозвращает: (string) - текст из текствого поля"""
17+
"""Возвращает текст из текствого поля"""
1918
return self.value
2019

2120
def click(self, obj):
@@ -32,7 +31,7 @@ def block(self):
3231
self.selected = False
3332

3433
def inputFromEvent(self,):
35-
"""Обработка нажатий клавиатуры\nПринимает: (Event) event - событие"""
34+
"""Обработка нажатий клавиатуры"""
3635
if not(self.selected): return
3736
if Input.eventType == Input.Types.Keyboard:
3837
if Input.keyboardState == Input.Keyboard.DOWN and not Input.prevKeyboardState:

Engine/Input.py

Lines changed: 18 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -57,7 +57,7 @@ class Input:
5757
"""Обработка входящих событий окна консоли"""
5858

5959
def init(useHotkey=False, lineInput=False, echo=False, resizeEvents=False, mouseEvents=False, insert=False, quickEdit=False, extended=False, handle=None):
60-
"""Включает получение событий\nПринимает: (bool) useHotkey - использование горячих клавиш, (bool) lineInput - описание отсутствует, (bool) echo - добавление в выходной массив, (bool) resizeEvents - принятие событий изменения размеров окна, (bool) mouseEvents - принятие событий мыши, (bool) insert - включает insert, (bool) quickEdit - выделение мышью, (bool) extended - запрет quickEdit"""
60+
"""Включает получение событий"""
6161
Input.handle = handle or ctypes.windll.kernel32.GetStdHandle(-10)
6262
Input.events = ctypes.wintypes.DWORD()
6363
Input.record = (INPUT_RECORD * 32)()
@@ -75,7 +75,7 @@ def init(useHotkey=False, lineInput=False, echo=False, resizeEvents=False, mouse
7575
ctypes.windll.kernel32.SetConsoleMode(Input.handle, out)
7676

7777
def tick():
78-
"""Получение и запись событий"""
78+
"""Получение событий"""
7979

8080
ctypes.windll.kernel32.ReadConsoleInputExW(Input.handle, ctypes.byref(Input.record), 16, ctypes.byref(Input.events), 2)
8181

@@ -88,32 +88,31 @@ def tick():
8888
event_type = event_record.EventType
8989
event = event_record.Event
9090

91-
# Event Type classification
9291
if event_type == 1:
93-
event_type = "keyboard"
92+
event_dict["type"] = "keyboard"
93+
event_dict["key_code"] = event.KeyEvent.wVirtualKeyCode
94+
event_dict["key_char"] = event.KeyEvent.uChar.UnicodeChar
95+
event_dict["key_state"] = event.KeyEvent.bKeyDown
9496

9597
elif event_type == 2:
96-
event_type = "mouse"
98+
event_dict["type"] = "mouse"
99+
event_dict["mouse_type"] = event.MouseEvent.dwEventFlags
100+
event_dict["mouse_x"] = event.MouseEvent.dwMousePosition.X
101+
event_dict["mouse_y"] = event.MouseEvent.dwMousePosition.Y
102+
event_dict["mouse_key"] = event.MouseEvent.dwButtonState
97103

98104
elif event_type == 4:
99-
event_type = "window"
105+
event_dict["type"] = "window"
106+
event_dict["window_x"] = event.WindowBufferSizeEvent.dwSize.X
107+
event_dict["window_y"] = event.WindowBufferSizeEvent.dwSize.Y
100108

101109
elif event_type == 8:
102-
event_type = "menu"
110+
event_dict["type"] = "menu"
111+
event_dict["menu"] = event.MenuEvent.dwCommandId
103112

104113
elif event_type == 16:
105-
event_type = "focus"
106-
107-
event_dict["type"] = event_type
108-
109-
event_dict["mouse_type"] = event.MouseEvent.dwEventFlags
110-
event_dict["x"] = event.MouseEvent.dwMousePosition.X
111-
event_dict["y"] = event.MouseEvent.dwMousePosition.Y
112-
event_dict["mouse_key"] = event.MouseEvent.dwButtonState
113-
114-
event_dict["key_code"] = event.KeyEvent.wVirtualKeyCode
115-
event_dict["key_char"] = event.KeyEvent.uChar.UnicodeChar
116-
event_dict["key_state"] = event.KeyEvent.bKeyDown
114+
event_dict["type"] = "focus"
115+
event_dict["focus"] = event.FocusEvent.bSetFocus
117116

118117
events_list.append(event_dict)
119118

Engine/Logging.py

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,7 @@ class Logging:
44
"""Запись отладочной информации в файл"""
55

66
def log(*text):
7-
"""Логирование в файл\nПринимает: (*strings) - строки для логгирования"""
7+
"""Логирование в файл"""
88
date = datetime.datetime.now()
99
file = open(f"{date.day}{date.month}{date.year}.log", "a")
1010

@@ -15,7 +15,7 @@ def log(*text):
1515
file.close()
1616

1717
def print(*text, end="\n"):
18-
"""Логирование в консольnПринимает: (*strings) - строки для логгирования"""
18+
"""Логирование в консоль"""
1919
date = datetime.datetime.now()
2020

2121
for i in text:

Engine/Output.py

Lines changed: 0 additions & 16 deletions
This file was deleted.

Engine/Performance.py

Lines changed: 0 additions & 19 deletions
This file was deleted.

Engine/Scene.py

Lines changed: 54 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -1,12 +1,20 @@
1+
import threading
2+
import time
3+
14
class Scene_Control:
25
"""Управления отображаемыми сценами"""
36

4-
def __init__(self):
7+
def __init__(self, update_time=0, frame_time=0.001):
58
self.scenes_list = {}
69
self.selected = ""
710
self.prev = ""
11+
self.update_time = max(update_time, 0)
12+
self.frame_time = max(frame_time, 0.001)
13+
self.enable = False
14+
self.last_frame_time = 0
15+
self.last_update_time = 0
816

9-
def set(self, name:str) -> None:
17+
def set(self, name:str):
1018
"""Установка сцены по имени"""
1119
if not (name in self.scenes_list):
1220
print(f"[ERROR][SCENE] Scene {self.selected} not defined in scenes list")
@@ -19,42 +27,75 @@ def set(self, name:str) -> None:
1927
self.selected = name
2028
self.scenes_list[self.selected].select()
2129

22-
def add(self, name:str, scene:object) -> None:
30+
def add(self, name:str, scene:object):
2331
"""Добавление сцены"""
2432
self.scenes_list[name] = scene
2533

26-
def add_from_dict(self, scenes:dict) -> None:
34+
def add_from_dict(self, scenes:dict):
2735
"""Импорт сцен из словаря"""
2836
for scene in scenes:
2937
self.add(scene, scenes[scene])
3038

31-
def play(self) -> None:
32-
"""Воспроизведение сцены"""
39+
def _draw_(self):
40+
time.sleep(self.frame_time)
41+
if not self.selected:
42+
print("[ERROR][SCENE][DRAW] Scene dont set")
43+
else:
44+
self.scenes_list[self.selected].draw()
45+
46+
def _update_(self):
47+
time.sleep(self.update_time)
3348
if not self.selected:
34-
print("[ERROR][SCENE] Scene dont set")
49+
print("[ERROR][SCENE][UPDATE] Scene dont set")
50+
self.enable = False
3551
else:
36-
self.scenes_list[self.selected].play()
52+
self.scenes_list[self.selected].update()
53+
54+
def play(self):
55+
"""Начинает воспроизведение сцены"""
56+
if not self.enable:
57+
self.enable = True
58+
while self.enable:
59+
60+
if not self.update_time or time.time() - self.last_update_time > self.update_time:
61+
threading.Thread(target=self._update_).start()
62+
self.last_update_time = time.time()
3763

38-
def remove(self, name:str) -> None:
64+
if not self.frame_time or time.time() - self.last_frame_time > self.frame_time:
65+
threading.Thread(target=self._draw_).start()
66+
self.last_frame_time = time.time()
67+
68+
def remove(self, name:str):
3969
"""Удаление сцены из списка"""
4070
self.scenes_list.pop(name)
4171

42-
def remove_all(self) -> None:
72+
def remove_all(self):
4373
"""Удаление всех сцен из списка"""
4474
for scene in self.scenes_list:
4575
self.remove(scene)
4676

77+
def stop(self):
78+
"""Остановка воспроизведения сцены"""
79+
self.enable = False
80+
4781
class Scene:
4882
"""Экземпляр сцены"""
4983

5084
def __init__(self, **kwargs):
5185
self.__dict__ = kwargs
5286

53-
def remove(self):
87+
def start(self):
88+
"""Выполняется при запуске сцены"""
5489
...
5590

56-
def play(self):
91+
def update(self):
92+
"""Метод для обновления логики прилоежния"""
5793
...
5894

59-
def select(self):
95+
def draw(self):
96+
"""Метод для обновления отрисовки приложения"""
97+
...
98+
99+
def remove(self):
100+
"""Вызывается при смене сцены"""
60101
...

Engine/Sub_Console.py

Lines changed: 12 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -16,7 +16,6 @@ class CONSOLE_SCREEN_BUFFER_INFO(ctypes.Structure):
1616
("dwMaximumWindowSize", ctypes.wintypes._COORD),
1717
]
1818

19-
2019
console_id = sys.argv[1]
2120

2221
pipe_in_name = r'\\.\pipe\consolein' + console_id
@@ -25,27 +24,23 @@ class CONSOLE_SCREEN_BUFFER_INFO(ctypes.Structure):
2524
pipe_in = win32file.CreateFile(
2625
pipe_in_name,
2726
win32file.GENERIC_READ | win32file.GENERIC_WRITE,
28-
0, None,
29-
win32file.OPEN_EXISTING,
30-
0, None
27+
0, None, win32file.OPEN_EXISTING, 0, None
3128
)
3229

3330
pipe_out = win32pipe.CreateNamedPipe(
3431
pipe_out_name,
35-
win32pipe.PIPE_ACCESS_DUPLEX, # доступ на чтение и запись
36-
win32pipe.PIPE_TYPE_MESSAGE | win32pipe.PIPE_WAIT,
37-
1, # количество экземпляров канала
38-
1024 * 1024 * 32, # размер выходного буфера
39-
1024 * 1024 * 32, # размер входного буфера
40-
0, # таймаут на соединение
41-
None # защита по умолчанию
32+
win32pipe.PIPE_ACCESS_DUPLEX,
33+
win32pipe.PIPE_TYPE_MESSAGE | win32pipe.PIPE_WAIT, 1,
34+
1024 * 1024 * 32,
35+
1024 * 1024 * 32,
36+
0, None
4237
)
4338

4439
win32pipe.ConnectNamedPipe(pipe_out, None)
4540
enable = True
4641

47-
ctypes.windll.kernel32.SetConsoleMode(ctypes.windll.kernel32.GetStdHandle(-11), 5)
48-
42+
out_handle = ctypes.windll.kernel32.GetStdHandle(-11)
43+
ctypes.windll.kernel32.SetConsoleMode(out_handle, 5)
4944
while enable:
5045
try:
5146
message = win32file.ReadFile(pipe_out, 1024 * 1024 * 32)
@@ -60,8 +55,8 @@ class CONSOLE_SCREEN_BUFFER_INFO(ctypes.Structure):
6055
quit()
6156

6257
elif command == 2:
63-
sys.stdout.write(content.decode())
64-
sys.stdout.flush()
58+
data = content.decode()
59+
ctypes.windll.kernel32.WriteConsoleW(out_handle, data, len(data), None, None)
6560

6661
elif command == 3:
6762
title = message[1][1:].decode()
@@ -73,8 +68,8 @@ class CONSOLE_SCREEN_BUFFER_INFO(ctypes.Structure):
7368
ctypes.windll.user32.SendMessageW(hwnd, 0x80, 0, icon_handle)
7469

7570
elif command == 5:
76-
w = int(message[1][1])
77-
h = int(message[1][2])
71+
w = int.from_bytes([message[1][1], message[1][2]], byteorder="little")
72+
h = int.from_bytes([message[1][3], message[1][4]], byteorder="little")
7873
os.system(f'mode con cols={w} lines={h}')
7974

8075
elif command == 6:

Engine/Symbol.py

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,6 @@
1+
class Symbol:
2+
"""Описывает символ в консоли"""
3+
def __init__(self, char:str=" ", background_color:str="", text_color:str=""):
4+
self.text_color = text_color
5+
self.background_color = background_color
6+
self.char = char

0 commit comments

Comments
 (0)