Seite 2 von 2

Re: Neuankömmling in Purebasic

Verfasst: 03.03.2015 07:43
von Baba_Smurf
Hallo und danke mk-soft,

das ich positionen berechnen muss ist soweit klar, aber wie mache ich das gedanklich bei mehreren hundert kleinen Bildern ohne das die sich überlappen, bei ein paar Bilder wäre das kein Problem, aber man kann doch nicht jedes Bild mit jedem vergleichen, da die Anzahl und die Größe der Bilder nicht fest steht.
Nur zum besseren Verständnis, ich möchte nicht, das mir jemand den Code schreibt, ich brauche nur ein paar Gedankengänge, auf die ich vielleicht nicht komme.

mfg

Re: Neuankömmling in Purebasic

Verfasst: 03.03.2015 07:49
von Nino

Re: Neuankömmling in Purebasic

Verfasst: 03.03.2015 09:58
von alter Mann
Die Kollisionsberechnung ist doch gar nicht so schwer: Dein Bild hat eine Hintergrundfarbe. Wenn Du Dein "Steinchen" (per Zufall) positioniert hast, kontrollierst Du einfach (für jedes Pixel), ob an der Pixelposition eine Farbe ist, die nicht der Hintergrundfarbe entspricht. Dann hast Du eine Kollision.

Re: Neuankömmling in Purebasic

Verfasst: 03.03.2015 13:20
von mk-soft
Habe das mal umgesetzt. Geht nur mit einer Farbe im Hintergrund
für die relative schnelle Umsetzung verwende ich die Funktion "CustomFilterCallback"

Vor dem zeichnen des Bildes den Bereich vorher prüfen

Code: Alles auswählen

; Fenster
Enumeration
  #Main
EndEnumeration

; Gadgets
Enumeration
  #Canvas
EndEnumeration

Global exit

; Pictures
Enumeration
  #pic0
  #pic1
EndEnumeration


Procedure LoadPictures()

  CompilerIf #PB_Compiler_OS = #PB_OS_Windows
    LoadImage(#pic0, #PB_Compiler_Home + "examples\sources\Data\Background.bmp")
    LoadImage(#pic1, #PB_Compiler_Home + "examples\sources\Data\PurebasicLogo.bmp")
  CompilerElse
    LoadImage(#pic0, #PB_Compiler_Home + "examples/sources/Data/Background.bmp")
    LoadImage(#pic1, #PB_Compiler_Home + "examples/sources/Data/PurebasicLogo.bmp")
  CompilerEndIf
  
EndProcedure

; ***************************************************************************************

Global IsCollision, CollisionBackColor

Procedure CollisionCallback(x, y, SourceColor, TargetColor)
  
  Protected Color
 
  Color = TargetColor & $FFFFFF
  If Color <> CollisionBackColor
    IsCollision = #True
  EndIf
  ProcedureReturn TargetColor
  
EndProcedure
  
Procedure CollisionBox(x, y, dx, dy, backcolor)
  
  IsCollision = #False
  CollisionBackColor = BackColor
  
  DrawingMode(#PB_2DDrawing_CustomFilter)      
  CustomFilterCallback(@CollisionCallback())
  Box(x, y, dx, dy, 0)
  DrawingMode(#PB_2DDrawing_Default)      
  
  ProcedureReturn IsCollision
  
EndProcedure

; ***************************************************************************************

Procedure Draw()
  
  Protected x, y, dx, dy
  
  dx = GadgetWidth(#Canvas)
  dy = GadgetHeight(#Canvas)
  
  If StartDrawing(CanvasOutput(#Canvas))
    Box(0, 0, dx, dy, RGB(192,192,192))
    DrawImage(ImageID(#pic0), 10, 10)
    If CollisionBox(30, 40, ImageWidth(#pic1), ImageHeight(#pic1), RGB(192,192,192))
      Debug "1. Kollision"
    Else 
      Debug "1. Keine Kollision"
    EndIf
    DrawImage(ImageID(#pic1), 30, 40)
    If CollisionBox(300, 200, ImageWidth(#pic1), ImageHeight(#pic1), RGB(192,192,192))
      Debug "2. Kollision"
    Else 
      Debug "2. Keine Kollision"
    EndIf
    DrawImage(ImageID(#pic1), 300, 200)
    StopDrawing()
  EndIf
  
EndProcedure

Procedure Main()
  
  Protected Event
  
  If OpenWindow(#Main, #PB_Any, #PB_Any, 800, 600, "CanvasGadget", #PB_Window_SystemMenu | #PB_Window_ScreenCentered)
    
    CanvasGadget(#Canvas, 5, 5, WindowWidth(#Main) - 10, WindowHeight(#Main) - 10)
    
    LoadPictures()
    
    Draw()
    
    Repeat
      Event = WaitWindowEvent()
      
      Select Event
          
        Case #PB_Event_Repaint
          ;Draw()
          
        Case #PB_Event_CloseWindow
          exit = #True
          
      EndSelect
      
    Until exit
    
  EndIf
    
EndProcedure : Main()
:wink:

P.S. Hab eine Include mit weiteren Funktionen erstellt.
http://www.purebasic.fr/german/viewtopi ... =8&t=28782

Re: Neuankömmling in Purebasic

Verfasst: 03.03.2015 17:37
von Baba_Smurf
Vielen Dank,

ich werde mich mal die Tage dran setzen und sehen, wie ich das umsetze.

mfg