Skip to main content

2D game engine for Python with physics, collision detection, and texture support

Project description

Jwarol Engine

2D игровой движок для Python на C++ и pybind11. Поддерживает физику, коллизии, типы объектов, загрузку текстур и разные режимы камеры.

Установка

pip install jwarol==0.3.3

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

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)

// Физика
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: Базовый - создание и проверка типов

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 Платформер с физикой (вид сбоку)

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 вид (сверху)

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

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

Автор

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

Uploaded Source

Built Distribution

If you're not sure about the file name format, learn more about wheel file names.

jwarol-0.3.4-cp312-cp312-win_amd64.whl (109.1 kB view details)

Uploaded CPython 3.12Windows x86-64

File details

Details for the file jwarol-0.3.4.tar.gz.

File metadata

  • Download URL: jwarol-0.3.4.tar.gz
  • Upload date:
  • Size: 8.6 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/6.2.0 CPython/3.12.7

File hashes

Hashes for jwarol-0.3.4.tar.gz
Algorithm Hash digest
SHA256 3bce3a3b10dbec36116d01accc6b772a91f6842307ae8b6824a2bebc9b9de3fa
MD5 ce037558b569ad2d5e93834823a9b677
BLAKE2b-256 74ddc658b683ea823a2d9d82b93ac06a98981ab3ba82a80e1107e3108da37031

See more details on using hashes here.

File details

Details for the file jwarol-0.3.4-cp312-cp312-win_amd64.whl.

File metadata

  • Download URL: jwarol-0.3.4-cp312-cp312-win_amd64.whl
  • Upload date:
  • Size: 109.1 kB
  • Tags: CPython 3.12, Windows x86-64
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/6.2.0 CPython/3.12.7

File hashes

Hashes for jwarol-0.3.4-cp312-cp312-win_amd64.whl
Algorithm Hash digest
SHA256 9976ebe2a8f3522c37b048ab3650c8fb2493dff00a601e3ea44f0f56e93dee05
MD5 6b2b146afa84383bcab9287e87b645ba
BLAKE2b-256 79d5e090ea4542df6c093a9f9683b0244e33c7b25be5ebacab4823646c967b08

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