Metadata-Version: 2.4
Name: jwarol
Version: 0.3.8
Summary: 2D game engine for Python with physics, collision detection, and texture support
Home-page: https://github.com/ruslan/jwarol
Author: ruslan
Author-email: ruslan <ruslan@example.com>
License: MIT
Project-URL: Homepage, https://github.com/ruslan/jwarol
Project-URL: Repository, https://github.com/ruslan/jwarol
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` (.png/.jpg) со указанием назначения.

## Установка

```bash
pip install jwarol==0.3.6
```

## Текстуры

Создай папку `textures` рядом со скриптом и положи туда изображения:

```
my_game/
├── game.py
└── textures/
    ├── player.png
    ├── enemy.jpg
    └── background.png
```

## API для текстур

```python
# Загрузка текстуры с указанием назначения
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)
```

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

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

### Типы объектов

```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
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: Платформер с текстурами

```python
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 с текстурами

```python
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: Несколько текстур для одного объекта

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

## Автор

**ruslan**

## Ссылки

- PyPI: https://pypi.org/project/jwarol/0.3.6/
- Issues: https://github.com/ruslan/jwarol/issues
