Neuankömmling in Purebasic

Für allgemeine Fragen zur Programmierung mit PureBasic.
Baba_Smurf
Beiträge: 55
Registriert: 01.03.2015 12:05
Wohnort: Saarland / Püttlingen
Kontaktdaten:

Re: Neuankömmling in Purebasic

Beitrag 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
Benutzeravatar
alter Mann
Beiträge: 201
Registriert: 29.08.2008 09:13
Wohnort: hinterm Mond

Re: Neuankömmling in Purebasic

Beitrag 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.
Win11 64Bit / PB 6.0
Benutzeravatar
mk-soft
Beiträge: 3701
Registriert: 24.11.2004 13:12
Wohnort: Germany

Re: Neuankömmling in Purebasic

Beitrag 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
Alles ist möglich, fragt sich nur wie...
Projekte ThreadToGUI / EventDesigner V3 / OOP-BaseClass-Modul
Downloads auf MyWebspace / OneDrive
Baba_Smurf
Beiträge: 55
Registriert: 01.03.2015 12:05
Wohnort: Saarland / Püttlingen
Kontaktdaten:

Re: Neuankömmling in Purebasic

Beitrag von Baba_Smurf »

Vielen Dank,

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

mfg
Antworten