Seite 1 von 1

Kollisionsabfrage

Verfasst: 25.11.2007 02:16
von obar
Hallo zusammen,

Ich habe die Zeile markiert die mir Probleme bereitet.
Die Abfrage funz so wie sie hier steht. Aber die Anzahl der Sprites ist natürlich später variabel und nicht fix wie in diesem Beispiel. Ich komm einfach nicht drauf wie ich das anders Abfragen soll.
Bitte Hilfe :(

Code: Alles auswählen

InitMouse() 
InitSprite() 
InitKeyboard() 
OpenScreen(1024,768,32,"")
UsePNGImageDecoder()
UseJPEGImageDecoder() 

anzahl = 3 
spriteCounter = 0 

Dim x(anzahl) 
Dim y(anzahl)
Dim test(anzahl) 
LoadSprite(10, "sprite1.bmp", 0)
LoadSprite(11, "kugel.png",0)
LoadSprite(12, "Landschaft.jpg",0) 

Repeat 
    ClearScreen(0) 
    DisplayTransparentSprite(12, 1, 1)
    
    ; Sprites anzeigen 
    For i = 1 To spriteCounter 
        DisplayTransparentSprite(10, x(i), y(i)) 
    Next i 

    ; Maus anzeigen 
    ExamineMouse() 
    mx = MouseX() 
    my = MouseY() 
    For a=1 To anzahl
      test(a) = SpritePixelCollision(10, mx, my, 10, x(a), y(a))
      DisplayTransparentSprite(10, mx, my)
    Next a
            
    ; Klick überprüfen 
    
    If MouseButton(1) And test(1)=0 And test(2)=0 And test(3)=0     <--------------------------------------- Das ist die verflixte Zeile
        click = 1 
    Else 
        If click = 1 
            click = 2 
        EndIf 
    EndIf 
        
    ; Sprite setzen 
    If click = 2  
        If mx > 300 And mx < 700 And my > 100 And my < 400 
            spriteCounter +1 
            x(spriteCounter) = mx 
            y(spriteCounter) = my 
        EndIf
        If spriteCounter = anzahl 
            Break 
        EndIf 
        click = 0 
    EndIf 

    FlipBuffers() 
    Delay(1) 

    ; ESC überprüfen 
    ExamineKeyboard() 
    If KeyboardReleased(#PB_Key_Escape) 
        End 
    EndIf 
ForEver 

Verfasst: 25.11.2007 02:21
von HeX0R
Hoffe ich habe das mit 13 Bier im Schädel richtig verstanden ?

Code: Alles auswählen

If MouseButton(1)
	Check.l = #True
	For i = 1 To SpriteAnzahl
		If test(i)
			Check = #False
			Break
		EndIf
	Next i
	If Check
		click = 1
	Else
		If click = 1
			click = 2
		EndIf
	EndIf
EndIf

Verfasst: 25.11.2007 02:41
von obar
Danke für die schnelle Antwort.
Habe den Code eingebaut. Dieser scheint aber nicht zu funktionieren.
Ich habe SpriteAnzahl noch angepasst durch anzahl. Aber er setzt nun die Sprites nicht mehr.

Verfasst: 25.11.2007 03:15
von #NULL
da fehlt ein "nicht" deinem satz im ersten post :mrgreen:

Verfasst: 25.11.2007 03:24
von obar
Habs korrigiert. Aber eine Lösung für mein Problem hast du nicht?

Verfasst: 25.11.2007 03:32
von #NULL
ich mach ja schon..
sag aber nochmal bitte genauer was du überhaupt machen willst. sonst gibt's zu viele möglichkeiten.

Verfasst: 25.11.2007 03:41
von obar
Also das läuft so. Ich setzte Sprites in einem Bestimmten Bereich des Screens. Wenn ich die Maustaste drücke wird der Sprite an eben dieser Stelle gezeichnet. Nun will ich mit der Kollisionsabfrage
verhindern, dass 2 Sprites übereinander liegen. Dass heisst, wenn ich versuche einen 2 Sprite über einen bestehenden zu zeichnen. Darf er nicht gezeichnet werden.

Ich hoffe diese Info's reichen. Sonst einfach nochmal nachfragen.
Danke

Verfasst: 25.11.2007 03:46
von #NULL
was du haben willst ist wahrscheinlich das:

Code: Alles auswählen

    For a=1 To anzahl
      test(a) = SpritePixelCollision(10, mx, my, 10, x(a), y(a))
    Next a
    DisplayTransparentSprite(10, mx, my)
hab mir mal ein paar veränderungen erlaubt. ich hoffe das ist was du machen willst
<edit:>
fehler behoben.
und das clickEvent brauchst du auch nicht (ich dachte erst du willst events generieren)

Code: Alles auswählen

InitMouse()
InitSprite()
InitKeyboard()
OpenScreen(1024,768,32,"")
UsePNGImageDecoder()
UseJPEGImageDecoder()

anzahl = 0


Structure S_sprite
  x.l
  y.l
  spr.l
  test.l
EndStructure

Dim arr.S_sprite(anzahl)


; LoadSprite(10, "sprite1.bmp", 0)
; LoadSprite(11, "kugel.png",0)
; LoadSprite(12, "Landschaft.jpg",0)

LoadSprite(10, "C:\test\shape128.bmp", 0)
LoadSprite(11, "C:\test\cursor2.bmp", 0)
LoadSprite(12, "C:\test\1024x768.bmp", 0)

Repeat
    clickEvent = 0
   
    ; Maus
    ExamineMouse()
    mx = MouseX()
    my = MouseY()
   
    ; Klick überprüfen / Sprite setzen
   
    If MouseButton(1)
      If mx > 300 And mx < 700 And my > 100 And my < 400
        coll=0
        For a=1 To anzahl
          If SpritePixelCollision(10, mx, my, arr(a)\spr, arr(a)\x, arr(a)\y)
            coll=1
            Break
          EndIf
        Next
        If coll=0
          anzahl+1
          ReDim arr.S_sprite(anzahl)
          arr(anzahl)\x   = mx
          arr(anzahl)\y   = my
          arr(anzahl)\spr = 10
          clickEvent      = anzahl
        EndIf
      EndIf
    EndIf
   
    If clickEvent
      ;click is now the index where the click occured
      ;higher indices catch the click first
    EndIf
   
   
    ;
   
    ClearScreen(0)
    DisplayTransparentSprite(12, 1, 1)
   
    ; Sprites anzeigen
    For i = 1 To anzahl
        DisplayTransparentSprite(arr(i)\spr, arr(i)\x, arr(i)\y)
    Next i
   
    StartDrawing(ScreenOutput())
      DrawingMode(#PB_2DDrawing_Outlined)
      Box(300,100,400,300,$00ff00)
    StopDrawing()
   
    DisplayTransparentSprite(10, mx, my) ; mouse

    FlipBuffers()
    Delay(1)

    ; ESC überprüfen
    ExamineKeyboard()
    If KeyboardReleased(#PB_Key_Escape)
        End
    EndIf
ForEver

Verfasst: 25.11.2007 04:14
von obar
Danke vielmal. Genau so habe ich es mir vorgestellt.
Ist zwar total anders als vorher. Aber es ist Super auch andere Denkansätze zu sehen. Danke nochmal für deinen Einsatz.

Verfasst: 27.11.2007 15:41
von Kaeru Gaman
grundsätzlich kann man auch hierbei auf eine kollisionsprüfung verzichten,
und z.b. in einer liste mitschreiben, wo schon sprites stehen,
oder wenn die positionen eine matrix bilden, gleich mit ner tileengine arbeiten...