For..Each-Schleife in For..Each-Schleife ...? (Selber Type)
Übersicht BlitzBasic Allgemein
TennisballBetreff: For..Each-Schleife in For..Each-Schleife ...? (Selber Type) |
Mo, Nov 02, 2009 21:44 Antworten mit Zitat |
|
---|---|---|
Hi,
Ich habe, sagen wir, 500 Objekte des selben Types. Nun möchte ich für jedes prüfen, ob es mit einem der anderen 499 kollidiert ist. (Wie) geht das? (mir gehts nur um die Sache mit den Schleifen etc.) mfg, Tennisball |
||
DjDETE |
Mo, Nov 02, 2009 22:00 Antworten mit Zitat |
|
---|---|---|
Code: [AUSKLAPPEN] ;type deklarieren
Type test Field test ;500 objekte erstellen for i=0 to 499 t.test=new test t\test=createsphere() next for t1.test=each type for t2.test=each type if t1\test=t2\test then nothing=0 next next Das Beispiel vergleicht nur die Werte Test und überprüft keine Kollision. Die Sache mit den Schleifen sollte aber klar sein. MfG DeTe Edit: Tut mir leid, mein (dummer) Fehler |
||
Aktuelles Projekt: XXX |XXX | 3% der v1b fertig
www.emu-soft.de.vu Für die Homepage suche ich noch Linktauschpartner, bei Interesse einfach melden. |
- Zuletzt bearbeitet von DjDETE am Mo, Nov 02, 2009 22:14, insgesamt einmal bearbeitet
PSY |
Mo, Nov 02, 2009 22:00 Antworten mit Zitat |
|
---|---|---|
Code: [AUSKLAPPEN] Type blubb
Field eigenschaft% End Type Global b.blubb, b2.blubb For i= 1 To 500 b.blubb = New blubb b\eigenschaft = Rand(999) Next Repeat For b.blubb = Each blubb For b2.blubb = Each blubb If b <> b2 ;check for collision EndIf Next Next Until KeyHit(1) End L8er, PSY (edit) @DjDETE Zitat: for t1.type=each type
for t2.type=each type statt type muss es test lauten edit2 ok hast es vor mir gemerkt lol |
||
E. Urbachehemals "Basicprogger" |
Mo, Nov 02, 2009 22:11 Antworten mit Zitat |
|
---|---|---|
Zu den beiden Vorpostern möchte ich anmerken, dass bei den genannten Codes die Kollision zwischen 2 Objekten doppelt geprüft wird, was vollkommen unnötig ist und bei 500 Objekten sogar ein ernsthaftes Performanceproblem darstellen kann (500 * 500 = 250.000 Iterationen).
Ich würde den Index manuell verschieben oder gleich Arrays mit Index benutzen, die es noch performanter schaffen. |
||
- Zuletzt bearbeitet von E. Urbach am Mo, Nov 02, 2009 22:22, insgesamt einmal bearbeitet
RallimenSieger des 30-EUR-Wettbewerbs |
Mo, Nov 02, 2009 22:17 Antworten mit Zitat |
|
---|---|---|
bei dem Beispiel wird jeder mit jedem 1x geprüft, aber nicht mit sich selbst
Code: [AUSKLAPPEN] For a1.test = Each test
a2.test = After a1 While a2 <> Null If a1\test = a2\test Then ; <=> anpassen ;mach was ; End If a2 = After a2 Wend Next |
||
[BB2D | BB3D | BB+]
|
Silver_Knee |
Mo, Nov 02, 2009 22:19 Antworten mit Zitat |
|
---|---|---|
also ideal ist wenn die innere Schleife aus While und After gebaut wird und nur immer bis zu dem objekt selbst kontrolliert und dann abbricht
Dann machst du aus: Code: [AUSKLAPPEN] 1 2 3
1 X X X 2 X X X 3 X X X nur noch Code: [AUSKLAPPEN] 1 2 3
1 X 2 X X 3 X X X Wenn du dann noch vor dem Objekt selbst abrichst Code: [AUSKLAPPEN] 1 2 3
1 2 X 3 X X Für ein "dass es überhaupt funktioniert" sind allerdings die oberen schleifen ausreichend EDIT: Rallimen mach es genau anders herum: Code: [AUSKLAPPEN] 1 2 3
1 X X 2 X 3 |
||
Tennisball |
Di, Nov 03, 2009 17:57 Antworten mit Zitat |
|
---|---|---|
Ah danke, funktioniert prima.
Danke! |
||
Übersicht BlitzBasic Allgemein
Powered by phpBB © 2001 - 2006, phpBB Group