add ammo tips
This commit is contained in:
parent
3f7bbe470e
commit
d0d65d018d
1 changed files with 100 additions and 16 deletions
116
README_TIPS.md
116
README_TIPS.md
|
|
@ -106,24 +106,24 @@ for px, py in trinkbrunnen_positions:
|
||||||
|
|
||||||
**So geht's:**
|
**So geht's:**
|
||||||
|
|
||||||
1. Definiere einen Abstandsfaktor, z.B.:
|
**Wo und wie den Abstandsfaktor einbauen?**
|
||||||
|
|
||||||
|
1. **Definiere den Abstandsfaktor ganz oben in deiner Hauptdatei (z.B. `water-game.py`):**
|
||||||
|
|
||||||
```python
|
```python
|
||||||
DIST_FACTOR = 2.0 # 2.0 = doppelte Entfernung, 1.0 = Standard
|
DIST_FACTOR = 2.0 # Beispielwert, kann angepasst werden
|
||||||
```
|
```
|
||||||
|
|
||||||
2. Wende den Faktor auf alle Positionen und die Kartengröße an:
|
2. **Wende den Faktor direkt nach dem Laden der Daten an:**
|
||||||
|
|
||||||
|
- Nachdem du die Trinkbrunnen-Positionen und ggf. die Spieler-/Gegner-Positionen geladen hast, multipliziere sie mit dem Abstandsfaktor:
|
||||||
|
|
||||||
```python
|
```python
|
||||||
# Karte vergrößern
|
# Nach dem Laden der Trinkbrunnen-Positionen
|
||||||
scaled_map = pygame.transform.smoothscale(map_surface, (int(MAP_W * DIST_FACTOR), int(MAP_H * DIST_FACTOR)))
|
trinkbrunnen_positions = np.load('trinkbrunnen_pixel_positions.npy')
|
||||||
WIN.blit(scaled_map, (0, 0))
|
trinkbrunnen_positions = [(int(px * DIST_FACTOR), int(py * DIST_FACTOR)) for px, py in trinkbrunnen_positions]
|
||||||
|
|
||||||
# Positionen der Trinkbrunnen anpassen
|
# Spieler und Gegner ebenfalls anpassen (direkt nach deren Initialisierung):
|
||||||
for px, py in trinkbrunnen_positions:
|
|
||||||
pygame.draw.circle(WIN, (0, 180, 255), (int(px * DIST_FACTOR), int(py * DIST_FACTOR)), 10)
|
|
||||||
|
|
||||||
# Spieler und Gegner-Positionen ebenfalls multiplizieren
|
|
||||||
player.x *= DIST_FACTOR
|
player.x *= DIST_FACTOR
|
||||||
player.y *= DIST_FACTOR
|
player.y *= DIST_FACTOR
|
||||||
for enemy in enemies:
|
for enemy in enemies:
|
||||||
|
|
@ -131,8 +131,48 @@ for enemy in enemies:
|
||||||
enemy.y *= DIST_FACTOR
|
enemy.y *= DIST_FACTOR
|
||||||
```
|
```
|
||||||
|
|
||||||
- Wichtig: Wende den Faktor direkt nach dem Laden der Positionen an, damit alle Objekte synchron gestreckt werden.
|
3. **Beim Rendern der Karte:**
|
||||||
- So wird die Karte "größer" und die Wege zwischen den Trinkbrunnen länger!
|
|
||||||
|
- Skaliere die Karte beim Anzeigen:
|
||||||
|
|
||||||
|
```python
|
||||||
|
scaled_map = pygame.transform.smoothscale(map_surface, (int(MAP_W * DIST_FACTOR), int(MAP_H * DIST_FACTOR)))
|
||||||
|
WIN.blit(scaled_map, (0, 0))
|
||||||
|
```
|
||||||
|
|
||||||
|
**Tipp:**
|
||||||
|
|
||||||
|
- Der Abstandsfaktor sollte immer am Anfang und nur einmal auf die Positionen angewendet werden, damit alle Objekte synchron gestreckt werden.
|
||||||
|
- Passe ggf. auch die Spielfeldgröße (`WIDTH`, `HEIGHT`) an, wenn die Karte sehr groß wird.
|
||||||
|
|
||||||
|
## Schnelles Skalieren der Karte nach dem Laden
|
||||||
|
|
||||||
|
- Statt alle Positionen und Objekte zu multiplizieren, kannst du die Karte direkt nach dem Laden einmalig skalieren und die Originalkoordinaten beibehalten.
|
||||||
|
- Das ist viel schneller und spart Rechenzeit!
|
||||||
|
|
||||||
|
**So geht's:**
|
||||||
|
|
||||||
|
1. **Karte nach dem Laden skalieren:**
|
||||||
|
|
||||||
|
```python
|
||||||
|
DIST_FACTOR = 2.0 # Beispielwert
|
||||||
|
|
||||||
|
# Nach dem Laden der Karte (z.B. map_surface):
|
||||||
|
scaled_map = pygame.transform.smoothscale(map_surface, (int(MAP_W * DIST_FACTOR), int(MAP_H * DIST_FACTOR)))
|
||||||
|
```
|
||||||
|
|
||||||
|
2. **Beim Rendern die Karte und alle Objekte mit dem Faktor verschieben:**
|
||||||
|
|
||||||
|
```python
|
||||||
|
WIN.blit(scaled_map, (0, 0))
|
||||||
|
for px, py in trinkbrunnen_positions:
|
||||||
|
pygame.draw.circle(WIN, (0, 180, 255), (int(px * DIST_FACTOR), int(py * DIST_FACTOR)), 10)
|
||||||
|
# Spieler, Gegner usw. ebenfalls mit DIST_FACTOR multiplizieren, aber nur beim Zeichnen!
|
||||||
|
```
|
||||||
|
|
||||||
|
- Die Positionsdaten bleiben im Speicher unverändert, nur die Darstellung wird gestreckt.
|
||||||
|
- Das ist besonders bei großen Karten und vielen Objekten viel performanter.
|
||||||
|
- Du kannst den Abstandsfaktor jederzeit ändern, ohne die Originaldaten zu verlieren.
|
||||||
|
|
||||||
## .exe erstellen (Windows)
|
## .exe erstellen (Windows)
|
||||||
|
|
||||||
|
|
@ -215,7 +255,51 @@ def play_intro_video(win, video_path):
|
||||||
- Nach dem Intro kannst du wie gewohnt den Titelbildschirm anzeigen.
|
- Nach dem Intro kannst du wie gewohnt den Titelbildschirm anzeigen.
|
||||||
- Für Windows/Mac kann die Fenster-ID Methode abweichen, siehe Doku von pygame-vlc.
|
- Für Windows/Mac kann die Fenster-ID Methode abweichen, siehe Doku von pygame-vlc.
|
||||||
|
|
||||||
## Zusätzliche Hinweise
|
## Munition für den Spieler und Anzeige als Counter
|
||||||
|
|
||||||
- Stelle sicher, dass alle Bilder und Daten im richtigen Pfad liegen.
|
- So fügst du dem Spieler eine Munition-Variable hinzu und zeigst sie als Counter im Spiel an:
|
||||||
- Für komplexe Projekte nutze eine [PyInstaller spec file](https://pyinstaller.org/en/stable/spec-files.html).
|
|
||||||
|
**1. Munition im Player anlegen:**
|
||||||
|
|
||||||
|
- Ergänze die Player-Klasse um ein Attribut, z.B.:
|
||||||
|
|
||||||
|
```python
|
||||||
|
class Player:
|
||||||
|
def __init__(self, x, y, image):
|
||||||
|
self.x = x
|
||||||
|
self.y = y
|
||||||
|
self.image = image
|
||||||
|
self.ammo = 10 # Startwert für Munition
|
||||||
|
# ...
|
||||||
|
```
|
||||||
|
|
||||||
|
**2. Munition beim Schießen verringern:**
|
||||||
|
|
||||||
|
```python
|
||||||
|
if player.ammo > 0:
|
||||||
|
bottles.append(TapWater(player.x, player.y, player.dir))
|
||||||
|
player.ammo -= 1
|
||||||
|
else:
|
||||||
|
print("Keine Munition!")
|
||||||
|
```
|
||||||
|
|
||||||
|
**3. Munition beim Berühren eines Trinkbrunnens auffüllen:**
|
||||||
|
|
||||||
|
```python
|
||||||
|
MAX_AMMO = 10
|
||||||
|
# ...
|
||||||
|
if player_rect.colliderect(brunnen_rect):
|
||||||
|
player.ammo = MAX_AMMO
|
||||||
|
```
|
||||||
|
|
||||||
|
**4. Munition als Counter im HUD anzeigen:**
|
||||||
|
|
||||||
|
- Im Haupt-Draw-Loop nach dem Zeichnen der Spielfläche:
|
||||||
|
|
||||||
|
```python
|
||||||
|
font = pygame.font.SysFont(None, 32)
|
||||||
|
ammo_text = font.render(f"Wasser: {player.ammo}", True, (0, 0, 255))
|
||||||
|
WIN.blit(ammo_text, (20, 20))
|
||||||
|
```
|
||||||
|
|
||||||
|
- So sieht der Spieler immer, wie viel Munition noch übrig ist!
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue