@Dare Devil
Du hast schon Recht, Sprites haben den Vorteil, dass sie schnell sind und
du viel mit machen kannst, aber halt den Nachteil, dass sie einen Screen
benötigen. Den Screen benötigt die Grafikkarte.
Sprites werden über OpenGL, DirectX und damit direkter an die Grafikkarte
geschickt. Bei den 2D-Drawing-Befehlen in einem Image oder Window
erledigt dein Programm, also der Prozessor und Windows diese Zeichenbefehle,
damit ist es wesentlich langsamer und deshalb muss es auch getrennt
betrachtet werden.
Transparenz, wenn es durchscheinend sein soll, kannste nicht anders
realisieren. Das ist halt die Mathematik, die da hinter steckt.
Du kannst hächstens komplett durchsichtige Pixel anders realisieren.
Das würdest du machen, in dem du dir eine Farbe aussuchst, die
du nicht mit überträgst und diese stellst du dann einfach nicht da.
Beispiel:
IF PinpettenFarbwert <> RGB(255,255,0)
ZeichnePixel ...
EndIF
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
Einen Screen kannste übrigens auch in der Größe verändern.
Ich würde das auch nicht unbedingt mit reinnehmen, dass man
ständig die Größe des Bildes ändern kann, wie oft kommt das schon vor,
dass man das wirklich machen muss?
Die meisten Programme erlauben es, noch die Bildgröße mit verschiedenen
Rändern an den 4 Seiten unterschiedlich anzufügen.
Sagen wir, du hast ein Bild: 400 x 300 und willst es auf 500 x 350 machen.
Dann kannste zum Beispiel sagen,
dein neues Bild soll links um 50 Pixel erweitert werden, rechts um 50 Pixel
und oben um 50 Pixel.
Die Umsetzung im Programm wäre dann, dass du ein neues Image
erzeugst, was 500 x 350 groß ist und wo du dann bei den
Koordinaten 50,50 das alte Bild reinkopierst.
Das alte Bild kannst du nun ebenfalls in der Größe ändern und das
neue Bild komplett drauf kopieren, und das neue Bild wieder frei geben.
So haste ein altes Bild mit Rand, und es wurde um die Anzahl an Pixeln
erweitert, die der Nutzer wollte und deine Malfunktionen kannst du genauso
weiter auf dieses Bild anwenden wie vorher.
Was das Scrollen angeht, machste einen Trick, du Scrollst nicht
den Screen, sondern den Inhalt des Screens. Du stellst also das
Bild an einer anderen Stelle da. Die Scrollbalken können dann genauso
Gadgets bleiben.
Code: Alles auswählen
; Folker Linstedt aka xaby
; 2008-01-18
If InitSprite() = 0
MessageRequester("Error", "Can't open screen & sprite enviroment!", 0)
End
EndIf
If OpenWindow(0, 0, 0, 340, 370, "A screen in a window...", #PB_Window_SystemMenu|#PB_Window_SizeGadget|#PB_Window_ScreenCentered)
ScrollBarGadget(0,WindowWidth(0)-30,10,20,WindowHeight(0)-100,0,300,10,#PB_ScrollBar_Vertical)
ScrollBarGadget(1,10,WindowHeight(0)-50,WindowWidth(0)-70,20,0,300,10)
SpinGadget(2,GadgetWidth(1)+GadgetX(1)+10,GadgetY(1),40,20,1,8,#PB_Spin_Numeric)
If CreateStatusBar(0, WindowID(0))
AddStatusBarField(320)
StatusBarText(0, 0, "Automatically zoomed screen area when changing window size...")
EndIf
If OpenWindowedScreen(WindowID(0), 0, 0, 300, 300, 1, 40, 70) ; wir benötigen nicht die exakte Bildschirmbreite/-höhe, da diese automatisch angepasst werden...
InitSprite3D()
Else
MessageRequester("Error", "Can't open windowed screen!", 0)
End
EndIf
EndIf
CreateSprite(0,512,512,#PB_Sprite_Texture)
StartDrawing(SpriteOutput(0))
LineXY(0,0,400,200,RGB(200,100,50))
Circle(60,70,30,RGB(0,255,0))
Circle(260,350,100,RGB(0,100,250))
StopDrawing()
CreateSprite3D(0,0)
Z=1
Repeat
; Es ist sehr wichtig, alle im Queue befindlichen Ereignisse während jedes Frames abzuarbeiten
;
Repeat
Event = WindowEvent()
If Event = #PB_Event_CloseWindow
End
EndIf
If Event = #PB_Event_SizeWindow
ResizeGadget(0,WindowWidth(0)-30,10,20,WindowHeight(0)-100)
ResizeGadget(1,10,WindowHeight(0)-50,WindowWidth(0)-70,20)
ResizeGadget(2,GadgetWidth(1)+GadgetX(1)+10,GadgetY(1),40,20)
EndIf
Until Event = 0
ClearScreen(RGB(255,255,255))
ZoomSprite3D(0,SpriteWidth(0)*GetGadgetState(2),SpriteHeight(0)*GetGadgetState(2))
Start3D()
DisplaySprite3D(0,10-GetGadgetState(1)*GetGadgetState(2),10-GetGadgetState(0)*GetGadgetState(2))
Stop3D()
Delay(1)
FlipBuffers()
ForEver
Mal zum Rumspielen. Erstellt kein neues großes Bild,
aber hat zwei Zoom-Funktionen mit integriert.
