Metadata-Version: 2.4
Name: jwarol
Version: 0.4.2
Summary: 2D game engine for Python with physics, collision detection, and texture support
Home-page: https://github.com/r9441887-collab/jwarol-code
Author: ruslan
Author-email: ruslan <r9441887@gmail.com>
License: MIT
Project-URL: Homepage, https://github.com/r9441887-collab/jwarol-code
Project-URL: Repository, https://github.com/r9441887-collab/jwarol-code
Classifier: Development Status :: 3 - Alpha
Classifier: Intended Audience :: Developers
Classifier: License :: OSI Approved :: MIT License
Classifier: Programming Language :: Python :: 3
Classifier: Programming Language :: C++
Requires-Python: >=3.8
Description-Content-Type: text/markdown
License-File: LICENSE
Dynamic: author
Dynamic: home-page
Dynamic: license-file

# Jwarol Engine

2D игровой движок для Python на C++ и pybind11. **Полностью автономный** — поддержка автозагрузки текстур из папки `textures` с определением назначения и системой анимации.

## Установка

```bash
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 для текстур и анимации

### Загрузка текстур
```python
# Ручная загрузка
tex_id = engine.load_texture(obj_id, "textures/player.png", "player_idle")

# Автозагрузка всей папки (автоопределение назначения)
engine.load_textures_from_folder("textures")
```

### Работа с анимацией
```python
# Создание анимации (длительность кадра 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)
```

## Быстрый старт

```python
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 Справочник

### Типы объектов
```python
jwarol.ObjectType.OBJECT  # Обычный объект
jwarol.ObjectType.PLAYER  # Игрок
jwarol.ObjectType.ITEM    # Предмет
jwarol.ObjectType.GUI     # Интерфейс
```

### Коды клавиш
```python
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: Платформер с анимацией ходьбы

```python
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: Спецэффекты (анимация взрыва)

```python
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 шутер с разными типами текстур

```python
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](LICENSE)

## Автор
**ruslan**

## Ссылки
- PyPI: https://pypi.org/project/jwarol/0.3.9/
- Issues: https://github.com/ruslan/jwarol/issues
