Sprite aus Memory

Anfängerfragen zum Programmieren mit PureBasic.
Benutzeravatar
unix
Beiträge: 361
Registriert: 15.02.2005 19:25
Wohnort: Zwischen Coburg und Bamberg :-)
Kontaktdaten:

Sprite aus Memory

Beitrag von unix »

Also ich habe folgendes Problem:

Ich hab ein Bild in einen Buffer geschriben

Schema:

Code: Alles auswählen

Pixel(x,y) = PeekL(*Buffer+x*y*SizeOf(LONG))
Und ich will das in ein Image oder Sprite ohne eine schleife für x und y durchzugehen

also ohne:

Code: Alles auswählen

StartDrawing(SpriteOutput())
 Pitch = DrawingBufferPitch()
                      ;__  
 For y = 0 to 599     ;  \__Ohne das
 For x = 0 to 799     ;__/
 
 *Buffer.LONG = Drawingbuffer()
 *Buffer + (Pitch*y) + (x*4)
 
 *Buffer\l = PeekL(*Img+x*y*SizeOf(LONG))
            ;__
 next       ;  \__Und ohne das
 next       ;__/

StopDrawing()
Also kurz ich brauchse sowas wie

Code: Alles auswählen

CatchSprite(Sprite, *Buffer)
Hier steht normalerweise die Putzfrau drin,
die hat aber Urlaub.
MfG : Unix
Benutzeravatar
Franky
Beiträge: 1132
Registriert: 29.08.2004 16:31
Wohnort: Münsterland
Kontaktdaten:

Beitrag von Franky »

Mit Sprite wird schwierig, da die im Videobuffer liegen, mit Images hilft dir GetDIBits_() bzw. SetDIBits_()
Falsch zugeordnetes Zitat des Tages: "O'zapft is" - Edward Snowden :)
Benutzeravatar
Xaby
Beiträge: 2144
Registriert: 12.11.2005 11:29
Wohnort: Berlin + Zehdenick
Kontaktdaten:

ich habe da mal ein Problem

Beitrag von Xaby »

Wo ihr gerade von Sprites redet.
Gibt es eine Möglichkeit, Sprites in einer Windowed-Anwendung zu benutzen oder kann ich da nur die Drawing-Routinen nutzen.
Ich möchte gern den Komfort von Buttons, Menüs und Panel-Tabs usw. nutzen und gleichzeitig Sprites ausgeben.
Die haben aber keine OutPutID ...
Oder kann ich in einem OpenWindow() noch ein OpenScreenWindow() erstellen?

Oder wie könnte ich das machen?
Kinder an die Macht http://scratch.mit.edu/
Benutzeravatar
nco2k
Beiträge: 892
Registriert: 08.09.2004 23:13

Beitrag von nco2k »

@unix

Code: Alles auswählen

Image.l = CatchImage(#PB_Any, *Buffer)
If Image
  Sprite.l = CreateSprite(#PB_Any, Width, Height)
  If Sprite
    If StartDrawing(SpriteOutput(Sprite))
      DrawImage(UseImage(Image), 0, 0, Width, Height)
      StopDrawing()
    EndIf
  EndIf
  FreeImage(Image)
EndIf
@Xaby

Code: Alles auswählen

If InitSprite() And OpenWindow(0, 0, 0, 640, 480, #PB_Window_SystemMenu | #PB_Window_ScreenCentered, "test") And OpenWindowedScreen(WindowID(0), 0, 0, 640, 480, 0, 0, 0)
  
  If CreateSprite(0, 256, 256)
    If StartDrawing(SpriteOutput(0))
      Box(0, 0, 256, 256, RGB(255, 0, 0))
      StopDrawing()
    EndIf
  EndIf
  
  Repeat
    
    ClearScreen(0, 0, 0)
    
    If IsSprite(0)
      DisplaySprite(0, 128, 128)
    EndIf
    
    FlipBuffers()
    
    WinEvent = WindowEvent()
    If WinEvent = 0
      Delay(1)
    EndIf
    
  Until WinEvent = #PB_Event_CloseWindow
  
EndIf

End
edit: gadgets kannst du dann z.b. daneben setzen:

Code: Alles auswählen

If InitSprite() And OpenWindow(0, 0, 0, 640, 480, #PB_Window_SystemMenu | #PB_Window_ScreenCentered, "test") And OpenWindowedScreen(WindowID(0), 0, 0, 540, 480, 0, 0, 0)
  
  If CreateGadgetList(WindowID(0))
    ButtonGadget(0, 545, 450, 90, 25, "Exit", #PB_Button_Default)
  EndIf
  
  If CreateSprite(0, 256, 256)
    If StartDrawing(SpriteOutput(0))
      Box(0, 0, 256, 256, RGB(255, 0, 0))
      StopDrawing()
    EndIf
  EndIf
  
  Repeat
    
    ClearScreen(0, 0, 0)
    
    If IsSprite(0)
      DisplaySprite(0, 128, 128)
    EndIf
    
    FlipBuffers()
    
    WinEvent = WindowEvent()
    If WinEvent = 0
      Delay(1)
    ElseIf WinEvent = #PB_Event_Gadget And EventGadgetID() = 0
      Break
    EndIf
    
  Until WinEvent = #PB_Event_CloseWindow
  
EndIf

End
so in etwa.

c ya,
nco2k
Zuletzt geändert von nco2k am 17.11.2005 19:34, insgesamt 1-mal geändert.
~|__/
..o.o.. <--- This is Einkaufswagen. Copy Einkaufswagen into your signature to help him on his way to world domination.
Benutzeravatar
Ypser
XMas-Contest-Gewinner '03
Beiträge: 128
Registriert: 29.08.2004 14:35
Computerausstattung: Win7
Wohnort: Ingelheim
Kontaktdaten:

Re: ich habe da mal ein Problem

Beitrag von Ypser »

Guck mal unter OpenWindowedScreen().
Bild
Benutzeravatar
unix
Beiträge: 361
Registriert: 15.02.2005 19:25
Wohnort: Zwischen Coburg und Bamberg :-)
Kontaktdaten:

Beitrag von unix »

nco2k hat geschrieben:@unix

Code: Alles auswählen

Image.l = CatchImage(#PB_Any, *Buffer)
If Image
  Sprite.l = CreateSprite(#PB_Any, Width, Height)
  If Sprite
    If StartDrawing(SpriteOutput(Sprite))
      DrawImage(UseImage(Image), 0, 0, Width, Height)
      StopDrawing()
    EndIf
  EndIf
  FreeImage(Image)
EndIf
ich hatte an so etwas wie Franky angedeutet hat

aber ich keine Ahnung wie man diese Befehle verwendet

MeinZiel ist es ein Scrennshot meines PC´s per Netzwerk an einen anderen Computer zu versenden und das ganze soll so schnell funktionieren das man es als "Video" versendet.

Also ich will so etwas wie MasterEye Programmieren
Hier steht normalerweise die Putzfrau drin,
die hat aber Urlaub.
MfG : Unix
Antworten