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.4

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

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

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

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

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: Аркада с гравитацией и прыжками

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: Свободный полет (без гравитации)

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

Автор

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.5.tar.gz (8.0 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.5-cp312-cp312-win_amd64.whl (109.0 kB view details)

Uploaded CPython 3.12Windows x86-64

File details

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

File metadata

  • Download URL: jwarol-0.3.5.tar.gz
  • Upload date:
  • Size: 8.0 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.5.tar.gz
Algorithm Hash digest
SHA256 40d6f817093bf0491c9823474bb2a275484d3a77992f2634fb38a1cd63857ad8
MD5 469b0bd6f4b6edf90916a92b77dbdceb
BLAKE2b-256 52398d064b0c5d0e1d89826394e74eb4b804e423a2f08c88db51b243a8d76ca2

See more details on using hashes here.

File details

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

File metadata

  • Download URL: jwarol-0.3.5-cp312-cp312-win_amd64.whl
  • Upload date:
  • Size: 109.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.5-cp312-cp312-win_amd64.whl
Algorithm Hash digest
SHA256 98f50a530d9814b008b5aec8d7f4ea3abad6ae03f6bea418bbc8c4b24bcff131
MD5 384040278be8e2a6a05495cd231037c6
BLAKE2b-256 04b3fdb1747c364bac247043b5110acf1e527b8da761a41743ff9e5f7656ff7b

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