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
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
jwarol-0.3.4.tar.gz
(8.6 kB
view details)
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.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
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
3bce3a3b10dbec36116d01accc6b772a91f6842307ae8b6824a2bebc9b9de3fa
|
|
| MD5 |
ce037558b569ad2d5e93834823a9b677
|
|
| BLAKE2b-256 |
74ddc658b683ea823a2d9d82b93ac06a98981ab3ba82a80e1107e3108da37031
|
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
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
9976ebe2a8f3522c37b048ab3650c8fb2493dff00a601e3ea44f0f56e93dee05
|
|
| MD5 |
6b2b146afa84383bcab9287e87b645ba
|
|
| BLAKE2b-256 |
79d5e090ea4542df6c093a9f9683b0244e33c7b25be5ebacab4823646c967b08
|