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.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*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 Distributions

No source distribution files available for this release.See tutorial on generating distribution archives.

Built Distribution

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

jwarol-0.4.6-cp312-cp312-win_amd64.whl (117.9 kB view details)

Uploaded CPython 3.12Windows x86-64

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

Hashes for jwarol-0.4.6-cp312-cp312-win_amd64.whl
Algorithm Hash digest
SHA256 410efffa4317412831d8edd12f7e003b23fb6a3ade3a03bd012b06db1031a5e4
MD5 3e172c325364b77d1220108c7ddc8082
BLAKE2b-256 750e708cd563ce330095ac6c1565716c787280a4878d4827157b112fdda203e1

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