Rectsoverlap zwischen zwei Types

Übersicht BlitzMax, BlitzMax NG Beginners-Corner

Neue Antwort erstellen

Progger93

Betreff: Rectsoverlap zwischen zwei Types

BeitragFr, Apr 17, 2009 12:52
Antworten mit Zitat
Benutzer-Profile anzeigen
Ich bin beim Programmieren auf folgendes Problem gestoßen:

Der Type TPlane hat x,y,höhe und breite als variablen. Über diese wird überprüft ob ein TPlane mit einem anderem in derselben Liste kollidiert. Mit ein paar flugzeugen funktioniert dies auch recht gut...allerdings wenn es mehr als 20 werden geht es immer schlechter, auch die rote Hinterlegung bei einem Abstand von >75 pxl geht nichmehr.
Ich weiß nicht woran es liegen könnte und habe auch die ganze kollision neu geschrieben.

CodeTeil indem die Kollision überprüft werden:
Code: [AUSKLAPPEN]
Method crashcheck()
      'alert=0 -> nix
      'alert=1 -> rot hinterlegt -> zu nah(75pxls)
      'collide=1 -> SpielEnde ^^
      If landing=0 Then
         For Local pp:TPlane=EachIn planelist
            If pp<>Self
               If rectsoverlap(x,y,width,height,pp.x,pp.y,pp.width,pp.height) Then
                  collided=1
               EndIf
               Local dis:int=distance(pp.x,pp.y,x,y)
               If dis<75 Then
                  alert=1
               ElseIf dis>100 then
                  alert=0
               EndIf
            EndIf
         Next
      EndIf
   EndMethod


Code indem die Funktionen Distance(x,y) und rectsoverlap(x1,y1,width1,height1,x2,y2,width2,height2) sind:

Code: [AUSKLAPPEN]
Function Distance:int(x1:int, y1:int, x2:int, y2:int)
   Local disx:int = x2 - x1
   Local disy:int = y2 - y1
   Return Sqr(disx * disx + disy * disy)
End Function

Function rectsoverlap:int(x1:int, y1:int, width1:int, height1:int, x2:int, y2:int, width2:int, height2:int)
   If x1 + width1 > x2 And y1 + height1 > y2 And x1 < x2 + width2 And y1 < y2 + height2 Then
      Return 1
   Else
      Return 0
   EndIf
End Function
MfG Pascal
Win 7|T7250@2.0Ghz|3GB RAM|M8600GT

DaysShadow

BeitragFr, Apr 17, 2009 14:32
Antworten mit Zitat
Benutzer-Profile anzeigen
Was heißt denn, es geht "immer schlechter"? Klappt die Überprüfung gar nicht mehr oder wird alles einfach nur langsam? Könnte sein, da du z.b. bei 20 TPlane's 20 mal die Liste durchgehst und alles durchcheckst, das kann schon mal dauern und dementsprechend langsam werden.
Und wegen der roten Hinterlegung, das ist auch wenig schlecht gelöst, da z.b. ein TPlane im Abstand < 75 sein kann und die Hinterlegung rot färbt, dass nächste dann aber wieder einen Abstand > 100 hat und die Hinterlegung wieder weiß färbt, da du ja bei jedem TPlane die ganze Liste durchgehst.

MfG DaysShadow
Blessed is the mind too small for doubt

Progger93

BeitragFr, Apr 17, 2009 17:10
Antworten mit Zitat
Benutzer-Profile anzeigen
Es geht immer schlchter heißt, dass bei den meisten Flugzeugen die Überprüfung nichtmehr funktioniert und nur einige noch rot werden bzw. kollidieren.
Die Sache mit Dem alert werde ich wohl noch einmal überdenken.
MfG Pascal
Win 7|T7250@2.0Ghz|3GB RAM|M8600GT
 

FWeinb

ehemals "ich"

BeitragFr, Mai 22, 2009 12:42
Antworten mit Zitat
Benutzer-Profile anzeigen
Ich habe in meinem Type TAircarft eine Funktion mit dem Namen Update() was die macht ist wohl selbsterklärend sie geht alle Flugzeuge durch und bewegt diese.

Hier die Funktion die ich benutzte um sie (Pixelgenau)-Kollidieren zu lassen.

BlitzMax: [AUSKLAPPEN]

For Local OtherAircraft:TAircraft = EachIn AircraftList
If OtherAircraft<>Aircraft And Aircraft.Land <> 1 And OtherAircraft.Land <> 1 Then
If Aircraft.X>0 And Aircraft.Y>0 And Aircraft.X<GWidth And Aircraft.Y<GHEIGHT And ImagesCollide2(Aircraft.Image, Aircraft.X,Aircraft.Y,0, Aircraft.angel,Aircraft.Scale,Aircraft.Scale, OtherAircraft.Image, OtherAircraft.X, OtherAircraft.Y,0,OtherAircraft.Angel, OtherAircraft.Scale, OtherAircraft.Scale) Then
Aircraft.Collision = 1
OtherAircraft.Collision = 1
EndIf
EndIf
Next
"Wenn die Menschen nur über das sprächen, was sie begreifen, dann würde es sehr still auf der Welt sein." Albert Einstein (1879-1955)
"If you live each day as if it was your last, someday you'll most certainly be right." Steve Jobs

Neue Antwort erstellen


Übersicht BlitzMax, BlitzMax NG Beginners-Corner

Gehe zu:

Powered by phpBB © 2001 - 2006, phpBB Group