Graphiklayer 2D
Graphiklayer 2D
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 ?
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 ?
Re: Graphiklayer 2D
Ja ist alles machbar mit verschiedenen Libraries 2d, 3d, Vector, ...
Hier ist ein Beispiel mit der 2d lib (an die Demo Version angepasst):
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
Re: Graphiklayer 2D
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 ?
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 ?
Re: Graphiklayer 2D
Kenne mich mit SpiderBasic nicht aus ich benutze nur PB.
Re: Graphiklayer 2D
ja.. es ist ohnehin die Frage ob es Sinn macht Anwendungen crossplattform zu entwickeln.
Wahrscheinlich werde ich 2gleisig fahren
Wahrscheinlich werde ich 2gleisig fahren
Re: Graphiklayer 2D
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
Re: Graphiklayer 2D
>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
Wie kann das Sinn machen, wenn ich ohnehin getrennt für jedes OS compilieren muss ?
Das Ziel von Purebasic ist sehr ambitioniert
Re: Graphiklayer 2D
Man hat nur einen Sourcecode die Direktiven kapseln dann Code der nicht universell laufen kann.
Re: Graphiklayer 2D
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
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