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

Uploaded Source

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

Hashes for jwarol-0.4.0.tar.gz
Algorithm Hash digest
SHA256 76f4a713b00b79f0f680215dcb1a7f300ac3a7f02be44db529ce23aca8d08641
MD5 d7e46439e094f610940c45a32f10ffe7
BLAKE2b-256 9e7cabeb30e6af1cd0334dc6ed5b577d9ca104fe7509483d608e5d23fd4f8923

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