Kollisionsabfrage

Anfängerfragen zum Programmieren mit PureBasic.
obar
Beiträge: 111
Registriert: 22.11.2007 19:47

Kollisionsabfrage

Beitrag 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 
Zuletzt geändert von obar am 25.11.2007 03:22, insgesamt 1-mal geändert.
Benutzeravatar
HeX0R
Beiträge: 3042
Registriert: 10.09.2004 09:59
Computerausstattung: AMD Ryzen 7 5800X
96Gig Ram
NVIDIA GEFORCE RTX 3060TI/8Gig
Win11 64Bit
G19 Tastatur
2x 24" + 1x27" Monitore
Glorious O Wireless Maus
PB 3.x-PB 6.x
Oculus Quest 2 + 3
Kontaktdaten:

Beitrag 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
obar
Beiträge: 111
Registriert: 22.11.2007 19:47

Beitrag 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.
Benutzeravatar
#NULL
Beiträge: 2238
Registriert: 20.04.2006 09:50

Beitrag von #NULL »

da fehlt ein "nicht" deinem satz im ersten post :mrgreen:
my pb stuff..
Bild..jedenfalls war das mal so.
obar
Beiträge: 111
Registriert: 22.11.2007 19:47

Beitrag von obar »

Habs korrigiert. Aber eine Lösung für mein Problem hast du nicht?
Benutzeravatar
#NULL
Beiträge: 2238
Registriert: 20.04.2006 09:50

Beitrag von #NULL »

ich mach ja schon..
sag aber nochmal bitte genauer was du überhaupt machen willst. sonst gibt's zu viele möglichkeiten.
Zuletzt geändert von #NULL am 25.11.2007 03:46, insgesamt 2-mal geändert.
my pb stuff..
Bild..jedenfalls war das mal so.
obar
Beiträge: 111
Registriert: 22.11.2007 19:47

Beitrag 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
Benutzeravatar
#NULL
Beiträge: 2238
Registriert: 20.04.2006 09:50

Beitrag 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
Zuletzt geändert von #NULL am 25.11.2007 04:14, insgesamt 1-mal geändert.
my pb stuff..
Bild..jedenfalls war das mal so.
obar
Beiträge: 111
Registriert: 22.11.2007 19:47

Beitrag 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.
Kaeru Gaman
Beiträge: 17389
Registriert: 10.11.2004 03:22

Beitrag 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...
Der Narr denkt er sei ein weiser Mann.
Der Weise weiß, dass er ein Narr ist.
Antworten