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 с определением назначения и системой анимации.

Установка

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*PLAYER
  • item*ITEM
  • gui*GUI
  • effect* или 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


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.1.tar.gz (12.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.4.1-cp312-cp312-win_amd64.whl (117.8 kB view details)

Uploaded CPython 3.12Windows x86-64

File details

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

File metadata

  • Download URL: jwarol-0.4.1.tar.gz
  • Upload date:
  • Size: 12.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.4.1.tar.gz
Algorithm Hash digest
SHA256 ead7dee0fe26a89e8449a4ad467c0686d72329ab5631d581a673f015f73a4568
MD5 a204d88645d9a23501b0c11beb24cea9
BLAKE2b-256 315b72825084e676e6c03295b1cc0bf6d1f250513b4f5aa8abd89d456a1bdf84

See more details on using hashes here.

File details

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

File metadata

  • Download URL: jwarol-0.4.1-cp312-cp312-win_amd64.whl
  • Upload date:
  • Size: 117.8 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.4.1-cp312-cp312-win_amd64.whl
Algorithm Hash digest
SHA256 42f1a8dfe5ecf4be487851c876a8d75d62a11508879a2c528c1f9271bfa520a2
MD5 69d141d5dff0b39fe4b21fc9ca3c01eb
BLAKE2b-256 81ddc480879b705730c06e84bcc086f44f9636fdaf831c760d26b999c717a89c

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