Compare commits
2 Commits
ff8260f224
...
282e7de4b4
| Author | SHA1 | Date |
|---|---|---|
|
|
282e7de4b4 | 3 months ago |
|
|
786549e9c2 | 3 months ago |
7 changed files with 126 additions and 66 deletions
@ -0,0 +1,104 @@ |
|||
# 🎮 Návod pro studenty: Jak připravit hru pro GameGlass Portál |
|||
|
|||
Ahoj! Abys mohl/a svou hru nahrát na náš školní GameGlass portál a ukázat ji všem ostatním přímo ve webovém prohlížeči, stačí dodržet několik jednoduchých pravidel. |
|||
|
|||
--- |
|||
|
|||
## 1. Pravidla pro Pygame (Grafické hry) |
|||
|
|||
Aby tvoje Pygame hra mohla běžet uvnitř internetového prohlížeče, musí být strukturována tzv. "asynchronně" (aby nezamrzla prohlížeč). |
|||
|
|||
**Musíš udělat přesně tyto 3 kroky ve svém kódu:** |
|||
|
|||
1. **Importuj `asyncio`:** |
|||
Na úplný začátek souboru, hned k `import pygame`, přidej: |
|||
```python |
|||
import pygame |
|||
import asyncio |
|||
``` |
|||
|
|||
2. **Zabal hru do asynchronní funkce:** |
|||
Celý kód tvé hry (nebo alespoň tvoji hlavní herní smyčku) musíš zabalit do asynchronní funkce (např. `async def main():`). |
|||
A na úplný konec souboru pak hru spustit pomocí `asyncio.run(main())`. |
|||
|
|||
3. **Přidej odpočinkovou pauzu do smyčky:** |
|||
Do tvé hlavní smyčky `while True:` musíš (ideálně nakonec smyčky) přidat magické zaříkávadlo: |
|||
```python |
|||
await asyncio.sleep(0) |
|||
``` |
|||
*Tento příkaz řekne prohlížeči: "Teď si můžeš na milisekundu odpočinout a vykreslit obrazovku". Bez tohoto příkazu hra okamžitě zamrzne a spadne!* |
|||
|
|||
**Ukázková kostra správné Pygame hry:** |
|||
```python |
|||
import pygame |
|||
import asyncio |
|||
|
|||
# --- Zde dej své funkce a nastavení --- |
|||
|
|||
async def main(): |
|||
pygame.init() |
|||
screen = pygame.display.set_mode((800, 600)) |
|||
clock = pygame.time.Clock() |
|||
running = True |
|||
|
|||
while running: |
|||
for event in pygame.event.get(): |
|||
if event.type == pygame.QUIT: |
|||
running = False |
|||
|
|||
# Zde se děje logika hry a vykreslování... |
|||
screen.fill((0, 0, 0)) |
|||
pygame.display.flip() |
|||
|
|||
# Omezení FPS |
|||
clock.tick(60) |
|||
|
|||
# MAGICKÝ PŘÍKAZ (NUTNÉ PRO WEB!) |
|||
await asyncio.sleep(0) |
|||
|
|||
pygame.quit() |
|||
|
|||
# Spuštění asynchronní hry |
|||
if __name__ == "__main__": |
|||
asyncio.run(main()) |
|||
``` |
|||
|
|||
--- |
|||
|
|||
## 2. Pravidla pro terminálové hry (Čistý Python textovky) |
|||
|
|||
Pokud děláš obyčejnou textovou hru (pouze příkazy `print` a `input`), je to velmi jednoduché: |
|||
|
|||
- Nemusíš používat `asyncio` vůbec. |
|||
- Můžeš normálně používat `input("Zadej volbu: ")`. Portál sám vytvoří interaktivní textové pole. |
|||
- Pokud chceš "vyčistit obrazovku" terminálu, můžeš použít klasický příkaz: |
|||
```python |
|||
import os |
|||
os.system('cls') # nebo os.system('clear') |
|||
``` |
|||
|
|||
--- |
|||
|
|||
## 3. Pravidla pro Ren'Py (Vizuální Novely) |
|||
|
|||
- Tvoje hra bude spuštěna přes Web Assembly engine Ren'Py. |
|||
- **Krok navíc:** Před zabalením do ZIPu jdi do složky své hry a zazipuj POUZE obsah složky `game/` (tedy soubory `.rpy` a složku s obrázky `images/`). Portál nepotřebuje zbytek enginu (soubory `.exe`, `.sh`), engine už v portálu je. |
|||
|
|||
--- |
|||
|
|||
## ⚠️ DŮLEŽITÉ UPOZORNĚNÍ K CESTÁM V KÓDU (Pro všechny hry) |
|||
**NIKDY** ve svém kódu nepoužívejte tzv. "natvrdo zadrátované cesty" k obrázkům nebo k vašemu disku! (Tzv. Absolutní cesty). |
|||
|
|||
❌ **ŠPATNĚ (Na webu to spadne):** |
|||
```python |
|||
os.chdir(r"C:\Users\Student\Plocha\MojeHra") # NIKDY! |
|||
image = pygame.image.load(r"C:\Users\Student\Plocha\MojeHra\assets\hrdina.png") |
|||
``` |
|||
|
|||
✅ **SPRÁVNĚ (Relativní cesty):** |
|||
Aplikace běží v paměti na internetu (kde disk C:\ vůbec neexistuje). Používejte relativní cesty: |
|||
```python |
|||
image = pygame.image.load("assets/hrdina.png") |
|||
``` |
|||
|
|||
Až budeš mít hotovo, všechny své soubory a složky označ a zabal přímo do archivu **.ZIP** a nahraj do formuláře na portálu! |
|||
@ -1,11 +0,0 @@ |
|||
import os |
|||
import glob |
|||
|
|||
os.chdir(r'C:\gitprojekty_skola\python_gamejam_examples\pygame') |
|||
for f in glob.glob('*.py'): |
|||
if f.startswith('patch'): continue |
|||
with open(f, 'r', encoding='utf-8') as file: |
|||
content = file.read() |
|||
content = content.replace('async def hlavni_smycka():', 'async def hlavni_smycka():') |
|||
with open(f, 'w', encoding='utf-8') as file: |
|||
file.write(content) |
|||
Binary file not shown.
@ -1,25 +0,0 @@ |
|||
import os |
|||
import glob |
|||
import re |
|||
|
|||
os.chdir(r'C:\gitprojekty_skola\python_gamejam_examples\pygame') |
|||
for f in glob.glob('*.py'): |
|||
with open(f, 'r', encoding='utf-8') as file: |
|||
content = file.read() |
|||
|
|||
# 1. async def |
|||
content = re.sub(r'(\s*)def hlavni_smycka\(\):', r'\1async def hlavni_smycka():', content) |
|||
|
|||
# 2. Add await to hlavni_smycka() calls |
|||
content = re.sub(r'(\s+)hlavni_smycka\(\)', r'\1await hlavni_smycka()', content) |
|||
|
|||
# 3. Fix asyncio.sleep(0) |
|||
# Odstranime stary await asyncio.sleep(0) a jeho komentar |
|||
content = re.sub(r'[ \t]*# PØIDÁNO PRO WEB: Dáme prohlížeèi šanci pøekreslit obrazovku\s+await asyncio\.sleep\(0\)\s*', '\n', content) |
|||
|
|||
# Pridame ho tesne za hodiny.tick(...) se stejnym odsazenim |
|||
content = re.sub(r'([ \t]*)(.*hodiny\.tick.*)', r'\1\2\n\1# PØIDÁNO PRO WEB: Dáme prohlížeèi šanci pøekreslit obrazovku\n\1await asyncio.sleep(0)', content) |
|||
|
|||
with open(f, 'w', encoding='utf-8') as file: |
|||
file.write(content) |
|||
print(f'Opraveno: {f}') |
|||
@ -1,29 +0,0 @@ |
|||
import os |
|||
import glob |
|||
import re |
|||
|
|||
os.chdir(r'C:\gitprojekty_skola\python_gamejam_examples\pygame') |
|||
for f in glob.glob('*.py'): |
|||
if f == 'patch.py': |
|||
continue |
|||
with open(f, 'r', encoding='utf-8') as file: |
|||
content = file.read() |
|||
|
|||
# 1. async def |
|||
content = re.sub(r'(\s*)def hlavni_smycka\(\):', r'\1async async def await hlavni_smycka():', content) |
|||
|
|||
# 2. Add await to await hlavni_smycka() calls |
|||
content = re.sub(r'(\s+)hlavni_smycka\(\)', r'\1await await hlavni_smycka()', content) |
|||
|
|||
# 3. Fix asyncio.sleep(0) |
|||
# Match the old comment containing WEB without needing special chars |
|||
content = re.sub(r'[ \t]*#.*WEB.*\s+await asyncio\.sleep\(0\)\s*', '\n', content) |
|||
|
|||
# Pridame ho tesne za hodiny.tick(...) se stejnym odsazenim |
|||
# PRIDANO PRO WEB |
|||
await asyncio.sleep(0) |
|||
content = re.sub(r'([ \t]*)(.*hodiny\.tick.*)', r'\1\2\n\1# PRIDANO PRO WEB\n\1await asyncio.sleep(0)', content) |
|||
|
|||
with open(f, 'w', encoding='utf-8') as file: |
|||
file.write(content) |
|||
print(f'Opraveno: {f}') |
|||
Loading…
Reference in new issue