Skip to main content

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

Project description

Jwarol Engine

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

Установка

pip install jwarol==0.3.6

Текстуры

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

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

API для текстур

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

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

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

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

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

Коды клавиш

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

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

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

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

Автор

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.9.tar.gz (9.9 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.9-cp312-cp312-win_amd64.whl (117.0 kB view details)

Uploaded CPython 3.12Windows x86-64

File details

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

File metadata

  • Download URL: jwarol-0.3.9.tar.gz
  • Upload date:
  • Size: 9.9 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.9.tar.gz
Algorithm Hash digest
SHA256 821e7e837bc69e344e7ff61fe7e7eb1000c86dbb602671fdaf161eb20603d6fa
MD5 63dd7f6a3c0a5aa2ed5a4ca5e78a4365
BLAKE2b-256 a7e0057b6e5a8a6173a8c13df0f05ce6701f681fe529699f472793e5179713bd

See more details on using hashes here.

File details

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

File metadata

  • Download URL: jwarol-0.3.9-cp312-cp312-win_amd64.whl
  • Upload date:
  • Size: 117.0 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.9-cp312-cp312-win_amd64.whl
Algorithm Hash digest
SHA256 c2cb410ed4d0f68f8c8fe43fe71be05ecc5826ed31f4a3259e42b26657340a09
MD5 8943dd70e68e2092e16da5668c0f10f5
BLAKE2b-256 0476dd70a573ee4d0cfe64c9d8e7667826b9b0723f9506a52e9e9c5b5adc7447

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