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
Release history Release notifications | RSS feed
Download files
Download the file for your platform. If you're not sure which to choose, learn more about installing packages.
Source Distribution
Built Distribution
Filter files by name, interpreter, ABI, and platform.
If you're not sure about the file name format, learn more about wheel file names.
Copy a direct link to the current filters
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
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
40d6f817093bf0491c9823474bb2a275484d3a77992f2634fb38a1cd63857ad8
|
|
| MD5 |
469b0bd6f4b6edf90916a92b77dbdceb
|
|
| BLAKE2b-256 |
52398d064b0c5d0e1d89826394e74eb4b804e423a2f08c88db51b243a8d76ca2
|
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
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
98f50a530d9814b008b5aec8d7f4ea3abad6ae03f6bea418bbc8c4b24bcff131
|
|
| MD5 |
384040278be8e2a6a05495cd231037c6
|
|
| BLAKE2b-256 |
04b3fdb1747c364bac247043b5110acf1e527b8da761a41743ff9e5f7656ff7b
|