Objekte zeichnen
Übersicht

Krumu1201Betreff: Objekte zeichnen |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
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 |
![]() Antworten mit Zitat ![]() |
---|---|---|
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 |
Übersicht


Powered by phpBB © 2001 - 2006, phpBB Group