aether-engine 1.0.0__tar.gz → 1.0.2__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.
- aether_engine-1.0.2/PKG-INFO +500 -0
- aether_engine-1.0.2/README.md +449 -0
- aether_engine-1.0.2/aether/__init__.py +1 -0
- aether_engine-1.0.2/aether/core/engine.py +211 -0
- aether_engine-1.0.2/aether_engine.egg-info/PKG-INFO +500 -0
- {aether_engine-1.0.0 → aether_engine-1.0.2}/aether_engine.egg-info/requires.txt +9 -5
- aether_engine-1.0.2/setup.py +132 -0
- aether_engine-1.0.0/PKG-INFO +0 -71
- aether_engine-1.0.0/README.md +0 -32
- aether_engine-1.0.0/aether/__init__.py +0 -54
- aether_engine-1.0.0/aether/core/engine.py +0 -50
- aether_engine-1.0.0/aether_engine.egg-info/PKG-INFO +0 -71
- aether_engine-1.0.0/setup.py +0 -54
- {aether_engine-1.0.0 → aether_engine-1.0.2}/LICENSE +0 -0
- {aether_engine-1.0.0 → aether_engine-1.0.2}/MANIFEST.in +0 -0
- {aether_engine-1.0.0 → aether_engine-1.0.2}/aether/ai/behavior_tree.py +0 -0
- {aether_engine-1.0.0 → aether_engine-1.0.2}/aether/ai/navmesh.py +0 -0
- {aether_engine-1.0.0 → aether_engine-1.0.2}/aether/animation/skeleton.py +0 -0
- {aether_engine-1.0.0 → aether_engine-1.0.2}/aether/assets/asset_pipeline.py +0 -0
- {aether_engine-1.0.0 → aether_engine-1.0.2}/aether/audio/__init__.py +0 -0
- {aether_engine-1.0.0 → aether_engine-1.0.2}/aether/audio/audio_manager.py +0 -0
- {aether_engine-1.0.0 → aether_engine-1.0.2}/aether/audio/music.py +0 -0
- {aether_engine-1.0.0 → aether_engine-1.0.2}/aether/audio/sound.py +0 -0
- {aether_engine-1.0.0 → aether_engine-1.0.2}/aether/core/__init__.py +0 -0
- {aether_engine-1.0.0 → aether_engine-1.0.2}/aether/core/achievement_system.py +0 -0
- {aether_engine-1.0.0 → aether_engine-1.0.2}/aether/core/application.py +0 -0
- {aether_engine-1.0.0 → aether_engine-1.0.2}/aether/core/config.py +0 -0
- {aether_engine-1.0.0 → aether_engine-1.0.2}/aether/core/console.py +0 -0
- {aether_engine-1.0.0 → aether_engine-1.0.2}/aether/core/event_bus.py +0 -0
- {aether_engine-1.0.0 → aether_engine-1.0.2}/aether/core/input.py +0 -0
- {aether_engine-1.0.0 → aether_engine-1.0.2}/aether/core/plugin_system.py +0 -0
- {aether_engine-1.0.0 → aether_engine-1.0.2}/aether/core/save_system.py +0 -0
- {aether_engine-1.0.0 → aether_engine-1.0.2}/aether/core/time_manager.py +0 -0
- {aether_engine-1.0.0 → aether_engine-1.0.2}/aether/core/window.py +0 -0
- {aether_engine-1.0.0 → aether_engine-1.0.2}/aether/editor/gizmo.py +0 -0
- {aether_engine-1.0.0 → aether_engine-1.0.2}/aether/editor/imgui_integration.py +0 -0
- {aether_engine-1.0.0 → aether_engine-1.0.2}/aether/environment/environment_system.py +0 -0
- {aether_engine-1.0.0 → aether_engine-1.0.2}/aether/graphics/__init__.py +0 -0
- {aether_engine-1.0.0 → aether_engine-1.0.2}/aether/graphics/camera.py +0 -0
- {aether_engine-1.0.0 → aether_engine-1.0.2}/aether/graphics/framebuffer.py +0 -0
- {aether_engine-1.0.0 → aether_engine-1.0.2}/aether/graphics/light.py +0 -0
- {aether_engine-1.0.0 → aether_engine-1.0.2}/aether/graphics/lod_system.py +0 -0
- {aether_engine-1.0.0 → aether_engine-1.0.2}/aether/graphics/material.py +0 -0
- {aether_engine-1.0.0 → aether_engine-1.0.2}/aether/graphics/mesh.py +0 -0
- {aether_engine-1.0.0 → aether_engine-1.0.2}/aether/graphics/mesh_factory.py +0 -0
- {aether_engine-1.0.0 → aether_engine-1.0.2}/aether/graphics/particle_system.py +0 -0
- {aether_engine-1.0.0 → aether_engine-1.0.2}/aether/graphics/post_process.py +0 -0
- {aether_engine-1.0.0 → aether_engine-1.0.2}/aether/graphics/renderer.py +0 -0
- {aether_engine-1.0.0 → aether_engine-1.0.2}/aether/graphics/shader.py +0 -0
- {aether_engine-1.0.0 → aether_engine-1.0.2}/aether/graphics/shader_library.py +0 -0
- {aether_engine-1.0.0 → aether_engine-1.0.2}/aether/graphics/sky_atmosphere.py +0 -0
- {aether_engine-1.0.0 → aether_engine-1.0.2}/aether/graphics/terrain.py +0 -0
- {aether_engine-1.0.0 → aether_engine-1.0.2}/aether/graphics/texture.py +0 -0
- {aether_engine-1.0.0 → aether_engine-1.0.2}/aether/graphics/water.py +0 -0
- {aether_engine-1.0.0 → aether_engine-1.0.2}/aether/network/network_manager.py +0 -0
- {aether_engine-1.0.0 → aether_engine-1.0.2}/aether/physics/__init__.py +0 -0
- {aether_engine-1.0.0 → aether_engine-1.0.2}/aether/physics/bullet_backend.py +0 -0
- {aether_engine-1.0.0 → aether_engine-1.0.2}/aether/physics/collider.py +0 -0
- {aether_engine-1.0.0 → aether_engine-1.0.2}/aether/physics/physics_world.py +0 -0
- {aether_engine-1.0.0 → aether_engine-1.0.2}/aether/physics/raycast.py +0 -0
- {aether_engine-1.0.0 → aether_engine-1.0.2}/aether/physics/rigidbody.py +0 -0
- {aether_engine-1.0.0 → aether_engine-1.0.2}/aether/platform/steam_api.py +0 -0
- {aether_engine-1.0.0 → aether_engine-1.0.2}/aether/resources/__init__.py +0 -0
- {aether_engine-1.0.0 → aether_engine-1.0.2}/aether/resources/asset_database.py +0 -0
- {aether_engine-1.0.0 → aether_engine-1.0.2}/aether/resources/loaders/obj_loader.py +0 -0
- {aether_engine-1.0.0 → aether_engine-1.0.2}/aether/resources/loaders/texture_loader.py +0 -0
- {aether_engine-1.0.0 → aether_engine-1.0.2}/aether/resources/resource_manager.py +0 -0
- {aether_engine-1.0.0 → aether_engine-1.0.2}/aether/resources/serialization.py +0 -0
- {aether_engine-1.0.0 → aether_engine-1.0.2}/aether/scene/__init__.py +0 -0
- {aether_engine-1.0.0 → aether_engine-1.0.2}/aether/scene/component.py +0 -0
- {aether_engine-1.0.0 → aether_engine-1.0.2}/aether/scene/entity.py +0 -0
- {aether_engine-1.0.0 → aether_engine-1.0.2}/aether/scene/scene.py +0 -0
- {aether_engine-1.0.0 → aether_engine-1.0.2}/aether/scene/scene_graph.py +0 -0
- {aether_engine-1.0.0 → aether_engine-1.0.2}/aether/scene/scene_manager.py +0 -0
- {aether_engine-1.0.0 → aether_engine-1.0.2}/aether/ui/__init__.py +0 -0
- {aether_engine-1.0.0 → aether_engine-1.0.2}/aether/ui/button.py +0 -0
- {aether_engine-1.0.0 → aether_engine-1.0.2}/aether/ui/canvas.py +0 -0
- {aether_engine-1.0.0 → aether_engine-1.0.2}/aether/ui/text.py +0 -0
- {aether_engine-1.0.0 → aether_engine-1.0.2}/aether/utils/__init__.py +0 -0
- {aether_engine-1.0.0 → aether_engine-1.0.2}/aether/utils/logger.py +0 -0
- {aether_engine-1.0.0 → aether_engine-1.0.2}/aether/utils/math_utils.py +0 -0
- {aether_engine-1.0.0 → aether_engine-1.0.2}/aether/utils/object_pool.py +0 -0
- {aether_engine-1.0.0 → aether_engine-1.0.2}/aether/utils/profiler.py +0 -0
- {aether_engine-1.0.0 → aether_engine-1.0.2}/aether_engine.egg-info/SOURCES.txt +0 -0
- {aether_engine-1.0.0 → aether_engine-1.0.2}/aether_engine.egg-info/dependency_links.txt +0 -0
- {aether_engine-1.0.0 → aether_engine-1.0.2}/aether_engine.egg-info/top_level.txt +0 -0
- {aether_engine-1.0.0 → aether_engine-1.0.2}/examples/01_hello_cube.py +0 -0
- {aether_engine-1.0.0 → aether_engine-1.0.2}/examples/02_sphere_scene.py +0 -0
- {aether_engine-1.0.0 → aether_engine-1.0.2}/pyproject.toml +0 -0
- {aether_engine-1.0.0 → aether_engine-1.0.2}/setup.cfg +0 -0
|
@@ -0,0 +1,500 @@
|
|
|
1
|
+
Metadata-Version: 2.4
|
|
2
|
+
Name: aether-engine
|
|
3
|
+
Version: 1.0.2
|
|
4
|
+
Summary: Полноценный 3D игровой движок на Python с OpenGL
|
|
5
|
+
Home-page: https://pypi.org/project/aether-engine/
|
|
6
|
+
Author: entiti937
|
|
7
|
+
Classifier: Development Status :: 4 - Beta
|
|
8
|
+
Classifier: Intended Audience :: Developers
|
|
9
|
+
Classifier: Topic :: Games/Entertainment
|
|
10
|
+
Classifier: Topic :: Multimedia :: Graphics :: 3D Rendering
|
|
11
|
+
Classifier: License :: OSI Approved :: MIT License
|
|
12
|
+
Classifier: Programming Language :: Python :: 3
|
|
13
|
+
Classifier: Programming Language :: Python :: 3.10
|
|
14
|
+
Classifier: Programming Language :: Python :: 3.11
|
|
15
|
+
Classifier: Programming Language :: Python :: 3.12
|
|
16
|
+
Classifier: Programming Language :: Python :: 3.13
|
|
17
|
+
Classifier: Programming Language :: Python :: 3.14
|
|
18
|
+
Classifier: Operating System :: OS Independent
|
|
19
|
+
Requires-Python: >=3.10
|
|
20
|
+
Description-Content-Type: text/plain
|
|
21
|
+
License-File: LICENSE
|
|
22
|
+
Requires-Dist: numpy>=1.24
|
|
23
|
+
Requires-Dist: glfw>=2.6
|
|
24
|
+
Requires-Dist: PyOpenGL>=3.1.7
|
|
25
|
+
Requires-Dist: Pillow>=10.0
|
|
26
|
+
Provides-Extra: audio
|
|
27
|
+
Requires-Dist: pygame>=2.5; extra == "audio"
|
|
28
|
+
Provides-Extra: physics
|
|
29
|
+
Requires-Dist: pymunk>=6.0; extra == "physics"
|
|
30
|
+
Provides-Extra: imgui
|
|
31
|
+
Requires-Dist: imgui-bundle>=1.0; extra == "imgui"
|
|
32
|
+
Provides-Extra: full
|
|
33
|
+
Requires-Dist: trimesh>=3.21; extra == "full"
|
|
34
|
+
Requires-Dist: imgui-bundle>=1.0; extra == "full"
|
|
35
|
+
Requires-Dist: noise>=1.2; extra == "full"
|
|
36
|
+
Requires-Dist: pymunk>=6.0; extra == "full"
|
|
37
|
+
Requires-Dist: pyyaml>=6.0; extra == "full"
|
|
38
|
+
Requires-Dist: imageio>=2.31; extra == "full"
|
|
39
|
+
Requires-Dist: pygame>=2.5; extra == "full"
|
|
40
|
+
Requires-Dist: freetype-py>=2.4; extra == "full"
|
|
41
|
+
Dynamic: author
|
|
42
|
+
Dynamic: classifier
|
|
43
|
+
Dynamic: description
|
|
44
|
+
Dynamic: description-content-type
|
|
45
|
+
Dynamic: home-page
|
|
46
|
+
Dynamic: license-file
|
|
47
|
+
Dynamic: provides-extra
|
|
48
|
+
Dynamic: requires-dist
|
|
49
|
+
Dynamic: requires-python
|
|
50
|
+
Dynamic: summary
|
|
51
|
+
|
|
52
|
+
AETHER ENGINE
|
|
53
|
+
============
|
|
54
|
+
|
|
55
|
+
Полноценный 3D игровой движок на Python с OpenGL 4.6
|
|
56
|
+
Автор: entiti937 | Версия: 1.0.2 | Лицензия: MIT
|
|
57
|
+
PyPI: https://pypi.org/project/aether-engine/
|
|
58
|
+
|
|
59
|
+
|
|
60
|
+
УСТАНОВКА
|
|
61
|
+
--------
|
|
62
|
+
|
|
63
|
+
Базовая:
|
|
64
|
+
pip install aether-engine
|
|
65
|
+
|
|
66
|
+
С аудио:
|
|
67
|
+
pip install aether-engine[audio]
|
|
68
|
+
|
|
69
|
+
С физикой:
|
|
70
|
+
pip install aether-engine[physics]
|
|
71
|
+
|
|
72
|
+
Полная:
|
|
73
|
+
pip install aether-engine[full]
|
|
74
|
+
|
|
75
|
+
|
|
76
|
+
БЫСТРЫЙ СТАРТ
|
|
77
|
+
-------------
|
|
78
|
+
|
|
79
|
+
Создайте файл main.py:
|
|
80
|
+
|
|
81
|
+
from aether.core.engine import Engine
|
|
82
|
+
from aether.scene.scene import Scene
|
|
83
|
+
from aether.scene.entity import Entity
|
|
84
|
+
from aether.scene.component import Transform, MeshRenderer
|
|
85
|
+
from aether.graphics.mesh_factory import MeshFactory
|
|
86
|
+
from aether.graphics.material import Material
|
|
87
|
+
from aether.graphics.camera import Camera
|
|
88
|
+
|
|
89
|
+
engine = Engine(1280, 720, "Моя игра")
|
|
90
|
+
scene = Scene("MainScene")
|
|
91
|
+
camera = Camera(position=(0, 2, 8))
|
|
92
|
+
scene.set_main_camera(camera)
|
|
93
|
+
|
|
94
|
+
cube = Entity("Player")
|
|
95
|
+
cube.add_component(Transform(position=(0, 1, 0)))
|
|
96
|
+
cube.add_component(MeshRenderer(mesh=MeshFactory.create_cube(), material=Material()))
|
|
97
|
+
scene.spawn(cube)
|
|
98
|
+
|
|
99
|
+
engine.load_scene(scene)
|
|
100
|
+
engine.run()
|
|
101
|
+
|
|
102
|
+
Запустите:
|
|
103
|
+
python main.py
|
|
104
|
+
|
|
105
|
+
Управление: WASD - движение, мышь - поворот, ESC - выход.
|
|
106
|
+
|
|
107
|
+
|
|
108
|
+
СОЗДАНИЕ ОКНА И СЦЕНЫ
|
|
109
|
+
---------------------
|
|
110
|
+
|
|
111
|
+
Настройка движка:
|
|
112
|
+
from aether.core.engine import Engine
|
|
113
|
+
from aether.core.config import EngineConfig
|
|
114
|
+
|
|
115
|
+
config = EngineConfig()
|
|
116
|
+
config.app_name = "Моя RPG"
|
|
117
|
+
config.graphics.width = 1920
|
|
118
|
+
config.graphics.height = 1080
|
|
119
|
+
engine = Engine(config=config)
|
|
120
|
+
|
|
121
|
+
# Или просто
|
|
122
|
+
engine = Engine(1280, 720, "Моя игра")
|
|
123
|
+
|
|
124
|
+
Работа со сценами:
|
|
125
|
+
from aether.scene.scene import Scene
|
|
126
|
+
from aether.scene.scene_manager import SceneManager
|
|
127
|
+
|
|
128
|
+
menu = Scene("Menu")
|
|
129
|
+
game = Scene("Game")
|
|
130
|
+
manager = SceneManager()
|
|
131
|
+
manager.register_scene(menu)
|
|
132
|
+
manager.register_scene(game)
|
|
133
|
+
manager.load_scene("Game")
|
|
134
|
+
manager.transition_to("Menu", transition_time=1.0)
|
|
135
|
+
|
|
136
|
+
|
|
137
|
+
ENTITY И КОМПОНЕНТЫ
|
|
138
|
+
-------------------
|
|
139
|
+
|
|
140
|
+
Создание объекта:
|
|
141
|
+
from aether.scene.entity import Entity
|
|
142
|
+
from aether.scene.component import Transform, MeshRenderer, RigidbodyComponent
|
|
143
|
+
|
|
144
|
+
player = Entity("Player", tag="player")
|
|
145
|
+
player.add_component(Transform(position=(0, 2, 0), rotation=(0, 45, 0), scale=(1, 1, 1)))
|
|
146
|
+
player.add_component(MeshRenderer(mesh=MeshFactory.create_cube(), material=Material()))
|
|
147
|
+
player.add_component(RigidbodyComponent(mass=75.0, use_gravity=True))
|
|
148
|
+
scene.spawn(player)
|
|
149
|
+
|
|
150
|
+
Доступ к компонентам:
|
|
151
|
+
transform = player.get_component("Transform")
|
|
152
|
+
transform.translate(0, 0, 1)
|
|
153
|
+
transform.rotate(0, 10, 0)
|
|
154
|
+
|
|
155
|
+
mesh = player.get_component("MeshRenderer")
|
|
156
|
+
mesh.visible = False
|
|
157
|
+
|
|
158
|
+
Свой компонент:
|
|
159
|
+
from aether.scene.component import Component
|
|
160
|
+
|
|
161
|
+
class HealthComponent(Component):
|
|
162
|
+
def __init__(self, max_hp=100):
|
|
163
|
+
super().__init__()
|
|
164
|
+
self.max_hp = max_hp
|
|
165
|
+
self.hp = max_hp
|
|
166
|
+
|
|
167
|
+
def update(self, dt):
|
|
168
|
+
if self.hp <= 0:
|
|
169
|
+
print(f"{self.entity.name} died!")
|
|
170
|
+
|
|
171
|
+
def take_damage(self, amount):
|
|
172
|
+
self.hp -= amount
|
|
173
|
+
|
|
174
|
+
player.add_component(HealthComponent(100))
|
|
175
|
+
|
|
176
|
+
|
|
177
|
+
КАМЕРА
|
|
178
|
+
------
|
|
179
|
+
|
|
180
|
+
from aether.graphics.camera import Camera
|
|
181
|
+
|
|
182
|
+
camera = Camera(position=(0, 5, 15), yaw=-90, pitch=-20, fov=60)
|
|
183
|
+
scene.set_main_camera(camera)
|
|
184
|
+
camera.move_forward(dt)
|
|
185
|
+
camera.move_left(dt)
|
|
186
|
+
camera.rotate(dx, dy)
|
|
187
|
+
|
|
188
|
+
|
|
189
|
+
ОСВЕЩЕНИЕ
|
|
190
|
+
---------
|
|
191
|
+
|
|
192
|
+
from aether.graphics.light import DirectionalLight, PointLight, SpotLight
|
|
193
|
+
|
|
194
|
+
sun = DirectionalLight(direction=(0.5, -1, 0.3), color=(1.0, 0.95, 0.8), intensity=1.5)
|
|
195
|
+
lamp = PointLight(position=(0, 3, 0), color=(1.0, 0.8, 0.6), intensity=2.0, range=15.0)
|
|
196
|
+
flashlight = SpotLight(position=(0, 2, 0), direction=(0, 0, -1), intensity=3.0)
|
|
197
|
+
|
|
198
|
+
|
|
199
|
+
МАТЕРИАЛЫ И ТЕКСТУРЫ
|
|
200
|
+
--------------------
|
|
201
|
+
|
|
202
|
+
from aether.graphics.material import Material
|
|
203
|
+
from aether.graphics.texture import Texture
|
|
204
|
+
|
|
205
|
+
mat = Material("Metal")
|
|
206
|
+
mat.albedo = (0.8, 0.2, 0.2)
|
|
207
|
+
mat.metallic = 1.0
|
|
208
|
+
mat.roughness = 0.3
|
|
209
|
+
mat.albedo_map = Texture("textures/rust.png")
|
|
210
|
+
mat.normal_map = Texture("textures/rust_normal.png")
|
|
211
|
+
|
|
212
|
+
|
|
213
|
+
ФИЗИКА
|
|
214
|
+
------
|
|
215
|
+
|
|
216
|
+
Встроенная (AABB):
|
|
217
|
+
from aether.physics.collider import BoxCollider, SphereCollider
|
|
218
|
+
from aether.scene.component import RigidbodyComponent
|
|
219
|
+
|
|
220
|
+
body = RigidbodyComponent(mass=10.0, use_gravity=True)
|
|
221
|
+
entity.add_component(body)
|
|
222
|
+
entity.add_component(BoxCollider(size=(1, 1, 1)))
|
|
223
|
+
body.add_force((0, 100, 0))
|
|
224
|
+
body.add_impulse((0, 0, 50))
|
|
225
|
+
|
|
226
|
+
Raycast:
|
|
227
|
+
from aether.physics.raycast import Ray, raycast
|
|
228
|
+
|
|
229
|
+
ray = Ray(origin=(0, 10, 0), direction=(0, -1, 0))
|
|
230
|
+
hit = physics_world.raycast(ray.origin, ray.direction)
|
|
231
|
+
if hit.hit:
|
|
232
|
+
print(f"Попадание в {hit.entity.name}")
|
|
233
|
+
|
|
234
|
+
PyBullet (опционально):
|
|
235
|
+
from aether.physics.bullet_backend import BulletPhysicsBackend
|
|
236
|
+
|
|
237
|
+
bullet = BulletPhysicsBackend()
|
|
238
|
+
bullet.initialize(gravity=(0, -9.81, 0))
|
|
239
|
+
body_id = bullet.create_rigid_body("my_entity", mass=1.0, shape_type="box", dimensions=(1,1,1), position=(0,5,0))
|
|
240
|
+
bullet.step(dt)
|
|
241
|
+
|
|
242
|
+
|
|
243
|
+
СИСТЕМА ЧАСТИЦ
|
|
244
|
+
--------------
|
|
245
|
+
|
|
246
|
+
from aether.graphics.particle_system import ParticleEmitter
|
|
247
|
+
|
|
248
|
+
fire = ParticleEmitter(max_particles=1000)
|
|
249
|
+
fire.position = (0, 1, 0)
|
|
250
|
+
fire.emission_rate = 200
|
|
251
|
+
fire.start_color = (1.0, 0.5, 0.0, 1.0)
|
|
252
|
+
fire.end_color = (1.0, 0.0, 0.0, 0.0)
|
|
253
|
+
fire.velocity = (0, 3, 0)
|
|
254
|
+
|
|
255
|
+
fire.update(dt)
|
|
256
|
+
fire.render(view, projection)
|
|
257
|
+
|
|
258
|
+
|
|
259
|
+
ТЕРРАЙН
|
|
260
|
+
-------
|
|
261
|
+
|
|
262
|
+
from aether.graphics.terrain import Terrain
|
|
263
|
+
|
|
264
|
+
terrain = Terrain(width=512, depth=512, max_height=100)
|
|
265
|
+
terrain.generate_height_map(seed=42, octaves=6)
|
|
266
|
+
terrain.generate_chunks()
|
|
267
|
+
height = terrain.get_height(world_x, world_z)
|
|
268
|
+
terrain.render(view, projection, camera_position)
|
|
269
|
+
|
|
270
|
+
|
|
271
|
+
ВОДА
|
|
272
|
+
----
|
|
273
|
+
|
|
274
|
+
from aether.graphics.water import WaterBody
|
|
275
|
+
|
|
276
|
+
water = WaterBody(size=100, resolution=256, position=(0, 0, 0))
|
|
277
|
+
water.wave_speed = 1.5
|
|
278
|
+
water.water_color = (0.0, 0.3, 0.6)
|
|
279
|
+
water.update(dt)
|
|
280
|
+
water.render(view, projection, camera_position)
|
|
281
|
+
|
|
282
|
+
|
|
283
|
+
НЕБО И АТМОСФЕРА
|
|
284
|
+
----------------
|
|
285
|
+
|
|
286
|
+
from aether.graphics.sky_atmosphere import SkyDome
|
|
287
|
+
|
|
288
|
+
sky = SkyDome(radius=500)
|
|
289
|
+
sky.set_time_of_day(12.0) # Полдень
|
|
290
|
+
sky.render(view, projection)
|
|
291
|
+
|
|
292
|
+
|
|
293
|
+
ОКРУЖЕНИЕ
|
|
294
|
+
---------
|
|
295
|
+
|
|
296
|
+
from aether.environment.environment_system import EnvironmentSystem, Weather, Season
|
|
297
|
+
|
|
298
|
+
env = EnvironmentSystem()
|
|
299
|
+
env.set_weather(Weather.RAIN)
|
|
300
|
+
env.set_time(18, 30, 0)
|
|
301
|
+
env.set_season(Season.WINTER)
|
|
302
|
+
env.update(dt)
|
|
303
|
+
|
|
304
|
+
|
|
305
|
+
AI И НАВИГАЦИЯ
|
|
306
|
+
--------------
|
|
307
|
+
|
|
308
|
+
Деревья поведения:
|
|
309
|
+
from aether.ai.behavior_tree import BehaviorTree, Sequence, Selector, IsEnemyNearby, AttackTarget
|
|
310
|
+
|
|
311
|
+
bt = BehaviorTree()
|
|
312
|
+
root = Selector("Root")
|
|
313
|
+
attack = Sequence("Attack")
|
|
314
|
+
attack.add_child(IsEnemyNearby(radius=5.0))
|
|
315
|
+
attack.add_child(AttackTarget(damage=10.0))
|
|
316
|
+
root.add_child(attack)
|
|
317
|
+
bt.set_root(root)
|
|
318
|
+
bt.set_context("entity", enemy)
|
|
319
|
+
bt.set_context("target", player)
|
|
320
|
+
bt.tick()
|
|
321
|
+
|
|
322
|
+
NavMesh:
|
|
323
|
+
from aether.ai.navmesh import NavMeshBuilder
|
|
324
|
+
|
|
325
|
+
navmesh = NavMeshBuilder.build_from_grid(origin=(0,0,0), size_x=100, size_z=100, cell_size=1.0)
|
|
326
|
+
path = navmesh.find_path(start_pos, end_pos)
|
|
327
|
+
smoothed = navmesh.smooth_path(path)
|
|
328
|
+
|
|
329
|
+
|
|
330
|
+
АУДИО
|
|
331
|
+
-----
|
|
332
|
+
|
|
333
|
+
from aether.audio.audio_manager import AudioManager
|
|
334
|
+
|
|
335
|
+
audio = AudioManager()
|
|
336
|
+
audio.load_sound("explosion", "sounds/explosion.wav")
|
|
337
|
+
audio.play_sound("explosion", volume=0.8)
|
|
338
|
+
audio.play_music("music/background.mp3", loop=True)
|
|
339
|
+
audio.set_master_volume(0.7)
|
|
340
|
+
|
|
341
|
+
|
|
342
|
+
UI
|
|
343
|
+
--
|
|
344
|
+
|
|
345
|
+
from aether.ui.canvas import Canvas
|
|
346
|
+
from aether.ui.button import Button, Panel, Label
|
|
347
|
+
|
|
348
|
+
canvas = Canvas(1920, 1080)
|
|
349
|
+
|
|
350
|
+
def on_click():
|
|
351
|
+
print("Нажали!")
|
|
352
|
+
|
|
353
|
+
btn = Button("Начать игру", x=100, y=100, width=200, height=50, callback=on_click)
|
|
354
|
+
panel = Panel(x=50, y=50, width=400, height=300)
|
|
355
|
+
panel.title = "Инвентарь"
|
|
356
|
+
canvas.add(panel)
|
|
357
|
+
canvas.add(btn)
|
|
358
|
+
canvas.update(dt, mouse_x, mouse_y, mouse_pressed, mouse_just_pressed)
|
|
359
|
+
canvas.render()
|
|
360
|
+
|
|
361
|
+
|
|
362
|
+
СЕТЬ
|
|
363
|
+
----
|
|
364
|
+
|
|
365
|
+
Сервер:
|
|
366
|
+
from aether.network.network_manager import NetworkServer
|
|
367
|
+
|
|
368
|
+
server = NetworkServer(max_clients=32)
|
|
369
|
+
server.start(host="0.0.0.0", port=7777)
|
|
370
|
+
|
|
371
|
+
Клиент:
|
|
372
|
+
from aether.network.network_manager import NetworkClient
|
|
373
|
+
|
|
374
|
+
client = NetworkClient("Player1")
|
|
375
|
+
client.connect("127.0.0.1", 7777)
|
|
376
|
+
client.send(NetworkMessage("chat", {"text": "Привет!"}))
|
|
377
|
+
|
|
378
|
+
|
|
379
|
+
СОХРАНЕНИЯ
|
|
380
|
+
----------
|
|
381
|
+
|
|
382
|
+
from aether.core.save_system import SaveSystem, SaveData
|
|
383
|
+
|
|
384
|
+
save_system = SaveSystem()
|
|
385
|
+
data = SaveData("save_01")
|
|
386
|
+
data.set_custom("health", 85)
|
|
387
|
+
save_system.save(slot_id=0, save_data=data)
|
|
388
|
+
loaded = save_system.load(slot_id=0)
|
|
389
|
+
|
|
390
|
+
|
|
391
|
+
ДОСТИЖЕНИЯ
|
|
392
|
+
----------
|
|
393
|
+
|
|
394
|
+
from aether.core.achievement_system import AchievementSystem
|
|
395
|
+
|
|
396
|
+
achievements = AchievementSystem()
|
|
397
|
+
achievements.register_achievement("first_kill", "Первая кровь", points=10)
|
|
398
|
+
achievements.increment_stat("kills")
|
|
399
|
+
|
|
400
|
+
|
|
401
|
+
КОНСОЛЬ РАЗРАБОТЧИКА
|
|
402
|
+
--------------------
|
|
403
|
+
|
|
404
|
+
from aether.core.console import Console
|
|
405
|
+
|
|
406
|
+
console = Console()
|
|
407
|
+
console.register_command("spawn", spawn_enemy)
|
|
408
|
+
console.register_variable("g_difficulty", 2, "Сложность", 1, 5)
|
|
409
|
+
console.execute("spawn 5")
|
|
410
|
+
|
|
411
|
+
|
|
412
|
+
РЕДАКТОР (ImGui)
|
|
413
|
+
----------------
|
|
414
|
+
|
|
415
|
+
from aether.editor.imgui_integration import ImGuiManager, EditorLayout, HierarchyPanel, InspectorPanel
|
|
416
|
+
|
|
417
|
+
imgui = ImGuiManager()
|
|
418
|
+
imgui.initialize(window, 1920, 1080)
|
|
419
|
+
editor = EditorLayout()
|
|
420
|
+
editor.add_panel(HierarchyPanel())
|
|
421
|
+
editor.add_panel(InspectorPanel())
|
|
422
|
+
|
|
423
|
+
# В игровом цикле:
|
|
424
|
+
imgui.begin_frame()
|
|
425
|
+
editor.render(scene, console, profiler)
|
|
426
|
+
imgui.end_frame()
|
|
427
|
+
|
|
428
|
+
|
|
429
|
+
STEAM API
|
|
430
|
+
---------
|
|
431
|
+
|
|
432
|
+
from aether.platform.steam_api import SteamAPI
|
|
433
|
+
|
|
434
|
+
steam = SteamAPI()
|
|
435
|
+
steam.initialize(app_id=1234567)
|
|
436
|
+
steam.set_achievement("ACH_WIN_ONE_GAME")
|
|
437
|
+
steam.cloud_save("save.sav", data)
|
|
438
|
+
|
|
439
|
+
|
|
440
|
+
СТРУКТУРА ДВИЖКА
|
|
441
|
+
----------------
|
|
442
|
+
|
|
443
|
+
aether/
|
|
444
|
+
core/ - Ядро (Engine, Config, Input, Time, Console, SaveSystem)
|
|
445
|
+
graphics/ - Графика (Renderer, Shader, Mesh, Camera, Light, Water, Sky, Terrain, Particles)
|
|
446
|
+
scene/ - Сцена (Entity, Component, Scene, SceneGraph, SceneManager)
|
|
447
|
+
physics/ - Физика (PhysicsWorld, Collider, Rigidbody, Raycast, BulletBackend)
|
|
448
|
+
ai/ - AI (NavMesh, BehaviorTree)
|
|
449
|
+
network/ - Сеть (Client, Server)
|
|
450
|
+
audio/ - Аудио (AudioManager, Sound, Music)
|
|
451
|
+
ui/ - UI (Canvas, Button, Panel, Label, Font)
|
|
452
|
+
editor/ - Редактор (ImGui, Gizmo, DebugDraw)
|
|
453
|
+
environment/ - Окружение (TimeOfDay, Weather, Seasons)
|
|
454
|
+
resources/ - Ресурсы (ResourceManager, AssetDatabase, OBJ Loader, Texture Loader)
|
|
455
|
+
platform/ - Платформа (SteamAPI)
|
|
456
|
+
animation/ - Анимация (Skeleton, AnimationClip, Animator)
|
|
457
|
+
assets/ - Ассеты (AssetPipeline)
|
|
458
|
+
utils/ - Утилиты (Math, Logger, Profiler, ObjectPool)
|
|
459
|
+
|
|
460
|
+
|
|
461
|
+
ЗАВИСИМОСТИ
|
|
462
|
+
-----------
|
|
463
|
+
|
|
464
|
+
Базовая установка (обязательно):
|
|
465
|
+
numpy>=1.24, glfw>=2.6, PyOpenGL>=3.1.7, Pillow>=10.0
|
|
466
|
+
|
|
467
|
+
Аудио (опционально):
|
|
468
|
+
pygame>=2.5 (Python 3.10-3.12) или pygame-ce (Python 3.13+)
|
|
469
|
+
|
|
470
|
+
Физика (опционально):
|
|
471
|
+
PyBullet>=3.2.5 (требует Visual Studio Build Tools)
|
|
472
|
+
pymunk>=6.0 (альтернатива, не требует компиляции)
|
|
473
|
+
|
|
474
|
+
Полная установка:
|
|
475
|
+
Все выше + freetype-py, imgui, noise, pyyaml, imageio
|
|
476
|
+
|
|
477
|
+
Примечание по версиям Python:
|
|
478
|
+
Python 3.10-3.12: все пакеты доступны
|
|
479
|
+
Python 3.13+: используйте pygame-ce вместо pygame
|
|
480
|
+
Python 3.14+: PyBullet может не собраться, используйте pymunk
|
|
481
|
+
|
|
482
|
+
|
|
483
|
+
СИСТЕМНЫЕ ТРЕБОВАНИЯ
|
|
484
|
+
--------------------
|
|
485
|
+
|
|
486
|
+
Python 3.10+
|
|
487
|
+
OpenGL 4.6
|
|
488
|
+
Windows 10+ / Linux / macOS
|
|
489
|
+
Видеокарта с поддержкой OpenGL 4.6
|
|
490
|
+
4 GB RAM минимум
|
|
491
|
+
|
|
492
|
+
|
|
493
|
+
ЛИЦЕНЗИЯ
|
|
494
|
+
--------
|
|
495
|
+
|
|
496
|
+
MIT License. Используйте свободно в любых проектах.
|
|
497
|
+
|
|
498
|
+
|
|
499
|
+
Автор: entiti937
|
|
500
|
+
Версия: 1.0.2 - Исправлен импорт Engine и проблемы с новыми библеотеками, полная документация
|