Skip to main content

Python SDK for GoudEngine. Build 2D and 3D games powered by a Rust core.

Project description

GoudEngine Python SDK

PyPI License: MIT

Alpha — This SDK is under active development. APIs change frequently. Report issues · Contact

Python SDK for GoudEngine. Build 2D and 3D games powered by a Rust core.

Install

pip install goudengine

Quick Start

from goud_engine import GoudGame, Key

game = GoudGame(800, 600, "My Game")

player_tex = game.load_texture("assets/player.png")

while not game.should_close():
    game.begin_frame()
    dt = game.delta_time

    if game.is_key_just_pressed(Key.ESCAPE):
        game.close()

    game.draw_sprite(player_tex, 400, 300, 64, 64)

    game.end_frame()

game.destroy()

Flappy Bird Example

Here's a condensed version of the complete Flappy Bird example:

import math
import random
from goud_engine import GoudGame, Key, MouseButton

# Constants
SCREEN_W, SCREEN_H = 288, 512
GRAVITY = 9.8
JUMP_STRENGTH = -3.5
PIPE_SPEED = 1.0
PIPE_SPAWN_INTERVAL = 1.5
PIPE_GAP = 100
TARGET_FPS = 120

game = GoudGame(SCREEN_W, SCREEN_H + 112, "Flappy Bird")

# Load textures
bg_tex   = game.load_texture("assets/sprites/background-day.png")
bird_frames = [
    game.load_texture("assets/sprites/bluebird-downflap.png"),
    game.load_texture("assets/sprites/bluebird-midflap.png"),
    game.load_texture("assets/sprites/bluebird-upflap.png"),
]
pipe_tex  = game.load_texture("assets/sprites/pipe-green.png")
base_tex  = game.load_texture("assets/sprites/base.png")
digit_tex = [game.load_texture(f"assets/sprites/{i}.png") for i in range(10)]

# Bird state
bird_x, bird_y = SCREEN_W / 4, SCREEN_H / 2
velocity = 0.0
rotation = 0.0
frame_idx = 0
frame_timer = 0.0
jump_cooldown = 0.0

# Pipe state
pipes = []          # list of dicts: {x, top_y, bottom_y, counted}
pipe_timer = 0.0
score = 0

def reset():
    global bird_x, bird_y, velocity, rotation, frame_idx, frame_timer
    global jump_cooldown, pipes, pipe_timer, score
    bird_x, bird_y = SCREEN_W / 4, SCREEN_H / 2
    velocity = rotation = frame_idx = frame_timer = jump_cooldown = 0.0
    pipes.clear()
    pipe_timer = score = 0

def spawn_pipe():
    gap_y = random.randint(PIPE_GAP, SCREEN_H - PIPE_GAP)
    pipes.append({
        "x": SCREEN_W,
        "top_y": gap_y - PIPE_GAP - 320,   # 320 = pipe image height
        "bottom_y": gap_y + PIPE_GAP,
        "counted": False,
    })

def aabb(ax, ay, aw, ah, bx, by, bw, bh):
    return ax < bx + bw and ax + aw > bx and ay < by + bh and ay + ah > by

reset()

while not game.should_close():
    game.begin_frame()
    dt = game.delta_time

    # --- Input ---
    if game.is_key_just_pressed(Key.ESCAPE):
        game.close()
    if game.is_key_just_pressed(Key.R):
        reset()

    jump = (game.is_key_just_pressed(Key.SPACE) or
            game.is_mouse_button_just_pressed(MouseButton.LEFT))
    if jump and jump_cooldown <= 0:
        velocity = JUMP_STRENGTH * TARGET_FPS
        jump_cooldown = 0.30
    jump_cooldown = max(0.0, jump_cooldown - dt)

    # --- Physics ---
    velocity += GRAVITY * dt * TARGET_FPS
    bird_y += velocity * dt
    target_rot = max(-45, min(45, velocity * 3))
    rotation += (target_rot - rotation) * 0.03

    # --- Bird animation ---
    frame_timer += dt
    if frame_timer >= 0.1:
        frame_idx = (frame_idx + 1) % 3
        frame_timer = 0.0

    # --- Pipes ---
    pipe_timer += dt
    if pipe_timer >= PIPE_SPAWN_INTERVAL:
        spawn_pipe()
        pipe_timer = 0.0

    survived = []
    for p in pipes:
        p["x"] -= PIPE_SPEED * dt * TARGET_FPS
        if p["x"] + 52 < 0:            # pipe scrolled off screen
            score += 1
            continue
        if (aabb(bird_x, bird_y, 34, 24, p["x"], p["top_y"],    52, 320) or
            aabb(bird_x, bird_y, 34, 24, p["x"], p["bottom_y"], 52, 320) or
            bird_y < 0 or bird_y > SCREEN_H):
            reset()
            break
        survived.append(p)
    else:
        pipes = survived

    # --- Draw ---
    game.draw_sprite(bg_tex,   SCREEN_W / 2, SCREEN_H / 2, SCREEN_W, SCREEN_H)

    for p in pipes:
        game.draw_sprite(pipe_tex, p["x"] + 26, p["top_y"]    + 160, 52, 320, math.pi)
        game.draw_sprite(pipe_tex, p["x"] + 26, p["bottom_y"] + 160, 52, 320)

    game.draw_sprite(
        bird_frames[frame_idx],
        bird_x + 17, bird_y + 12, 34, 24,
        math.radians(rotation)
    )

    # Score digits
    digits = [int(d) for d in str(max(score, 0))]
    start_x = (SCREEN_W - len(digits) * 24) / 2 + 12
    for i, d in enumerate(digits):
        game.draw_sprite(digit_tex[d], start_x + i * 24, 50, 24, 36)

    game.draw_sprite(base_tex, SCREEN_W / 2, SCREEN_H + 56, SCREEN_W, 112)

    game.end_frame()

game.destroy()

API Overview

Types

Type Description
GoudContext Engine context managing an ECS world
GoudResult FFI result type for operations that can fail
GoudEntityId FFI entity identifier
Vec2 2D vector
Color RGBA color
Rect 2D rectangle
Transform2D 2D transformation component
Sprite 2D sprite rendering component
Entity High-level entity wrapper
GoudGame High-level game abstraction

GoudContext Methods

Method Description
create() Creates a new context
destroy() Destroys the context
is_valid() Checks if context is valid
spawn_entity() Spawns an empty entity
spawn_entities(count) Spawns multiple entities
despawn_entity(id) Despawns an entity
is_entity_alive(id) Checks if entity is alive
entity_count() Returns alive entity count

Transform2D Methods

Method Description
from_position(x, y) Factory: position
from_rotation(radians) Factory: rotation
from_scale(sx, sy) Factory: scale
look_at(px, py, tx, ty) Factory: look at target
translate(dx, dy) Translate in world space
translate_local(dx, dy) Translate in local space
rotate(radians) Rotate by angle
scale_by(fx, fy) Multiply scale
forward() Get forward direction
right() Get right direction
transform_point(x, y) Local to world
inverse_transform_point(x, y) World to local
lerp(other, t) Interpolate

Sprite Methods

Method Description
with_color(r, g, b, a) Builder: color tint
with_flip_x(flip) Builder: horizontal flip
with_flip_y(flip) Builder: vertical flip
with_anchor(x, y) Builder: anchor point
with_source_rect(x, y, w, h) Builder: sprite sheet rect
with_custom_size(w, h) Builder: render size
set_source_rect(...) Mutate source rect
clear_source_rect() Clear source rect
set_custom_size(...) Mutate size
clear_custom_size() Clear size

Platform Support

OS Architecture Status
Windows x64 Supported
macOS x64 Supported
macOS ARM64 (Apple Silicon) Supported
Linux x64 Supported

Native libraries are bundled in the PyPI package.

Development

For contributors building from source:

cargo build --release
python3 sdks/python/test_bindings.py

Links

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

goudengine-0.0.827.tar.gz (4.7 kB view details)

Uploaded Source

Built Distributions

If you're not sure about the file name format, learn more about wheel file names.

goudengine-0.0.827-py3-none-win_amd64.whl (2.3 MB view details)

Uploaded Python 3Windows x86-64

goudengine-0.0.827-py3-none-macosx_14_0_arm64.whl (3.7 MB view details)

Uploaded Python 3macOS 14.0+ ARM64

goudengine-0.0.827-py3-none-macosx_13_0_x86_64.whl (1.2 MB view details)

Uploaded Python 3macOS 13.0+ x86-64

File details

Details for the file goudengine-0.0.827.tar.gz.

File metadata

  • Download URL: goudengine-0.0.827.tar.gz
  • Upload date:
  • Size: 4.7 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: twine/6.1.0 CPython/3.13.7

File hashes

Hashes for goudengine-0.0.827.tar.gz
Algorithm Hash digest
SHA256 f214b9178f53487c3bc67c13b3faf0acae7d82d70834db326b25ab7c45ec0cea
MD5 5767bdc505b69bacc7e741325b7186ec
BLAKE2b-256 710d39cf07fc5d03fc213059be15b7102fab2a462d2fd3315609c1bdd8b83c9b

See more details on using hashes here.

Provenance

The following attestation bundles were made for goudengine-0.0.827.tar.gz:

Publisher: release.yml on aram-devdocs/GoudEngine

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file goudengine-0.0.827-py3-none-win_amd64.whl.

File metadata

  • Download URL: goudengine-0.0.827-py3-none-win_amd64.whl
  • Upload date:
  • Size: 2.3 MB
  • Tags: Python 3, Windows x86-64
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: twine/6.1.0 CPython/3.13.7

File hashes

Hashes for goudengine-0.0.827-py3-none-win_amd64.whl
Algorithm Hash digest
SHA256 0e26f06cd9aa2115b4a24525d364c9592d51f5e9fac331acafaa047dfc16bda8
MD5 bd84f3c1c556871b54ef12160d3a1f0f
BLAKE2b-256 d070e1340d5a36a7d36d468a94ed7e791e54cad78b074a513cefc197fe004919

See more details on using hashes here.

Provenance

The following attestation bundles were made for goudengine-0.0.827-py3-none-win_amd64.whl:

Publisher: release.yml on aram-devdocs/GoudEngine

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file goudengine-0.0.827-py3-none-manylinux2014_x86_64.whl.

File metadata

File hashes

Hashes for goudengine-0.0.827-py3-none-manylinux2014_x86_64.whl
Algorithm Hash digest
SHA256 7f8be8c2d816287cf3842c8bd60dcbb2ae7a9605011579542ca19e6654168d7a
MD5 a7ce8c780b9229662cfbbffd072c3f0b
BLAKE2b-256 1e669364673a379a9c6db083938d1aec0dbdcdf9c5ad990fbf79451e3d645c63

See more details on using hashes here.

Provenance

The following attestation bundles were made for goudengine-0.0.827-py3-none-manylinux2014_x86_64.whl:

Publisher: release.yml on aram-devdocs/GoudEngine

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file goudengine-0.0.827-py3-none-macosx_14_0_arm64.whl.

File metadata

File hashes

Hashes for goudengine-0.0.827-py3-none-macosx_14_0_arm64.whl
Algorithm Hash digest
SHA256 45a57ebdfe5c03331015a1ef56c544119cb38a6ae0d0f47129ac330a522900e8
MD5 ff64f0bf253e11f96c2cf36c0a67483c
BLAKE2b-256 630542a546b945db7136a380dc04b08950f48e3bb5b0b1f092f58512d27eea86

See more details on using hashes here.

Provenance

The following attestation bundles were made for goudengine-0.0.827-py3-none-macosx_14_0_arm64.whl:

Publisher: release.yml on aram-devdocs/GoudEngine

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file goudengine-0.0.827-py3-none-macosx_13_0_x86_64.whl.

File metadata

File hashes

Hashes for goudengine-0.0.827-py3-none-macosx_13_0_x86_64.whl
Algorithm Hash digest
SHA256 598220c109762ba900ebed94bb737acbb4f1198a2ccfc301c9e9c2e473385c15
MD5 0b450494fa19c49e01c399114dfc1c4d
BLAKE2b-256 c94c948a2a126e18bc3ae15624e675f8c75a7f6b46f63db2fbc75b5e57d1cc90

See more details on using hashes here.

Provenance

The following attestation bundles were made for goudengine-0.0.827-py3-none-macosx_13_0_x86_64.whl:

Publisher: release.yml on aram-devdocs/GoudEngine

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

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