Skip to main content

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


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.3.8.tar.gz (9.0 kB view details)

Uploaded Source

Built Distribution

If you're not sure about the file name format, learn more about wheel file names.

jwarol-0.3.8-cp312-cp312-win_amd64.whl (111.9 kB view details)

Uploaded CPython 3.12Windows x86-64

File details

Details for the file jwarol-0.3.8.tar.gz.

File metadata

  • Download URL: jwarol-0.3.8.tar.gz
  • Upload date:
  • Size: 9.0 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/6.2.0 CPython/3.12.7

File hashes

Hashes for jwarol-0.3.8.tar.gz
Algorithm Hash digest
SHA256 7a47e989215fb4ed1f3d2beb7c514d987bcacefa88fc411d27fe9d32bc67ef86
MD5 32ab9a8ccfbb25947725e6376bbb3467
BLAKE2b-256 3890b113f44108bf17388ff35bce965adf1b5cbeb4f5ace1966fec4b07b316a4

See more details on using hashes here.

File details

Details for the file jwarol-0.3.8-cp312-cp312-win_amd64.whl.

File metadata

  • Download URL: jwarol-0.3.8-cp312-cp312-win_amd64.whl
  • Upload date:
  • Size: 111.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

Hashes for jwarol-0.3.8-cp312-cp312-win_amd64.whl
Algorithm Hash digest
SHA256 a9e214a0559253fa11ffb5dd1adfd701cec46bdcd87003b72be1e2a8dc2ad4b8
MD5 15e0113ab707531a997daff39c726767
BLAKE2b-256 f09a3145646af26887465b82c7f2a355dfbc5704eafedbfc5fe011cec7996ecb

See more details on using hashes here.

Supported by

AWS Cloud computing and Security Sponsor Datadog Monitoring Depot Continuous Integration Fastly CDN Google Download Analytics Pingdom Monitoring Sentry Error logging StatusPage Status page