Metadata-Version: 2.4
Name: jwarol
Version: 0.3.4
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.3
```

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

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

## API Справочник

### Engine - основной класс

| Метод | Параметры | Возврат | Описание |
|--------|-----------|---------|----------|
| `__init__()` | - | Engine | Создание экземпляра движка |
| `init(w, h, title)` | width, height, title | bool | Создание окна 800x600 |
| `create_object(x, y, w, h, type)` | координаты, размеры, тип | int | Создание объекта, возврат ID |
| `is_object(id, type)` | id, тип | bool | Проверка: это игрок? предмет? GUI? |
| `check_collision(id1, id2)` | id1, id2 | bool | Проверка коллизии между объектами |
| `is_open()` | - | bool | Открыто ли окно? |
| `clear(r, g, b)` | цвета 0.0-1.0 | - | Очистка экрана |
| `draw_rect(id, r, g, b)` | id, цвета | - | Отрисовка объекта цветом |
| `update()` | - | - | Обновление экрана (swap buffers) |
| `close()` | - | - | Закрытие движка |

### Внутренние C++ функции (в разработке для Python API)

```cpp
// Физика
physics.apply_gravity(obj, delta_time);  // Гравитация
physics.check_boundary(obj, world_w, world_h);  // Границы мира
physics.check_collision_with(obj, objects);  // Коллизии со списком

// Работа с текстурами
texture.load(path);  // Загрузка текстуры
texture.bind();  // Привязка текстуры
texture_manager.load_texture(path);  // Менеджер текстур
```

## Примеры использования

### Пример 1: Базовый - создание и проверка типов

```python
import jwarol

engine = jwarol.Engine()
engine.init(800, 600, "Types Example")

player = engine.create_object(100, 100, 50, 50, jwarol.ObjectType.PLAYER)
enemy = engine.create_object(300, 100, 50, 50, jwarol.ObjectType.OBJECT)
item = engine.create_object(200, 300, 30, 30, jwarol.ObjectType.ITEM)
gui = engine.create_object(10, 10, 100, 30, jwarol.ObjectType.GUI)

# Проверка типов
print(engine.is_object(player, jwarol.ObjectType.PLAYER))  # True
print(engine.is_object(enemy, jwarol.ObjectType.OBJECT))   # True
print(engine.is_object(item, jwarol.ObjectType.ITEM))      # True
print(engine.is_object(gui, jwarol.ObjectType.GUI))        # True

engine.close()
```

### Пример 2: 2D Платформер с физикой (вид сбоку)

```python
import jwarol
import time

engine = jwarol.Engine()
engine.init(800, 600, "Platformer Side View")

# Игрок
player_id = engine.create_object(100, 300, 40, 60, jwarol.ObjectType.PLAYER)
# Земля
ground_id = engine.create_object(0, 550, 800, 50, jwarol.ObjectType.OBJECT)
# Платформы
platform1 = engine.create_object(200, 450, 150, 20, jwarol.ObjectType.OBJECT)
platform2 = engine.create_object(400, 350, 150, 20, jwarol.ObjectType.OBJECT)
# Предмет
coin = engine.create_object(250, 400, 20, 20, jwarol.ObjectType.ITEM)

# Переменные движения
vel_x, vel_y = 0.0, 0.0
gravity = 0.5
on_ground = False
player_x, player_y = 100.0, 300.0

while engine.is_open():
    engine.clear(0.4, 0.6, 1.0)  # Голубое небо
    
    # Гравитация
    vel_y += gravity
    player_y += vel_y
    
    # Проверка коллизии с землей
    if engine.check_collision(player_id, ground_id):
        player_y = 550 - 60  # Ставим на землю
        vel_y = 0
        on_ground = True
    
    # Проверка коллизии с платформами
    for plat_id in [platform1, platform2]:
        if engine.check_collision(player_id, plat_id) and vel_y > 0:
            player_y = 450 - 60  # На платформе
            vel_y = 0
            on_ground = True
    
    # Проверка предмета
    if engine.check_collision(player_id, coin):
        print("Coin collected!")
    
    # Управление (упрощенное)
    # В реальности используй GetAsyncKeyState или события
    vel_x = 0
    # Здесь должна быть проверка клавиш (A/D для движения, Space для прыжка)
    
    player_x += vel_x
    
    # Обновляем позицию игрока (в будущем: set_position)
    # Пока пересоздаем (неэффективно, для примера)
    
    # Отрисовка
    engine.draw_rect(player_id, 0.0, 1.0, 0.0)  # Игрок - зеленый
    engine.draw_rect(ground_id, 0.0, 0.5, 0.0)  # Земля - темно-зеленая
    engine.draw_rect(platform1, 0.5, 0.3, 0.1)  # Платформы - коричневые
    engine.draw_rect(platform2, 0.5, 0.3, 0.1)
    engine.draw_rect(coin, 1.0, 1.0, 0.0)       # Монета - желтая
    
    engine.update()
    time.sleep(0.016)  # 60 FPS

engine.close()
```

### Пример 3: Top-down вид (сверху)

```python
import jwarol
import time

engine = jwarol.Engine()
engine.init(800, 600, "Top-Down View")

# Игрок (вид сверху)
player = engine.create_object(400, 300, 40, 40, jwarol.ObjectType.PLAYER)
# Стены
wall1 = engine.create_object(200, 200, 400, 20, jwarol.ObjectType.OBJECT)
wall2 = engine.create_object(200, 400, 400, 20, jwarol.ObjectType.OBJECT)
# Враги
enemy1 = engine.create_object(300, 300, 40, 40, jwarol.ObjectType.OBJECT)
enemy2 = engine.create_object(500, 300, 40, 40, jwarol.ObjectType.OBJECT)
# Предметы
health = engine.create_object(250, 250, 20, 20, jwarol.ObjectType.ITEM)

# Движение
player_x, player_y = 400.0, 300.0
speed = 3.0

while engine.is_open():
    engine.clear(0.1, 0.1, 0.1)  # Темный фон
    
    # Управление (здесь должна быть проверка клавиш)
    # dx, dy = 0, 0
    # if key_pressed(LEFT): dx = -speed
    # if key_pressed(RIGHT): dx = speed
    # if key_pressed(UP): dy = -speed
    # if key_pressed(DOWN): dy = speed
    # player_x += dx
    # player_y += dy
    
    # Проверка коллизий со стенами
    for wall in [wall1, wall2]:
        if engine.check_collision(player, wall):
            print("Hit wall!")
    
    # Проверка врагов
    for enemy in [enemy1, enemy2]:
        if engine.check_collision(player, enemy):
            print("Hit enemy!")
    
    # Проверка предметов
    if engine.check_collision(player, health):
        print("Got health!")
    
    # Отрисовка
    engine.draw_rect(player, 0.0, 1.0, 0.0)     # Игрок
    engine.draw_rect(wall1, 0.5, 0.5, 0.5)      # Стены
    engine.draw_rect(wall2, 0.5, 0.5, 0.5)
    engine.draw_rect(enemy1, 1.0, 0.0, 0.0)     # Враги
    engine.draw_rect(enemy2, 1.0, 0.0, 0.0)
    engine.draw_rect(health, 0.0, 1.0, 1.0)     # Health
    
    engine.update()
    time.sleep(0.016)

engine.close()
```

### Пример 4: Полный игровой цикл с GUI

```python
import jwarol
import time

class PlatformerGame:
    def __init__(self):
        self.engine = jwarol.Engine()
        self.engine.init(800, 600, "Full Game Example")
        
        # Объекты
        self.player = self.engine.create_object(100, 100, 50, 50, jwarol.ObjectType.PLAYER)
        self.enemies = [
            self.engine.create_object(300, 100, 50, 50, jwarol.ObjectType.OBJECT),
            self.engine.create_object(500, 200, 50, 50, jwarol.ObjectType.OBJECT),
        ]
        self.items = [
            self.engine.create_object(200, 300, 30, 30, jwarol.ObjectType.ITEM),
            self.engine.create_object(400, 350, 30, 30, jwarol.ObjectType.ITEM),
        ]
        self.gui_health = self.engine.create_object(10, 10, 200, 30, jwarol.ObjectType.GUI)
        self.gui_score = self.engine.create_object(10, 50, 150, 30, jwarol.ObjectType.GUI)
        
        self.score = 0
        self.health = 100
    
    def run(self):
        while self.engine.is_open():
            # Очистка (серый фон)
            self.engine.clear(0.2, 0.2, 0.2)
            
            # GUI (синий)
            self.engine.draw_rect(self.gui_health, 0.0, 0.0, 1.0)
            self.engine.draw_rect(self.gui_score, 0.0, 0.0, 1.0)
            
            # Игрок (зеленый)
            self.engine.draw_rect(self.player, 0.0, 1.0, 0.0)
            
            # Враги (красный)
            for enemy in self.enemies:
                self.engine.draw_rect(enemy, 1.0, 0.0, 0.0)
                if self.engine.check_collision(self.player, enemy):
                    print(f"Hit enemy! Health: {self.health}")
            
            # Предметы (желтый)
            for item in self.items:
                self.engine.draw_rect(item, 1.0, 1.0, 0.0)
                if self.engine.check_collision(self.player, item):
                    self.score += 10
                    print(f"Score: {self.score}")
            
            self.engine.update()
            time.sleep(0.016)
        
        self.engine.close()

if __name__ == "__main__":
    game = PlatformerGame()
    game.run()
```

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

- [ ] `set_position(id, x, y)` — установка позиции объекта
- [ ] `get_position(id)` — получение координат
- [ ] `is_key_pressed(keycode)` — проверка нажатия клавиш
- [ ] `load_texture(id, path)` — загрузка текстуры на объект
- [ ] `draw_texture(id, texture_id)` — отрисовка с текстурой
- [ ] Камера (следование за игроком)
- [ ] Звук
- [ ] Анимации
- [ ] Тайлы (tilemap)

## Лицензия

MIT License - см. файл [LICENSE](LICENSE)

## Автор

**ruslan**

## Ссылки

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