Box2D with PySDL3: Setup for Python Box2D с PySDL3: Настройка для Python

A guide to configuring and running Box2D physics simulations with PySDL3. Руководство по настройке и запуску физических симуляций Box2D с PySDL3.

1. Installation 1. Установка

Install both the PySDL3 bindings and the Box2D library for Python via pip:

Установите привязки PySDL3 и библиотеку Box2D для Python через pip:

pip install pysdl3 Box2D

2. Project Structure 2. Структура проекта

Create a folder named pysdl3-box2d with the following hierarchy:

Создайте папку с именем pysdl3-box2d со следующей иерархией:

pysdl3-box2d/
├── main.py
└── debug_drawer.py

3. Source Code (Callback System) 3. Исходный код (Система Callbacks)

PySDL3 relies on the SDL3 callback-based architecture. Ensure environment variables are set before importing sdl3. Copy this code into main.py:

PySDL3 опирается на архитектуру обратных вызовов (callbacks) SDL3. Убедитесь, что переменные среды установлены до импорта sdl3. Скопируйте этот код в файл main.py:

import ctypes
import math
import os

# 1. Set environment variables BEFORE importing sdl3
os.environ["SDL_MAIN_USE_CALLBACKS"] = "1"
os.environ["SDL_RENDER_DRIVER"] = "opengl"

import sdl3
from Box2D import (b2_dynamicBody, b2BodyDef, b2CircleShape, b2FixtureDef,
                    b2PolygonShape, b2Vec2, b2World)
from debug_drawer import DebugDrawer

renderer = ctypes.POINTER(sdl3.SDL_Renderer)()
window = ctypes.POINTER(sdl3.SDL_Window)()

world = b2World(gravity=b2Vec2(0, 9.8))
ppm = 30 # pixels per meter

@sdl3.SDL_AppInit_func
def SDL_AppInit(appstate, argc, argv):
    if not sdl3.SDL_Init(sdl3.SDL_INIT_VIDEO):
        return sdl3.SDL_APP_FAILURE
    if not sdl3.SDL_CreateWindowAndRenderer("Draw Box2D colliders".encode(), 500, 300, 0, window, renderer):
        return sdl3.SDL_APP_FAILURE

    sdl3.SDL_SetRenderVSync(renderer, 1)

    debugDrawer = DebugDrawer(renderer, ppm)
    debugDrawer.flags = { "drawShapes": True }
    world.renderer = debugDrawer

    # Example: Create a ground body
    groundBody = world.CreateBody(b2BodyDef(position=(250/ppm, 270/ppm)))
    groundBody.CreateFixture(shape=b2PolygonShape(box=(400/2/ppm, 40/2/ppm)), density=0)

    return sdl3.SDL_APP_CONTINUE

@sdl3.SDL_AppEvent_func
def SDL_AppEvent(appstate, event):
    if sdl3.SDL_DEREFERENCE(event).type == sdl3.SDL_EVENT_QUIT:
        return sdl3.SDL_APP_SUCCESS
    return sdl3.SDL_APP_CONTINUE

@sdl3.SDL_AppIterate_func
def SDL_AppIterate(appstate):
    sdl3.SDL_SetRenderDrawColor(renderer, 50, 50, 50, sdl3.SDL_ALPHA_OPAQUE)
    sdl3.SDL_RenderClear(renderer)

    world.Step(0.016, 3, 2)
    world.DrawDebugData()

    sdl3.SDL_RenderPresent(renderer)
    return sdl3.SDL_APP_CONTINUE

@sdl3.SDL_AppQuit_func
def SDL_AppQuit(appstate, result):
    sdl3.SDL_DestroyRenderer(renderer)
    sdl3.SDL_DestroyWindow(window)

4. Running the Application 4. Запуск приложения

Run the script via your terminal:

Запустите скрипт через терминал:

python main.py

Support My Work Поддержать проект

If these tutorials helped you, consider buying me a coffee! Если эти туториалы вам помогли, вы можете поддержать автора.

Sberbank (Russia only) Сбербанк (только для РФ)

Sberbank SBP QR Code

Direct transfer via phone number (Russia only) Перевод по номеру телефона (только для РФ)

+7 (917) 212-29-59

USDT TRC20

USDT TRC20 QR Code

Support via Cryptocurrency Поддержка криптовалютой

TMtY1YifNf6FKvgeFmqKGQR4NStKr3csGp