Objekte zeichnen

Übersicht BlitzBasic Beginners-Corner

Neue Antwort erstellen

 

Krumu1201

Betreff: Objekte zeichnen

BeitragSa, Mai 05, 2012 22:55
Antworten mit Zitat
Benutzer-Profile anzeigen
Wie bekommt man es hin wenn man mehrere Objekte in einer For-schleife an zuffällige Koordinaten zeichnet, dass diese nicht überlappend gezeichnet werden?

Gruß Krumu1201

SpionAtom

BeitragSo, Mai 06, 2012 1:00
Antworten mit Zitat
Benutzer-Profile anzeigen
Hi Krumu!
Wenn die Objekte wirklich wahllos einfach irgendwo platziert werden sollen, dann müsstest du dir zu jedem Objekt die Koordinaten merken. Jedesmal wenn du nun ein neues Objekt platzieren willst, überprüfe nun (zb per Rechteckkollision oder Kreiskollision), ob diese neue Position mit einem der anderen Objekte kollidiert. In dem Fall müsstest du halt weiter nach neuen Koordinaten suchen. Diese Methode wird langsamer, je mehr Objekte du überprüfen musst.

Code: [AUSKLAPPEN]
Const min_breite = 10, min_hoehe = 5, max_breite = 50, max_hoehe = 40   
Type Objekt
   Field w, h
   Field x, y
End Type
Global O.Objekt

   Graphics 640, 480, 0, 2
   SetBuffer BackBuffer()



   Repeat

      ;ein neues Objekt erschaffen
      If KeyHit(57) Then
         O.Objekt = createObjekt()
      End If

      Cls
      Text 0, 0, "Drücke Leertaste um ein weiteres zufälliges Objekt zu platzieren"

      ;Objekte zeichnen
      For O = Each Objekt
         Rect O\x, O\y, O\w, O\h, 0
      Next

      Flip()

   Until KeyDown(1)
   End




;Erschafft ein neues Objekt, ohne andere Objekte zu überdecken.
;Wird nach 1000 Zufallspositionen kein freier Platz gefunden,
;wird null zurückgegeben.
Function createObjekt.Objekt()

   Local neu_x, neu_y, neu_breite, neu_hoehe
   Local punktInObjektGefunden
   Local versuche = 0, max_versuche = 1000

   ;Suche Koordinaten
   Repeat
      versuche = versuche + 1
      neu_x = Rand( GraphicsWidth() - max_breite )
      neu_y = Rand( GraphicsHeight() - max_hoehe )
      neu_breite = Rand( min_breite, max_breite )
      neu_hoehe = Rand( min_hoehe, max_hoehe )
      punktInObjektGefunden = False
      For O = Each Objekt
         If RectsOverlap(O\x, O\y, O\w, O\h, neu_x, neu_y, neu_breite, neu_hoehe) Then
            punktInObjektGefunden = True
            Exit
         End If
      Next
      If versuche > max_versuche Then Return Null
   Until punktInObjektGefunden = False

   Local neu.Objekt = New Objekt
   neu\x = neu_x
   neu\y = neu_y
   neu\w = neu_breite
   neu\h = neu_hoehe
   Return neu

End Function







Wenn du die Objekte an einem Raster ausrichtest, musst du dir die ganzen Positionen nicht merken. Wenn du zb, 5 Objekte platzieren willst, unterteile dein Spielfeld in 5 Spalten, in jeder Spalte platzierst du dann zufällig ein Objekt. Diese Methode klappt dann, wenn du vorher weißt, wieviele Objekte du platzieren willst.
Code: [AUSKLAPPEN]
   Const anzahl_kreise = 10, min_radius = 10, max_radius = 50


   Graphics 640, 480, 0, 2
   SetBuffer BackBuffer()



   Cls
   Text 0, 0, "Drücke Leertaste um die Objekte neu zu verteilen"
   Flip()

   Repeat

      ;Objekte neu anordnen
      If KeyHit(57) Then
         Cls
         Text 0, 0, "Drücke Leertaste um die Objekte neu zu verteilen"
         spalten_breite = GraphicsWidth() / anzahl_kreise
         For i = 0 To anzahl_kreise - 1
            x = Rand( i * spalten_breite, ((i + 1) * spalten_breite) - max_radius )
            y = Rand( GraphicsHeight() - max_radius )
            r = Rand( min_radius, max_radius )
            Oval x, y, r, r, 0
         Next
         Flip()

         
      End If

   Until KeyDown(1)
   End
os: Windows 10 Home cpu: Intel Core i7 6700K 4.00Ghz gpu: NVIDIA GeForce GTX 1080

Neue Antwort erstellen


Übersicht BlitzBasic Beginners-Corner

Gehe zu:

Powered by phpBB © 2001 - 2006, phpBB Group