2D game engine for Python with physics, collision detection, and texture support
Project description
Jwarol Engine
2D игровой движок для Python на C++ и pybind11. Полностью автономный — поддержка автозагрузки текстур из папки textures с определением назначения и системой анимации.
Установка
pip install jwarol==0.4.5
Текстуры и автозагрузка
Структура папок
my_game/
├── game.py
└── textures/
├── player.png # Автоматически определится как PLAYER
├── player_walk_1.png # Кадр анимации ходьбы
├── player_walk_2.png # Кадр анимации ходьбы
├── enemy.jpg # Автоматически определится как OBJECT
├── item_coin.png # Автоматически как ITEM
├── gui_button.png # Автоматически как GUI
└── effect_explosion.png # Спецэффект
Как работает автоопределение
Система анализирует имя файла и определяет назначение:
player*→PLAYERitem*→ITEMgui*→GUIeffect*илиfx*→EFFECT- остальное →
OBJECT
API для текстур и анимации
Загрузка текстур
# Ручная загрузка
tex_id = engine.load_texture(obj_id, "textures/player.png", "player_idle")
# Автозагрузка всей папки (автоопределение назначения)
engine.load_textures_from_folder("textures")
Работа с анимацией
# Создание анимации (длительность кадра 0.1 сек)
anim_id = engine.create_animation(0.1)
# Добавление кадров (используем загруженные текстуры)
engine.add_animation_frame(anim_id, tex_frame1)
engine.add_animation_frame(anim_id, tex_frame2)
engine.add_animation_frame(anim_id, tex_frame3)
# Обновление анимации в игровом цикле (возвращает ID текущей текстуры)
current_tex = engine.update_animation(anim_id, delta_time)
Быстрый старт
import jwarol
engine = jwarol.Engine()
engine.init(800, 600, "My Game")
player = engine.create_object(100, 100, 50, 50, jwarol.ObjectType.PLAYER)
# Загрузить все текстуры из папки textures
engine.load_textures_from_folder("textures")
while engine.is_open():
engine.clear(0.2, 0.2, 0.2)
engine.draw_rect(player, 0.0, 1.0, 0.0)
engine.update()
engine.close()
API Справочник
Типы объектов
jwarol.ObjectType.OBJECT # Обычный объект
jwarol.ObjectType.PLAYER # Игрок
jwarol.ObjectType.ITEM # Предмет
jwarol.ObjectType.GUI # Интерфейс
Коды клавиш
jwarol.VK_LEFT # 37 (стрелка влево)
jwarol.VK_UP # 38 (стрелка вверх)
jwarol.VK_RIGHT # 39 (стрелка вправо)
jwarol.VK_DOWN # 40 (стрелка вниз)
jwarol.VK_W # 87 (W)
jwarol.VK_A # 65 (A)
jwarol.VK_S # 83 (S)
jwarol.VK_D # 68 (D)
jwarol.VK_SPACE # 32 (пробел)
Методы Engine
| Метод | Описание |
|---|---|
init(w, h, title) |
Создание окна |
create_object(x, y, w, h, type) |
Создание объекта, возврат ID |
set_position(id, x, y) |
Установка позиции |
set_velocity(id, vx, vy) |
Установка скорости |
apply_gravity(id, dt) |
Гравитация |
apply_velocity(id, dt) |
Движение по скорости |
apply_force(id, fx, fy) |
Применение силы |
load_texture(id, path, purpose) |
Загрузка текстуры |
load_textures_from_folder(path) |
Автозагрузка всей папки |
create_animation(frame_duration) |
Создание анимации |
add_animation_frame(anim_id, tex_id) |
Добавление кадра |
update_animation(anim_id, dt) |
Обновление анимации |
draw_texture(obj_id, tex_id) |
Отрисовка с текстурой |
is_key_pressed(keycode) |
Проверка клавиши |
move_object(id, dx, dy, speed) |
Простое движение |
is_object(id, type) |
Проверка типа |
check_collision(id1, id2) |
Проверка коллизии |
is_open() |
Окно открыто? |
clear(r, g, b) |
Очистка экрана |
draw_rect(id, r, g, b) |
Отрисовка цветом |
update() |
Обновление экрана |
close() |
Закрытие |
Примеры использования
Пример 1: Платформер с анимацией ходьбы
import jwarol
import time
engine = jwarol.Engine()
engine.init(800, 600, "Platformer with Animation")
# Объекты
player = engine.create_object(100, 300, 40, 60, jwarol.ObjectType.PLAYER)
ground = engine.create_object(0, 550, 800, 50, jwarol.ObjectType.OBJECT)
# Автозагрузка текстур из папки textures
engine.load_textures_from_folder("textures")
# Создание анимации ходьбы (кадры должны быть загружены)
walk_anim = engine.create_animation(0.1) # 0.1 сек на кадр
# Предполагаем, что в папке textures есть player_walk_1.png, player_walk_2.png и т.д.
# Добавляем кадры (ID текстур получены при автозагрузке)
gravity = 0.5
speed = 5
on_ground = False
is_walking = False
while engine.is_open():
engine.clear(0.4, 0.6, 1.0)
# Гравитация
engine.apply_gravity(player, gravity)
# Управление
dx = 0
if engine.is_key_pressed(jwarol.VK_LEFT):
dx = -1
is_walking = True
elif engine.is_key_pressed(jwarol.VK_RIGHT):
dx = 1
is_walking = True
else:
is_walking = False
if engine.is_key_pressed(jwarol.VK_SPACE) and on_ground:
engine.set_velocity(player, 0, -12)
on_ground = False
if dx != 0:
engine.move_object(player, dx, 0, speed)
# Движение
engine.apply_velocity(player, 1.0)
# Коллизия с землей
if engine.check_collision(player, ground):
engine.set_velocity(player, 0, 0)
on_ground = True
# Отрисовка (если есть анимация — используем её)
if is_walking:
current_tex = engine.update_animation(walk_anim, 0.016)
if current_tex >= 0:
engine.draw_texture(player, current_tex)
else:
# Статичная текстура
engine.draw_rect(player, 0.0, 1.0, 0.0)
engine.draw_rect(ground, 0.0, 0.5, 0.0)
engine.update()
time.sleep(0.016)
engine.close()
Пример 2: Спецэффекты (анимация взрыва)
import jwarol
import time
engine = jwarol.Engine()
engine.init(800, 600, "Special Effects")
# Автозагрузка текстур
engine.load_textures_from_folder("textures")
# Создание анимации взрыва
explosion_anim = engine.create_animation(0.05) # Быстрая анимация
# Предполагаем, что в папке есть effect_explosion_1.png, effect_explosion_2.png и т.д.
# Добавляем кадры взрыва
timer = 0
show_effect = False
while engine.is_open():
engine.clear(0.1, 0.1, 0.1)
timer += 0.016
# Запуск эффекта каждые 3 секунды
if timer >= 3.0:
show_effect = True
timer = 0
if show_effect:
current_tex = engine.update_animation(explosion_anim, 0.016)
if current_tex >= 0:
# Создаем временный объект для отрисовки эффекта
engine.draw_texture(0, current_tex) # Упрощенно
else:
show_effect = False # Анимация закончилась
engine.update()
time.sleep(0.016)
engine.close()
Пример 3: Top-down шутер с разными типами текстур
import jwarol
import time
engine = jwarol.Engine()
engine.init(800, 600, "Top-Down with Auto-Textures")
# Автозагрузка всех текстур из папки textures
engine.load_textures_from_folder("textures")
player = engine.create_object(400, 300, 40, 40, jwarol.ObjectType.PLAYER)
enemy = engine.create_object(200, 200, 40, 40, jwarol.ObjectType.OBJECT)
speed = 4
while engine.is_open():
engine.clear(0.1, 0.1, 0.1)
# Управление WASD
dx, dy = 0.0, 0.0
if engine.is_key_pressed(jwarol.VK_W): dy = -1
if engine.is_key_pressed(jwarol.VK_S): dy = 1
if engine.is_key_pressed(jwarol.VK_A): dx = -1
if engine.is_key_pressed(jwarol.VK_D): dx = 1
if dx != 0 or dy != 0:
engine.move_object(player, dx, dy, speed)
engine.apply_velocity(player, 1.0)
# Коллизии
if engine.check_collision(player, enemy):
print("Hit enemy!")
# Отрисовка (текстуры загружены автоматически)
engine.draw_rect(player, 0.0, 1.0, 0.0)
engine.draw_rect(enemy, 1.0, 0.0, 0.0)
engine.update()
time.sleep(0.016)
engine.close()
Поддерживаемые форматы
- ✅
.png(рекомендуется, поддержка прозрачности) - ✅
.jpg/.jpeg - ✅ Альфа-канал (прозрачность)
- ✅ Автоопределение назначения по имени файла
Философия движка
Полностью автономный:
- ✅ Не нужен pygame для клавиш
- ✅ Не нужны дополнительные библиотеки
- ✅ Встроенная проверка нажатий
- ✅ Автозагрузка текстур из папки
textures - ✅ Система анимации (кадры + тайминг)
- ✅ Указание назначения текстуры (player, item, gui, effect)
Планы развития
-
get_position(id)— получение координат - Камера (следование за игроком)
- Звук
- Tilemap
- Система частиц
Лицензия
MIT License — см. LICENSE
Автор
ruslan
Ссылки
- PyPI: https://pypi.org/project/jwarol/0.4.5/
- Исходный код: https://github.com/r9441887-collab/jwarol-code
Project details
Release history Release notifications | RSS feed
Download files
Download the file for your platform. If you're not sure which to choose, learn more about installing packages.
Source Distributions
No source distribution files available for this release.See tutorial on generating distribution archives.
Built Distribution
Filter files by name, interpreter, ABI, and platform.
If you're not sure about the file name format, learn more about wheel file names.
Copy a direct link to the current filters
File details
Details for the file jwarol-0.4.6-cp312-cp312-win_amd64.whl.
File metadata
- Download URL: jwarol-0.4.6-cp312-cp312-win_amd64.whl
- Upload date:
- Size: 117.9 kB
- Tags: CPython 3.12, Windows x86-64
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/6.2.0 CPython/3.12.7
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
410efffa4317412831d8edd12f7e003b23fb6a3ade3a03bd012b06db1031a5e4
|
|
| MD5 |
3e172c325364b77d1220108c7ddc8082
|
|
| BLAKE2b-256 |
750e708cd563ce330095ac6c1565716c787280a4878d4827157b112fdda203e1
|