Metadata-Version: 2.4
Name: jwarol
Version: 0.3.5
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. Гибкие инструменты для физики, движения и любых жанров игр.

## Установка

```bash
pip install jwarol==0.3.4
```

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

```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     # Интерфейс
```

### Методы 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)` | Применение гравитации (увеличивает vel_y) |
| `apply_velocity(id, dt)` | Применение скорости (движение по vel_x/vel_y) |
| `apply_force(id, fx, fy)` | Применение силы (меняет vel_x/vel_y) |
| `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 Physics")

# Объекты
player = engine.create_object(100, 300, 40, 60, jwarol.ObjectType.PLAYER)
ground = engine.create_object(0, 550, 800, 50, jwarol.ObjectType.OBJECT)
platform = engine.create_object(300, 400, 200, 20, jwarol.ObjectType.OBJECT)

# Переменные
vel_x, vel_y = 0.0, 0.0
gravity = 0.5
on_ground = False

while engine.is_open():
    engine.clear(0.4, 0.6, 1.0)  # Небо
    
    # Гравитация (инструмент - сам решай когда применять)
    engine.apply_gravity(player, gravity)
    
    # Управление (сам реализуй проверку клавиш)
    # if key_pressed(LEFT): engine.apply_force(player, -0.5, 0)
    # if key_pressed(RIGHT): engine.apply_force(player, 0.5, 0)
    # if key_pressed(SPACE) and on_ground: engine.set_velocity(player, 0, -10)
    
    # Движение
    engine.apply_velocity(player, 1.0)
    
    # Коллизии с землей
    if engine.check_collision(player, ground):
        # Ставим на землю и обнуляем vel_y
        engine.set_velocity(player, 0, 0)
        on_ground = True
    else:
        on_ground = False
    
    # Платформа
    if engine.check_collision(player, platform):
        engine.set_velocity(player, 0, 0)
    
    # Отрисовка
    engine.draw_rect(player, 0.0, 1.0, 0.0)   # Игрок
    engine.draw_rect(ground, 0.0, 0.5, 0.0)    # Земля
    engine.draw_rect(platform, 0.5, 0.3, 0.1) # Платформа
    
    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 Shooter")

player = engine.create_object(400, 300, 40, 40, jwarol.ObjectType.PLAYER)
enemy = engine.create_object(200, 200, 40, 40, jwarol.ObjectType.OBJECT)
wall = engine.create_object(300, 250, 200, 20, jwarol.ObjectType.OBJECT)

speed = 3.0

while engine.is_open():
    engine.clear(0.1, 0.1, 0.1)
    
    # Управление (сам реализуй input)
    dx, dy = 0.0, 0.0
    # if key_pressed(W): dy = -speed
    # if key_pressed(S): dy = speed
    # if key_pressed(A): dx = -speed
    # if key_pressed(D): dx = speed
    
    # Движение без гравитации (вид сверху)
    engine.set_velocity(player, dx, dy)
    engine.apply_velocity(player, 1.0)
    
    # Проверка стен
    if engine.check_collision(player, wall):
        print("Hit wall!")
    
    # Проверка врага
    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.draw_rect(wall, 0.5, 0.5, 0.5)
    
    engine.update()
    time.sleep(0.016)

engine.close()
```

### Пример 3: Аркада с гравитацией и прыжками

```python
import jwarol
import time

engine = jwarol.Engine()
engine.init(800, 600, "Arcade Game")

player = engine.create_object(100, 100, 30, 30, jwarol.ObjectType.PLAYER)
coin = engine.create_object(400, 300, 20, 20, jwarol.ObjectType.ITEM)

gravity = 0.8
jump_force = -12
score = 0

while engine.is_open():
    engine.clear(0.2, 0.2, 0.3)
    
    # Гравитация всегда
    engine.apply_gravity(player, gravity)
    
    # Прыжок (сам проверь клавишу)
    # if key_pressed(SPACE):
    #     engine.set_velocity(player, 0, jump_force)
    
    # Движение
    engine.apply_velocity(player, 1.0)
    
    # Сбор монет
    if engine.check_collision(player, coin):
        score += 10
        print(f"Score: {score}")
        # Можно переместить монету в новое место
        engine.set_position(coin, 500, 400)
    
    engine.draw_rect(player, 0.0, 1.0, 0.0)
    engine.draw_rect(coin, 1.0, 1.0, 0.0)
    engine.update()
    time.sleep(0.016)

engine.close()
```

### Пример 4: Свободный полет (без гравитации)

```python
import jwarol
import time

engine = jwarol.Engine()
engine.init(800, 600, "Free Flight")

ship = engine.create_object(400, 300, 60, 30, jwarol.ObjectType.PLAYER)

while engine.is_open():
    engine.clear(0.0, 0.0, 0.1)  # Космос
    
    # Свободный полет (без гравитации)
    # if key_pressed(UP): engine.apply_force(ship, 0, -0.3)
    # if key_pressed(DOWN): engine.apply_force(ship, 0, 0.3)
    # if key_pressed(LEFT): engine.apply_force(ship, -0.3, 0)
    # if key_pressed(RIGHT): engine.apply_force(ship, 0.3, 0)
    
    # Торможение (сопротивление)
    # engine.apply_force(ship, -vel_x*0.1, -vel_y*0.1)
    
    # Движение
    engine.apply_velocity(ship, 1.0)
    
    engine.draw_rect(ship, 0.0, 1.0, 1.0)
    engine.update()
    time.sleep(0.016)

engine.close()
```

## Философия движка

**Инструменты, а не правила:**
- Гравитация есть? Применяй `apply_gravity()` когда нужно
- Нужен платформер? Используй гравитацию
- Нужен вид сверху? Не используй гравитацию
- Нужен космос? Создавай свои силы с `apply_force()`

**Типы объектов** — только для твоего удобства (проверка "это игрок?", "это предмет?"). Сам решай, как их использовать.

## Планы развития

- [ ] `get_position(id)` — получение координат
- [ ] `load_texture(id, path)` — загрузка текстур
- [ ] `draw_texture(id, tex_id)` — отрисовка с текстурой
- [ ] Камера (следование за игроком)
- [ ] Звук
- [ ] Анимации
- [ ] Tilemap

## Лицензия

MIT License — см. [LICENSE](LICENSE)

## Автор

**ruslan**

## Ссылки

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