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