Skip to main content

Simple 3D FPS Demo Engine with PyQt6 and procedural world

Project description

Game Engine 🎮

Jednoduchý FPS engine v Pythonu s PyQt6 — s procedurálním generováním světa, kolizemi, minimapou a podporou vlastních objektů.


✨ Hlavní funkce

  • 🕹 FPS kamera — plynulé pohyby, otáčení myší, sprint, skok, reset pozice
  • 🌍 Procedurální generování světa — svět rozdělený na chunky, dynamické načítání bodů
  • 🧱 Statické objekty — definované vzorem nebo generované automaticky
  • 🛡 Kolizní systém — podpora AABB kolizí pro statické objekty
  • 🗺 Minimapa — s možností rotace podle kamery, zobrazuje objekty a chunky
  • 🎨 Podpora barev — každý objekt může mít vlastní barvu
  • 🧩 Jednoduché API — snadné přidávání vlastních objektů, světů i chování
  • Optimalizace — FOV filtr, načítání chunků v okolí kamery

🛠 Instalace

1. Instalace z GitHubu

pip install git+https://github.com/antoninsiska/Game-Engine.git@latest

2. Lokální vývoj

git clone https://github.com/antoninsiska/Game-Engine.git
cd Game-Engine
pip install -e .

3. Požadavky

  • Python 3.9+
  • PyQt6 6.5+

🎮 Spuštění demo aplikace

Po instalaci můžeš spustit výchozí demo:

game-engine

⌨️ Ovládání

Klávesa Funkce
W / A / S / D Pohyb
Myš Otáčení kamery
Shift Sprint
Space Pohyb nahoru
Ctrl / C Pohyb dolů
B Reset pozice
M Přepnutí rotace minimapy
P Pauza hry
ESC Uvolnění myši

🧩 Struktura projektu

game_engine/
│── __init__.py      # veřejné API balíčku
│── gui.py           # FPSDemo třída — GUI logika a renderování
│── world.py         # ChunkWorld a StaticWorld — generování světa
│── objects.py       # StaticObject — definice objektů
│── main.py          # vstupní bod pro příkaz `game-engine`

🔹 Základní použití v Pythonu

import sys
from PyQt6.QtWidgets import QApplication
from game_engine import FPSDemo

app = QApplication(sys.argv)
demo = FPSDemo()
demo.show()
sys.exit(app.exec())

🧱 Přidávání vlastních objektů

1. Statický objekt

from game_engine import StaticObject

cube = StaticObject.from_size(
    3, 3,
    pos=(5, 0, 5),
    color="blue",
    name="kostka",
    collision=True  # ✅ hráč nemůže projít
)
game.static_world.objects.append(cube)

🛡 Kolize

Kolize fungují automaticky pro všechny objekty, které mají collision=True.
Engine používá AABB kolize (axis-aligned bounding box).

Jak nastavit kolizní objekt

tree = StaticObject.from_size(
    2, 5,
    pos=(10, 0, 5),
    color="green",
    name="strom",
    collision=True
)
game.static_world.objects.append(tree)

Jak vytvořit dekoraci bez kolizí

flower = StaticObject.from_size(
    1, 1,
    pos=(3, 0, 3),
    color="yellow",
    name="květina",
    collision=False  # ✅ hráč může projít
)
game.static_world.objects.append(flower)

🌍 Procedurální svět

ChunkWorld

Generuje procedurální body do "chunků".

from game_engine import ChunkWorld

world = ChunkWorld()
world.ensure_chunks_around(0, 0, 60)  # vytvoří chunky kolem kamery
points = world.points_near(0, 0, 30)
print(points)

🧩 StaticWorld API

StaticWorld

Spravuje všechny statické objekty.

from game_engine import StaticWorld, StaticObject

world = StaticWorld()
cube = StaticObject.from_size(3, 3, pos=(5, 0, 5))
world.objects.append(cube)

Metody:

Metoda Popis
points_near(x, z, radius) Vrátí body v okolí kamery
solids_aabb() Vrátí AABB boxy všech kolizních objektů

🎨 StaticObject API

Vytvoření vlastního objektu

obj = StaticObject(
    pattern=[[1,1,1],[1,1,1],[1,1,1]],
    pos=(5, 0, 5),
    name="kostka",
    color="red",
    cell_size=1.0,
    collision=True
)

Parametry:

Parametr Typ Popis
pattern list[list[int]] Vzor objektu
pos tuple Pozice (x,y,z)
name str Název objektu
color QColor/str Barva
cell_size float Velikost jedné buňky
collision bool Povolit kolize

🕹 Vytvoření vlastní hry (MyGame)

import sys
from PyQt6.QtWidgets import QApplication
from game_engine import FPSDemo, StaticObject

class MyGame(FPSDemo):
    def __init__(self):
        super().__init__()

        # Vlastní kolizní objekt
        cube = StaticObject.from_size(
            3, 3,
            pos=(5, 0, 5),
            color="blue",
            name="kostka",
            collision=True
        )
        self.static_world.objects.append(cube)

if __name__ == "__main__":
    app = QApplication(sys.argv)
    game = MyGame()
    game.show()
    sys.exit(app.exec())

Spuštění:

python main.py

🧰 Debugování a tipy

  • Zobrazení kolizních boxů – můžeme přidat debug overlay
  • Úprava FOV – změň VFOV_DEG v gui.py
  • Úprava rychlosti hráče – nastav self.move_speed
  • Úprava chunků – změň CHUNK_SIZE v world.py
  • Přidání minimapy – je vestavěná, zapíná se klávesou M

🛠 Vývoj

Aktualizace enginu

pip install --upgrade git+https://github.com/antoninsiska/Game-Engine.git@latest

Lokální vývoj

git clone https://github.com/antoninsiska/Game-Engine.git
cd Game-Engine
pip install -e .

📜 Licence

MIT © 2025 Antonín Šiška

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

game_engine-0.1.5.tar.gz (13.9 kB view details)

Uploaded Source

Built Distribution

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

game_engine-0.1.5-py3-none-any.whl (12.0 kB view details)

Uploaded Python 3

File details

Details for the file game_engine-0.1.5.tar.gz.

File metadata

  • Download URL: game_engine-0.1.5.tar.gz
  • Upload date:
  • Size: 13.9 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/6.1.0 CPython/3.12.2

File hashes

Hashes for game_engine-0.1.5.tar.gz
Algorithm Hash digest
SHA256 a52098036ca1458a0d71db694900bc26647f731462fa613a76f408ae8d5d1357
MD5 3be47662c84176f1ad9bb7922a98ba3a
BLAKE2b-256 563f40e0611cfd33b04088870d0117338ad8d245ec0a897cf111805009b4b3c1

See more details on using hashes here.

File details

Details for the file game_engine-0.1.5-py3-none-any.whl.

File metadata

  • Download URL: game_engine-0.1.5-py3-none-any.whl
  • Upload date:
  • Size: 12.0 kB
  • Tags: Python 3
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/6.1.0 CPython/3.12.2

File hashes

Hashes for game_engine-0.1.5-py3-none-any.whl
Algorithm Hash digest
SHA256 ac9a230878734cca417f8f88dc3264ded06248eff2f3cf1b5abbcabf03832156
MD5 0e5c21e2bbf17ce7406ce3b817809b58
BLAKE2b-256 3cc421905537e787cda20920d553fa628a215114cb701af35ceda5c743eb2674

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