2D game engine for Python with physics, collision detection, and texture support
Project description
Jwarol Engine
2D игровой движок для Python на C++ и pybind11. Полностью автономный — поддержка текстур из папки textures (.png/.jpg) со указанием назначения.
Установка
pip install jwarol==0.3.6
Текстуры
Создай папку textures рядом со скриптом и положи туда изображения:
my_game/
├── game.py
└── textures/
├── player.png
├── enemy.jpg
└── background.png
API для текстур
# Загрузка текстуры с указанием назначения
texture_id = engine.load_texture(obj_id, "textures/player.png", "player_sprite")
# Отрисовка с текстурой
engine.draw_texture(obj_id, texture_id)
# Или обычная отрисовка цветом
engine.draw_rect(obj_id, 1.0, 0.0, 0.0)
Быстрый старт
import jwarol
engine = jwarol.Engine()
engine.init(800, 600, "My Game")
player = engine.create_object(100, 100, 50, 50, jwarol.ObjectType.PLAYER)
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
jwarol.VK_A # 65
jwarol.VK_S # 83
jwarol.VK_D # 68
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) |
Загрузка текстуры из папки |
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 Textures")
# Объекты
player = engine.create_object(100, 300, 40, 60, jwarol.ObjectType.PLAYER)
ground = engine.create_object(0, 550, 800, 50, jwarol.ObjectType.OBJECT)
# Загрузка текстур (из папки textures)
tex_id = engine.load_texture(player, "textures/player.png", "player_sprite")
gravity = 0.5
speed = 5
on_ground = False
while engine.is_open():
engine.clear(0.4, 0.6, 1.0) # Небо
# Гравитация
engine.apply_gravity(player, gravity)
# Управление
if engine.is_key_pressed(jwarol.VK_LEFT):
engine.move_object(player, -1, 0, speed)
if engine.is_key_pressed(jwarol.VK_RIGHT):
engine.move_object(player, 1, 0, speed)
if engine.is_key_pressed(jwarol.VK_SPACE) and on_ground:
engine.set_velocity(player, 0, -12)
on_ground = False
# Движение
engine.apply_velocity(player, 1.0)
# Коллизия с землей
if engine.check_collision(player, ground):
engine.set_velocity(player, 0, 0)
on_ground = True
# Отрисовка с текстурой
engine.draw_texture(player, tex_id)
engine.draw_rect(ground, 0.0, 0.5, 0.0)
engine.update()
time.sleep(0.016)
engine.close()
Пример 2: Top-down с текстурами
import jwarol
import time
engine = jwarol.Engine()
engine.init(800, 600, "Top-Down with Textures")
player = engine.create_object(400, 300, 40, 40, jwarol.ObjectType.PLAYER)
enemy = engine.create_object(200, 200, 40, 40, jwarol.ObjectType.OBJECT)
# Текстуры
player_tex = engine.load_texture(player, "textures/player.png", "player")
enemy_tex = engine.load_texture(enemy, "textures/enemy.jpg", "enemy")
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
engine.move_object(player, dx, dy, speed)
engine.apply_velocity(player, 1.0)
# Коллизия
if engine.check_collision(player, enemy):
print("Hit enemy!")
# Отрисовка с текстурами
engine.draw_texture(player, player_tex)
engine.draw_texture(enemy, enemy_tex)
engine.update()
time.sleep(0.016)
engine.close()
Пример 3: Несколько текстур для одного объекта
import jwarol
engine = jwarol.Engine()
engine.init(800, 600, "Multiple Textures")
player = engine.create_object(100, 100, 50, 50, jwarol.ObjectType.PLAYER)
# Текстуры с разным назначением
idle_tex = engine.load_texture(player, "textures/player_idle.png", "idle")
run_tex = engine.load_texture(player, "textures/player_run.png", "run")
jump_tex = engine.load_texture(player, "textures/player_jump.png", "jump")
# Переключение текстур в зависимости от состояния
is_jumping = False
while engine.is_open():
engine.clear(0.2, 0.2, 0.2)
if is_jumping:
engine.draw_texture(player, jump_tex)
else:
engine.draw_texture(player, idle_tex)
engine.update()
engine.close()
Поддерживаемые форматы
- ✅
.png(рекомендуется) - ✅
.jpg/.jpeg - ✅ Прозрачность (PNG с альфа-каналом)
Философия движка
Полностью автономный:
- ✅ Не нужен pygame для клавиш
- ✅ Не нужны дополнительные библиотеки
- ✅ Встроенная проверка нажатий
- ✅ Загрузка текстур из папки
textures - ✅ Указание назначения текстуры
Планы развития
-
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
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.3.9.tar.gz.
File metadata
- Download URL: jwarol-0.3.9.tar.gz
- Upload date:
- Size: 9.9 kB
- Tags: Source
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/6.2.0 CPython/3.12.7
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
821e7e837bc69e344e7ff61fe7e7eb1000c86dbb602671fdaf161eb20603d6fa
|
|
| MD5 |
63dd7f6a3c0a5aa2ed5a4ca5e78a4365
|
|
| BLAKE2b-256 |
a7e0057b6e5a8a6173a8c13df0f05ce6701f681fe529699f472793e5179713bd
|
File details
Details for the file jwarol-0.3.9-cp312-cp312-win_amd64.whl.
File metadata
- Download URL: jwarol-0.3.9-cp312-cp312-win_amd64.whl
- Upload date:
- Size: 117.0 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 |
c2cb410ed4d0f68f8c8fe43fe71be05ecc5826ed31f4a3259e42b26657340a09
|
|
| MD5 |
8943dd70e68e2092e16da5668c0f10f5
|
|
| BLAKE2b-256 |
0476dd70a573ee4d0cfe64c9d8e7667826b9b0723f9506a52e9e9c5b5adc7447
|