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.3.9
Текстуры и автозагрузка
Структура папок
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
Ссылки
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 Distribution
jwarol-0.4.0.tar.gz
(11.2 kB
view details)
File details
Details for the file jwarol-0.4.0.tar.gz.
File metadata
- Download URL: jwarol-0.4.0.tar.gz
- Upload date:
- Size: 11.2 kB
- Tags: Source
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/6.2.0 CPython/3.12.7
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
76f4a713b00b79f0f680215dcb1a7f300ac3a7f02be44db529ce23aca8d08641
|
|
| MD5 |
d7e46439e094f610940c45a32f10ffe7
|
|
| BLAKE2b-256 |
9e7cabeb30e6af1cd0334dc6ed5b577d9ca104fe7509483d608e5d23fd4f8923
|