Sprite ohne Screen ?

Anfängerfragen zum Programmieren mit PureBasic.
Benutzeravatar
The_Dark_Zim-.-
Beiträge: 372
Registriert: 18.03.2008 16:53

Sprite ohne Screen ?

Beitrag von The_Dark_Zim-.- »

Hey Ho
wie kann ich folgenden Code umsetzen, ohne das ich ein Screen auf machen muss. Wollte den entstehenden Ramen auf Bilder zeichnen lassen und dann das Ganze abspeichern.

Code: Alles auswählen

InitSprite()
InitSprite3D()
InitNetwork() 

OpenScreen(1600,1200,32,"rand")

CreateSprite(0,1600,1200, #PB_Sprite_Texture)
CreateSprite(1,1600,1200, #PB_Sprite_Texture)

ReceiveHTTPFile("http://www.castleuk.net/fun/2008/images/herstmonceux1600.bmp",  GetTemporaryDirectory()+"herstmonceux1600.bmp")

LoadSprite(3, GetTemporaryDirectory()+"herstmonceux1600.bmp")

StartDrawing(SpriteOutput(0))
For i = 0 To 200

Box(0,i,1600,1,RGB(200-i,200-i,200-i))
Box(0,1000+i,1600,1,RGB(i,i,i))

Next
StopDrawing()

StartDrawing(SpriteOutput(1))
For i = 0 To 200

Box(1400+i,0,1,1200,RGB(i,i,i))
Box(i,0,1,1200,RGB(200-i,200-i,200-i))

Next

StopDrawing()

CreateSprite3D(0,0)
CreateSprite3D(1,1)

DisplaySprite(3,0,0)

Start3D()
  Sprite3DBlendingMode(1, 4)
 DisplaySprite3D(0,0,0)
 DisplaySprite3D(1,0,0)
Stop3D()
 
FlipBuffers()
Delay(5000)
Gruß Zim
PB: 5.xx LTS x86/x64 | WIN: 10 Pro x64, Linux Mint x64
Benutzeravatar
STARGÅTE
Kommando SG1
Beiträge: 7031
Registriert: 01.11.2005 13:34
Wohnort: Glienicke
Kontaktdaten:

Re: Sprite ohne Screen ?

Beitrag von STARGÅTE »

Sprites ohne Screen geht nicht !

Nimm einfach Images!

Die Befehle sind die selber, halt nur im Image:
CreateImage, ImageOutput

und dann SaveImage()

das #PB_Sprite_Texture brauchst du ja eh nicht mehr, weil kein Screen gibt.
PB 6.01 ― Win 10, 21H2 ― Ryzen 9 3900X, 32 GB ― NVIDIA GeForce RTX 3080 ― Vivaldi 6.0 ― www.unionbytes.de
Aktuelles Projekt: Lizard - Skriptsprache für symbolische Berechnungen und mehr
Benutzeravatar
The_Dark_Zim-.-
Beiträge: 372
Registriert: 18.03.2008 16:53

Re: Sprite ohne Screen ?

Beitrag von The_Dark_Zim-.- »

Hm soweit sogut. Das laden ist ja kein Problem, es ist blos das ich mit Images ja keinen BlendingMode hab. Oder doch ? Ich leg ja nicht einfach 2-3 Bilder übereinander.
PB: 5.xx LTS x86/x64 | WIN: 10 Pro x64, Linux Mint x64
Benutzeravatar
STARGÅTE
Kommando SG1
Beiträge: 7031
Registriert: 01.11.2005 13:34
Wohnort: Glienicke
Kontaktdaten:

Re: Sprite ohne Screen ?

Beitrag von STARGÅTE »

JO das ist richtig,

dann kannst du entweder doch n Screen nehmen (aber WindowedScreen)
oder du stellst den Blender nach, mit CustomFilterCallback()

Auch Sprite3DBlendingMode() macht ja nix weiter als den unteren Pixel mit dem oberen zu einem neuen Pixel zu generieren.
das kannst du dann auch mit CustomFilterCallback()

Musst halt nur nachlesen was dein Modus (1,4) macht.
PB 6.01 ― Win 10, 21H2 ― Ryzen 9 3900X, 32 GB ― NVIDIA GeForce RTX 3080 ― Vivaldi 6.0 ― www.unionbytes.de
Aktuelles Projekt: Lizard - Skriptsprache für symbolische Berechnungen und mehr
Benutzeravatar
The_Dark_Zim-.-
Beiträge: 372
Registriert: 18.03.2008 16:53

Re: Sprite ohne Screen ?

Beitrag von The_Dark_Zim-.- »

Problem.. ich verstehe den Filter nicht ...
Wäre nett wenn jemand ihn mir erklären könnte, oder es mir so macht das es funktioniert wie mit dem Sprite ganz oben ^^

Code: Alles auswählen

 InitNetwork()
 
  Procedure FilterCallback(x, y, QuellFarbe, ZielFarbe)
    ProcedureReturn RGBA(Red( QuellFarbe), Green( ZielFarbe), Blue( QuellFarbe), Alpha(ZielFarbe))
  EndProcedure
  
;ReceiveHTTPFile("http://www.castleuk.net/fun/2008/images/herstmonceux1600.bmp",  GetTemporaryDirectory()+"herstmonceux1600.bmp")
  
LoadImage(2, GetTemporaryDirectory()+"herstmonceux1600.bmp")

If OpenWindow(0, 0, 0, 1600, 1200, "2DDrawing Example", #PB_Window_SystemMenu | #PB_Window_ScreenCentered)

CreateImage(0,1600,1200)
CreateImage(1,1600,1200)


StartDrawing(ImageOutput(0))
 DrawImage(ImageID(2), 0, 0, 1600, 1200)

  For i = 0 To 200  
    DrawingMode(#PB_2DDrawing_CustomFilter)      
    CustomFilterCallback(@FilterCallback())
    Box(0,1000+i,1600,1,RGB(i,i,i))
    Box(0,i,1600,1,RGB(200-i,200-i,200-i))
   Next
 StopDrawing()
 
StartDrawing(ImageOutput(0))
  DrawImage(ImageID(0), 0, 0, 1600, 1200)
 
   For i = 0 To 200  
    DrawingMode(#PB_2DDrawing_CustomFilter)      
    CustomFilterCallback(@FilterCallback())
    Box(1400+i,0,1,1200,RGB(i,i,i))
    Box(i,0,1,1200,RGB(200-i,200-i,200-i))
  Next
StopDrawing()

ImageGadget(0, 0, 0, 1600, 1200, ImageID(0))

    Repeat
      Event = WaitWindowEvent()
    Until Event = #PB_Event_CloseWindow
EndIf
Gruß Zim
PB: 5.xx LTS x86/x64 | WIN: 10 Pro x64, Linux Mint x64
Benutzeravatar
STARGÅTE
Kommando SG1
Beiträge: 7031
Registriert: 01.11.2005 13:34
Wohnort: Glienicke
Kontaktdaten:

Re: Sprite ohne Screen ?

Beitrag von STARGÅTE »

Mein problem ist, dass ich dein Code oben nicht verstehe ^^

Da ist weder n Eventschleife für den Srceen, noch speichert es das erstellte Bild nach dem Start3D()

CustomFilterCallback brauchst du außerdem noch garnicht beim erstellen von Sprite 0 und 1
das bleibt einfach so wie du es hattest, nur mit Image.

Und unten ersetzt du den start3D-Block, mit einem DrawingBlock
und ersetzt das Sprite3DBlendingMode mit
DrawingMode(#PB_2DDrawing_CustomFilter)
CustomFilterCallback(@FilterCallback())

Den Callback musst du dann noch schreiben.

Dort gibt ZielFarbe die Farbe des Pixels an, der zur Zeit da ist.
und QuellFarbe die Farbe mit der Gezeichnet wird.

Würdest du also QuellFarbe zurück geben, wäre das eine normale Zeichnung!
Würdest du ZielFarbe zurück geben, wäre es so als zeichnest du garnicht, der aktuelle Hintergrund/altes Bild bleibt bestehen.
eine Farbaddition wäre dann also, wenn du die Farbkanäle addierst und daraus eine RGB machst die dann zurückgegeben wird.
usw.
PB 6.01 ― Win 10, 21H2 ― Ryzen 9 3900X, 32 GB ― NVIDIA GeForce RTX 3080 ― Vivaldi 6.0 ― www.unionbytes.de
Aktuelles Projekt: Lizard - Skriptsprache für symbolische Berechnungen und mehr
Benutzeravatar
The_Dark_Zim-.-
Beiträge: 372
Registriert: 18.03.2008 16:53

Re: Sprite ohne Screen ?

Beitrag von The_Dark_Zim-.- »

Zu meinem oberen Code:
Ich mache blos einen Screen auf und erstelle 2 Sprite's. Auf den Sprite's erstelle ich jeweils einen Farbverlauf von schwarz nach weiß, dieser geht vom Rand (schwarz) zur Mitte (weiß). Und ich lade ein Sprite aus dem Internet als Hintergrund. Dann Wandel ich die ersten beiden zu 3D Sprite's um und lege die mit dem Blendmode über den Hintergrund. Und dann warte ich eine weile und dann ist es wird das Programm beendet. Ich weiss nicht was man da nicht verstehen sollte.
Gut das mit dem Speichern ist nicht drin, aber das ist ja nebensächlich.

Gruß Zim
PB: 5.xx LTS x86/x64 | WIN: 10 Pro x64, Linux Mint x64
Benutzeravatar
STARGÅTE
Kommando SG1
Beiträge: 7031
Registriert: 01.11.2005 13:34
Wohnort: Glienicke
Kontaktdaten:

Re: Sprite ohne Screen ?

Beitrag von STARGÅTE »

Wunderbar, Farbverläufe kannst du ja mit Image noch leiter machen als mit Sprites.

Stichwort: Gradient:

Dein Code vereinfacht sich nun zu:

Code: Alles auswählen

Width = 800
Height = 600

OpenWindow(0, 0, 0, Width, Height, "2DDrawing Example", #PB_Window_SystemMenu | #PB_Window_ScreenCentered)
LoadImage(0, "Burg.bmp")
ResizeImage(0, Width, Height)

StartDrawing(ImageOutput(0))
 DrawingMode(#PB_2DDrawing_Gradient|#PB_2DDrawing_AlphaBlend)      
 BoxedGradient(0,0,Width,Height)
  GradientColor(1.0,$80000000)
  GradientColor(0.8,$00000000)
  GradientColor(0.0,$00000000)
 Box(0,0,Width,Height)
StopDrawing() 

ImageGadget(0, 0, 0, 640, 512, ImageID(0))
 
Repeat
 Event = WaitWindowEvent()
Until Event = #PB_Event_CloseWindow
Du kannst auch gleich mein RoundBoxedGradient nehmen:

Code: Alles auswählen

Structure RoundBoxedGradient
 x.i
 y.i
 Width.i
 Height.i
 RoundX.i
 RoundY.i
EndStructure


Procedure.f RoundBoxedGradientCallback(x.i, y.i)
 Shared RoundBoxedGradient.RoundBoxedGradient
 With RoundBoxedGradient
  x - \x
  y - \y
  If x < \RoundX 
   If y < \RoundY
    ProcedureReturn Sqr(Pow((\RoundX-x)/\RoundX,2)+Pow((\RoundY-y)/\RoundY,2))
   ElseIf y >= \Height-\RoundY
    ProcedureReturn Sqr(Pow((\RoundX-x)/\RoundX,2)+Pow((\RoundY+y+1-\Height)/\RoundY,2))
   Else
    ProcedureReturn (\RoundX-x)/\RoundX
   EndIf
  ElseIf x >= \Width-\RoundX
   If y < \RoundY
    ProcedureReturn Sqr(Pow((\RoundX+x+1-\Width)/\RoundX,2)+Pow((\RoundY-y)/\RoundY,2))
   ElseIf y >= \Height-\RoundY
    ProcedureReturn Sqr(Pow((\RoundX+x+1-\Width)/\RoundX,2)+Pow((\RoundY+y+1-\Height)/\RoundY,2))
   Else
    ProcedureReturn (\RoundX+x+1-\Width)/\RoundX
   EndIf
  Else
   If y < \RoundY
    ProcedureReturn (\RoundY-y)/\RoundY
   ElseIf y >= \Height-\RoundY
    ProcedureReturn (\RoundY+y+1-\Height)/\RoundY
   Else
    ProcedureReturn 0
   EndIf   
  EndIf
 EndWith
EndProcedure


Procedure RoundBoxedGradient(x.i, y.i, Width.i, Height.i, RoundX.i, RoundY.i=#PB_Default)
 Shared RoundBoxedGradient.RoundBoxedGradient
 With RoundBoxedGradient
  \x = x
  \y = y
  \Width = Width
  \Height = Height
  \RoundX = RoundX
  \RoundY = RoundY
  If RoundY=#PB_Default : \RoundY = RoundX : EndIf
  If \RoundX < 0 : \RoundX = 0 : EndIf
  If \RoundY < 0 : \RoundY = 0 : EndIf
  If \RoundX*2 > Width : \RoundX = Width/2 : EndIf
  If \RoundY*2 > Height : \RoundY = Height/2 : EndIf
 EndWith
 CustomGradient(@RoundBoxedGradientCallback())
EndProcedure



Width = 800
Height = 600

OpenWindow(0, 0, 0, Width, Height, "2DDrawing Example", #PB_Window_SystemMenu | #PB_Window_ScreenCentered)
LoadImage(0, "Burg.bmp")
ResizeImage(0, Width, Height)

StartDrawing(ImageOutput(0))
 DrawingMode(#PB_2DDrawing_Gradient|#PB_2DDrawing_AlphaBlend)      
 RoundBoxedGradient(-50,-50,Width+100,Height+100,100)
  GradientColor(1.0,$F0000000)
  GradientColor(0.0,$00000000)
 Box(0,0,Width,Height)
StopDrawing() 

ImageGadget(0, 0, 0, 640, 512, ImageID(0))
 
Repeat
 Event = WaitWindowEvent()
Until Event = #PB_Event_CloseWindow
ich denke damit lässt es sich "spielen"
PB 6.01 ― Win 10, 21H2 ― Ryzen 9 3900X, 32 GB ― NVIDIA GeForce RTX 3080 ― Vivaldi 6.0 ― www.unionbytes.de
Aktuelles Projekt: Lizard - Skriptsprache für symbolische Berechnungen und mehr
Benutzeravatar
The_Dark_Zim-.-
Beiträge: 372
Registriert: 18.03.2008 16:53

Re: Sprite ohne Screen ?

Beitrag von The_Dark_Zim-.- »

Traust du mir irgentwie nicht? Oder warum hast du meinen Code nicht einfach mal laufen lassen? :(

Naja das ist auf jeden Fall das, was ich gesucht hab

Danke dir ;)

Gruß Zim
PB: 5.xx LTS x86/x64 | WIN: 10 Pro x64, Linux Mint x64
Benutzeravatar
STARGÅTE
Kommando SG1
Beiträge: 7031
Registriert: 01.11.2005 13:34
Wohnort: Glienicke
Kontaktdaten:

Re: Sprite ohne Screen ?

Beitrag von STARGÅTE »

Wie schon geschreiben:
Dein Code läuft (zumindest bei mir) nicht !
1. Falsche Auflösung -> geht nicht !
2. keine Eventschleife -> hängt sich auf !
3. keine Abbruchbedingung -> zu riskant !
4. Download kommt nach OpenScreen, und läuft ohne Events -> Hängt sich auf !

ich hatte ihn umgeschrieben um zu sehen as ermacht, nun hast du dein Ergebnis.
PB 6.01 ― Win 10, 21H2 ― Ryzen 9 3900X, 32 GB ― NVIDIA GeForce RTX 3080 ― Vivaldi 6.0 ― www.unionbytes.de
Aktuelles Projekt: Lizard - Skriptsprache für symbolische Berechnungen und mehr
Antworten