Überlappende Grafiken beim Landschaftsgenerator

Hier werden alle anderen GUI-Toolkits sowie Spezial-Toolkits wie Spiele-Engines behandelt.
Antworten
Dexter1997
User
Beiträge: 92
Registriert: Sonntag 2. Dezember 2012, 21:13

Gegebene Situation: Es gibt eine Baumgrafik, eine Steingrafik und eine Grasgrafik.
Diese 3 Grafiken werden zufällig ausgewählt und zufällig auf einer grünen Wiese verteilt.

Problem: häufig sieht man irgendwelche Grafiken überlappen, da der zufallsgenerator sich nicht davor scheut, gegenstände übermalen zu lassen.

Wie löse ich das Problem? (Bitte nicht zu schwer, ich bin ein anfänger in pygame)

Dann wollte ich noch fragen, ob es möglich ist, bei der speilanzeige von pygame die sichtfläche hin und her zu bewegen? wenn ja, wie baut man das ein?

ich bitte um antworten!:)
LG Henry

Code: Alles auswählen

import pygame, sys, random

# Gras: 105 x 34 Pixel
# Baum: 87 x 162 Pixel
# Stein: 105 x 49 Pixel

Gras = pygame.image.load("Gras.png")
Baum = pygame.image.load("Baum.png")
Stein = pygame.image.load("Stein.png")

pygame.init()
screen = pygame.display.set_mode([900, 480])
screen.fill([0, 255, 0])

for i in range (10):
    x = random.randint(10, 800)
    y = random.randint(10, 400)
    Wert = random.randint(1, 3) # Baum, Gras oder Stein Bestimmung
    if Wert  == 1:
        screen.blit(Gras, [x, y])
    if Wert == 2:
        screen.blit(Baum, [x, y])
    if Wert == 3:
        screen.blit(Stein, [x, y])
        
pygame.display.flip()
    
while True:
    
    for event in pygame.event.get():
        if event.type == pygame.QUIT:
            sys.exit()
                    
BlackJack

@Dexter1997: Man könnte sich zum Beispiel Position und Grösse der bereits platzierten Objekte merken und wenn in einem Bereich schon ein Objekt existiert eine neue Position wählen. Dann muss man allerdings aufpassen, dass es immer unwahrscheinlicher wird einen freien Platz zu finden je mehr Objekte bereits auf der Spielfläche sind. Deshalb könnte man auch überlegen ob die Objekte wirklich so frei platziert werden müssen und stattdessen ein Raster erstellt und für jede „Kachel” mit einer gewissen Wahrscheinlichkeit auswählt, ob und welches Objekt dort platziert wird.

Für eine grössere Spielfläche als sichtbar ist, kann man entweder ein grösseres `Surface` erstellen und dort die Objekte drauf „blitten” und dann in die Anzeige einen Ausschnitt davon „blitten”, oder man merkt sich nur die Positionen der Objekte und ermittelt welche sich davon gerade im sichtbaren Ausschnitt befinden und „blittet” die an die entsprechenden Positionen in die Anzeige.
webspider
User
Beiträge: 485
Registriert: Sonntag 19. Juni 2011, 13:41

Stichwort zur letzteren Frage wäre "Viewport", eine Art virtuelle Kamera, auf welche in der Spielschleife (ja, die letzten paar Zeilen) Rücksicht genommen wird. Damit könntest du nicht nur das Verschieben der Ansicht, sondern auch Rotation und Zoom einbauen.
Dexter1997
User
Beiträge: 92
Registriert: Sonntag 2. Dezember 2012, 21:13

BlackJack hat geschrieben: Deshalb könnte man auch überlegen ob die Objekte wirklich so frei platziert werden müssen und stattdessen ein Raster erstellt und für jede „Kachel” mit einer gewissen Wahrscheinlichkeit auswählt, ob und welches Objekt dort platziert wird.
Bei dem Gedanken würde ich gern mal stehenbleiben. Man könnte ja einen endlos langen Code schreiben, um jeder Grafik einen Raster zuzuweisen. das wäre aber ein bisschen umständlich. Was könnte es da für möglichkeiten geben, so ein raster mit möglichst wenig code zu programmieren?
BlackJack

@Dexter1997: Da gibt es so etwas das nennt sich Schleife.
Dexter1997
User
Beiträge: 92
Registriert: Sonntag 2. Dezember 2012, 21:13

eine SCHLEIFE? Krass... das hab ich ja noch nie gehört:D
na super, dann muss ich mir wohl selber den kopf zerbrechen...
webspider
User
Beiträge: 485
Registriert: Sonntag 19. Juni 2011, 13:41

Sollte das oben keine bestens getarnte Ironie sein: Schleifen hast du in dem gezeigten Quellcode gleich zwei. Und wenn sie dir so viel Kopfzerbrechen bereiten, dann viel Spaß mit Objektorientierung, die kommt des öfteren in fortgeschrittenen Pygame-Beispielen vor und ist früher oder später notwendig, damit nicht jede kleinste Änderung in einer Menge Schreibarbeit ausartet.
Dexter1997
User
Beiträge: 92
Registriert: Sonntag 2. Dezember 2012, 21:13

Weil du es grad ansprichst, möchte ich hier nochmal eine Frage zu Objekten stellen, weil mir da noch etwas unklar ist, und ich keinen neuen Thread aufachen möchte. Wenn ich eine Instanz von einer Klasse erstelle, sind die Attribute die die Instanz von der __init__ Methode der jeweiligen Objekte wirklich global? und wenn ja, warum kann ich denn in den Methoden diese verändern und etwas mit ihnen machen, ohne vorher anzugeben das sie global sind? (Da Methoden ja Funktionen sind)

(PS selbstverständlich war der vorige Post etwas ironisch gemeint:) )
BlackJack

@Dexter1997: In dem Satz mit `__init__` fehlt mindestens ein Wort.

Attribute von Objekten sind natürlich nicht global. Die definition von Attributen von einem Objekt ist ja gerade das sie an das Objekt gebunden sind, also jedes Objekt seinen eigenen Satz an Attributen hat.
Antworten