Graphiklayer 2D

Fragen zu Grafik- & Soundproblemen und zur Spieleprogrammierung haben hier ihren Platz.
MarkNEW
Beiträge: 21
Registriert: 24.09.2021 23:55

Graphiklayer 2D

Beitrag von MarkNEW »

Hallo,

Ich habe mir die TRIALversion von PB herunter gezogen und möchte Folgendes tun.

1. Ein Bild als JPG,PNG und GIF laden (Auflösung width, height)
2. In das BILD Rein und Raus zoomen
3. Auf einen 2. Layer über dem BILD ein Punkt malen
4. Diesen Punkt mit der Maus über dem BILD verschieben.
5. Was ich brauche sind die Mauskoordinaten des Punktes (im Bezug zum SCREEN und FRAME) und die Pixelkoordinaten des Punktes auf dem Bild

Ist das mit Purebasic Boardmitteln machbar ?, wenn ja mit welchen Befehlen ?
Benutzeravatar
Mijikai
Beiträge: 754
Registriert: 25.09.2016 01:42

Re: Graphiklayer 2D

Beitrag von Mijikai »

Ja ist alles machbar mit verschiedenen Libraries 2d, 3d, Vector, ...

Hier ist ein Beispiel mit der 2d lib (an die Demo Version angepasst):

Code: Alles auswählen

EnableExplicit

UsePNGImageDecoder();<- um pngs zu laden

Structure POINT
  x.l
  y.l
EndStructure

Global mouse_pos.POINT
Global mouse_down.i
Global mouse_wheel.i

Procedure.i WindowCallback(Hwnd.i,uMsg.i,wParam.i,lParam.i);<- win api #WM_ events um die maus abzufragen (sind alle in der Vollversion definiert!)
  Protected wheel.w
  Select uMsg
    Case $200;<- wo ist die maus
      mouse_pos\x = lParam & $FFFF
      mouse_pos\y = (lParam >> $10) & $FFFF 
    Case $201;<- ist die linke maus taste gedrückt
      mouse_down = #True
    Case $202;<- ist die rechte maus taste gedrückt
      mouse_down = #False
    Case $20A;<- wird das mausrad bewegt
      wheel = (wParam >> $10) & $FFFF
      wheel = -(wheel / 120)
      mouse_wheel = wheel
  EndSelect
  ProcedureReturn #PB_ProcessPureBasicEvents
EndProcedure

Procedure.i Sprite();<- bild aus dem internet als sprite laden
  Protected *buffer
  Protected sprite.i
  *buffer = ReceiveHTTPMemory("http://s242132022.onlinehome.fr/Download/PureBasic/purebasiclogo.png")
  If *buffer
    sprite = CatchSprite(#PB_Any,*buffer,#PB_Sprite_AlphaBlending)
    FreeMemory(*buffer)
  EndIf
  ProcedureReturn sprite
EndProcedure

Procedure.i Main()
  Protected exit.i
  Protected sprite.i
  Protected sprite_width.i
  Protected sprite_height.i
  Protected offset_x.f
  Protected offset_y.f
  Protected x.f
  Protected y.f
  Protected drag.i
  If InitNetwork() And InitSprite()
    If OpenWindow(0,0,0,960,600,#Null$,#PB_Window_SystemMenu|#PB_Window_ScreenCentered|#PB_Window_MinimizeGadget)
      If OpenWindowedScreen(WindowID(0),10,10,512,512)
        SetFrameRate(60)
        SetWindowCallback(@WindowCallback(),0)
        sprite = Sprite()
        If sprite
          sprite_width = SpriteWidth(sprite)
          sprite_height = SpriteHeight(sprite)
          x = 256
          y = 256
          Repeat
            Repeat
              Select WindowEvent()
                Case #PB_Event_CloseWindow
                  exit = #True
                Case #Null
                  Break
              EndSelect
            ForEver
            ClearScreen($0)
            If mouse_wheel < 0;<- zoom des spites anhand des mausrads berechnen
              offset_x + 100
              offset_y + 100
            ElseIf mouse_wheel > 0
              offset_x - 100
              offset_y - 100
              If offset_x < -500
                offset_x = -500
                offset_y = offset_x
              EndIf
            EndIf
            ZoomSprite(sprite,sprite_width + offset_x,sprite_height + offset_y)
            DisplayTransparentSprite(sprite,-(offset_x / 2),-(offset_y / 2))
            If mouse_down And mouse_pos\x > 9 And mouse_pos\y > 9 And mouse_pos\x < 522 And mouse_pos\y < 522
              If drag
                x = mouse_pos\x - 10;<- maus pos zu screen pos / wo ist die mause im screen
                y = mouse_pos\y - 10
              Else
                drag = Bool(Sqr(Pow(x - mouse_pos\x - 10,2) + Pow(y - mouse_pos\y - 10,2)) < 50.0);<- ist die maus im kreis
              EndIf 
            Else
              mouse_down = #False
              drag = #False
            EndIf
            If StartDrawing(ScreenOutput())
              DrawText(10,10,"Point Screen: " + StrF(x,0) + " x " + StrF(y,0));<- wo ist der kreis in relation zum screen
              DrawText(10,30,"Point Image: " + StrF(x + (offset_x / 2),0) + " x " + StrF(y + (offset_y / 2),0));<- wo ist der kreis in relation zum bild
              Circle(x,y,25,$FFFFFF)
              StopDrawing()
            EndIf
            FlipBuffers()
            mouse_wheel = #Null
          Until exit
        EndIf
      EndIf
      CloseWindow(0)  
    EndIf  
  EndIf
  ProcedureReturn #Null
EndProcedure

Main()

End
MarkNEW
Beiträge: 21
Registriert: 24.09.2021 23:55

Re: Graphiklayer 2D

Beitrag von MarkNEW »

Super Mijikai,

das ist für mich lesbar

danke für die INFO ...

Ich werde die gleiche Anfrage mal in das SpiderBasic-Forum stellen.

Oder denkst Du der gleiche Code läuft auch mit Spider ?
Benutzeravatar
Kiffi
Beiträge: 10621
Registriert: 08.09.2004 08:21
Wohnort: Amphibios 9

Re: Graphiklayer 2D

Beitrag von Kiffi »

MarkNEW hat geschrieben: 26.09.2021 15:33Oder denkst Du der gleiche Code läuft auch mit Spider ?
Der wird so nicht laufen. SetWindowCallback() gibt es (beispielsweise) in SpiderBasic nicht.
Hygge
Benutzeravatar
Mijikai
Beiträge: 754
Registriert: 25.09.2016 01:42

Re: Graphiklayer 2D

Beitrag von Mijikai »

Kenne mich mit SpiderBasic nicht aus ich benutze nur PB.
MarkNEW
Beiträge: 21
Registriert: 24.09.2021 23:55

Re: Graphiklayer 2D

Beitrag von MarkNEW »

ja.. es ist ohnehin die Frage ob es Sinn macht Anwendungen crossplattform zu entwickeln.
Wahrscheinlich werde ich 2gleisig fahren
Benutzeravatar
Kiffi
Beiträge: 10621
Registriert: 08.09.2004 08:21
Wohnort: Amphibios 9

Re: Graphiklayer 2D

Beitrag von Kiffi »

MarkNEW hat geschrieben: 26.09.2021 17:39ja.. es ist ohnehin die Frage ob es Sinn macht Anwendungen crossplattform zu entwickeln.
mit den Compiler-Direktiven kannst Du abhängig vom OS spezifische Codes ausführen:

Code: Alles auswählen

CompilerSelect #PB_Compiler_OS
  CompilerCase #PB_OS_Windows
    ; some Windows specific code
  CompilerCase #PB_OS_MacOS
    ; some Mac OS X specific code
  CompilerCase #PB_OS_Linux
    ; some Linux specific code
  CompilerCase #PB_OS_Web
    ; some SpiderBasic specific code
CompilerEndSelect
Hygge
MarkNEW
Beiträge: 21
Registriert: 24.09.2021 23:55

Re: Graphiklayer 2D

Beitrag von MarkNEW »

>mit den Compiler-Direktiven kannst Du abhängig vom OS spezifische Codes ausführen:

Wie kann das Sinn machen, wenn ich ohnehin getrennt für jedes OS compilieren muss ?

Das Ziel von Purebasic ist sehr ambitioniert
Benutzeravatar
Mijikai
Beiträge: 754
Registriert: 25.09.2016 01:42

Re: Graphiklayer 2D

Beitrag von Mijikai »

Man hat nur einen Sourcecode die Direktiven kapseln dann Code der nicht universell laufen kann.
MarkNEW
Beiträge: 21
Registriert: 24.09.2021 23:55

Re: Graphiklayer 2D

Beitrag von MarkNEW »

Mijikai,

Dein Codebeispiel (oben) funktioniert für einfache Sachen - aber es wird halt sehr komplex, wenn Du mehrere tausend Objekte mit Namen auf unterschiedlichen Ebenen liegen hast - http://www.realoptics.com
So ist das oftmals bei Energieversorgern der Fall

Da ist zumindest ein flaches Objektmodell wie COM fast Pflicht.

Ich wünsche mir ehrlich gesagt VS6 zurück.

Meine Meinung ist, dass Informatiker einen grundsätzlichen Denkfehler haben bei 64bit.

Für das was man sieht - also die reine Darstellung - reichen für alle Bildschirmgrößen RGBA/32bit dicke. Da bringt mir 64bit letztendlich nichts.
... und genau dort brauche ich das Objektmodell

Was man sich wünscht ist etwas mehr Rechenpower unter der Darstellung

Eine Option wäre ja auch noch Windows einfach platzen zu lassen und zu Wine oder ReactOS zu migrieren.
Jedenfalls sehe ich für mich kaum einen Weg an GDI+ vorbei zu kommen

letztendlich ist Plattformunabhängigkeit doch eine Hydra
Gesperrt