Kasperletheater digital

Anfängerfragen zum Programmieren mit PureBasic.
Benutzeravatar
Delle
Beiträge: 1162
Registriert: 10.05.2005 22:48

Kasperletheater digital

Beitrag von Delle »

Hallo,

ich habe vor eine Art "digitales Kasperletheater" zu machen:

Bild

Sprich mit den Slidern bewegt man die Figuren, auch aus dem Fenster raus. Ebenso sollen pro Figur noch zwei andere Mimiken drin sein.

Das Theater wird dann gecroppt via Beamer auf die Wand gezaubert, ohne das man die Bedienelemente sieht.

Jetzt die Preisfrage:

1) Mache ich das in einem normalen Fenster mit Canvas oder alles auf einem Image?

2) Oder WindowedScreen? Also ein Teil Screen mit Flipbuffer usw und der Bedienteil klassisch mit grauen Gadgets etc.?

3) Oder OpenScreen und alles irgendwie anders steuern? Ggfs. mit der Tastatur?

Wichtig wäre ruckelfreies Bewegen der Objekte und diese müssen natürlich transparent sein.

Hat jemand Ideen?
PB 6.30 | Win 11
Benutzeravatar
Delle
Beiträge: 1162
Registriert: 10.05.2005 22:48

Re: Kasperletheater digital

Beitrag von Delle »

So hab gerade bei den Beispielen eigentlich was Passendes gefunden...

Sehe ich das aber richtig, dass hier nur zwischen Window und OpenWindowedScreen geswitcht werden kann?

Also man kann mittels Button z.B. das Sprite(0) nicht auf Position X,Y setzen?

Code: Alles auswählen

;
; ------------------------------------------------------------
;
;   PureBasic - Windowed Screen example file
;
;    (c) Fantaisie Software
;
; ------------------------------------------------------------
;

If InitSprite() = 0 Or InitKeyboard() = 0 Or InitMouse() = 0
  MessageRequester("Error", "Can't open the sprite system", 0)
  End
EndIf

If OpenWindow(0, 0, 0, 340, 285, "Gadget and sprites!", #PB_Window_SystemMenu | #PB_Window_ScreenCentered)
  ButtonGadget(1, 10,  10, 100, 25, "Grab input")
  ButtonGadget(2, 120,  10, 100, 25, "Button 2")
  ButtonGadget(3, 230,  10, 100, 25, "Button 3")
  TextGadget  (4, 10, 40, 300, 30, "Mouse and keyboard released")

  If OpenWindowedScreen(WindowID(0), DesktopScaledX(10), DesktopScaledX(70), DesktopScaledX(320), DesktopScaledX(200), 0, 0, 0)
    LoadSprite(0, #PB_Compiler_Home + "examples/sources/Data/PureBasicLogo.bmp")

    direction = 1
    playerX = 1
    playerY = 1
    
    ; Center the mouse driven sprite
    ;
    MouseX = (ScreenWidth() - SpriteWidth(0)) / 2
    MouseY = (ScreenHeight() - SpriteHeight(0)) / 2
    MouseLocate(MouseX, MouseY)
    
    ; Start with released input
    ReleaseMouse(#True)
    InputReleased = 1
    
    Repeat
      Repeat
        ; Always process all the events to flush the queue at every frame
        Event = WindowEvent()
        
        Select Event
          Case #PB_Event_CloseWindow
            Quit = 1
        
          Case #PB_Event_Gadget
            
            ; Do the normal application management here
            Gadget = EventGadget()
        
            Select Gadget
              Case 1
                InputReleased = 0
                ReleaseMouse(#False)
                SetGadgetText(4, "Press 'F1' to ungrab keyboard and mouse")
    
              Case 2, 3
                SetGadgetText(4, "Button "+Str(Gadget)+" pressed.")
            EndSelect
        
        EndSelect
        
      Until Event = 0 ; Quit the event loop only when no more events are available
      
      ExamineKeyboard()
      
      If InputReleased = 0
    
        If ExamineMouse()
          MouseX = MouseX()
          MouseY = MouseY()
        EndIf
    
        ; do the sprite & screen management at every frame
        If KeyboardPushed(#PB_Key_Up)    And playerY > 0   : playerY -3 : EndIf
        If KeyboardPushed(#PB_Key_Down)  And playerY < 280 : playerY +3 : EndIf
        If KeyboardPushed(#PB_Key_Left)  And playerX > 0   : playerX -3 : EndIf
        If KeyboardPushed(#PB_Key_Right) And playerX < 300 : playerX +3 : EndIf
    
        If KeyboardPushed(#PB_Key_F1)
          ReleaseMouse(#True)
          InputReleased = 1
          SetGadgetText(4, "Mouse and keyboard released");
        EndIf
      EndIf
      
      ; Clear the screen and draw our sprites
      ClearScreen(RGB(0,0,0))
      ClipSprite(0, 0, 0, x, x/8)
      DisplaySprite(0, x, 100)
      DisplaySprite(0, x, x)
      DisplaySprite(0, 300-x, x)
      DisplaySprite(0, playerX, playerY)
      
      ClipSprite(0, #PB_Default , #PB_Default , #PB_Default , #PB_Default)
      DisplaySprite(0, MouseX, MouseY)
    
      x + direction
      If x > 300 : direction = -1 : EndIf   ; moving back to the left with negative value
      If x < 0   : direction =  1 : EndIf   ; moving to the right with positive value
        
      FlipBuffers()       ; Inverse the buffers (the back become the front (visible)... and we can do the rendering on the back
    
    Until  Quit Or KeyboardPushed(#PB_Key_Escape)
  Else
    MessageRequester("Error", "Can't open windowed screen!", 0)
  EndIf
EndIf

PB 6.30 | Win 11
Benutzeravatar
mk-soft
Beiträge: 3896
Registriert: 24.11.2004 13:12
Wohnort: Germany

Re: Kasperletheater digital

Beitrag von mk-soft »

Bei PureBasic v6.30 gibt es neu die ScreenGadget. Findet man aber nicht im Inhaltsverzeichnis von der PB Hilfe
Alles ist möglich, fragt sich nur wie...
Projekte ThreadToGUI / EventDesigner V3 / OOP-BaseClass-Modul
Downloads auf MyWebspace / OneDrive
Burstnibbler
Beiträge: 59
Registriert: 04.10.2008 12:10
Computerausstattung: Win10 Pro; PB: 6.20

Re: Kasperletheater digital

Beitrag von Burstnibbler »

Mein erster Gedanke war: Warum nicht 2 Fenster nehmen?
Habe es dann mal ausprobiert... und es funktioniert tatsächlich - obwohl ich keine Ahnung habe, warum DAS überhaupt funktioniert. :shock:

Hier mal aus der Abteilung: Quick & Dirty

Code: Alles auswählen

EnableExplicit

Enumeration; Windows
  #WIN_CONTROL
  #WIN_GRAPHIC
EndEnumeration

Enumeration; Gadgets
  #G_TXT
  #G_TBG
EndEnumeration

Enumeration; Sprites
  #SPR_KASPER
EndEnumeration

#WIN_GFX_W = 800
#WIN_GFX_H = 600
#SPR_W     = 100
#SPR_H     = 200

Global.i posX

InitSprite()

OpenWindow(#WIN_CONTROL, 0, 0, 300, 200, "Kasper-Kontrolle", #PB_Window_MinimizeGadget)
  TextGadget(#G_TXT, 10, 10, 280, 20, "Kasper", #PB_Text_Center)
  TrackBarGadget(#G_TBG, 10, 30, 280, 20, 0, 100, #PB_TrackBar_Ticks)

OpenWindow(#WIN_GRAPHIC, 0, 0, #WIN_GFX_W, #WIN_GFX_H, "Kasper-Anzeige", #PB_Window_MinimizeGadget|#PB_Window_ScreenCentered)
OpenWindowedScreen(WindowID(#WIN_GRAPHIC), 0, 0, #WIN_GFX_W, #WIN_GFX_H)

CreateSprite(#SPR_KASPER, #SPR_W, #SPR_H)

StartDrawing(SpriteOutput(#SPR_KASPER))
  Ellipse(#SPR_W / 2, #SPR_H/2, #SPR_W / 2, #SPR_H/2, #Yellow)
StopDrawing()

SetActiveWindow(#WIN_CONTROL)

Repeat
  Select WindowEvent()
    Case #PB_Event_Gadget
      If (EventGadget() = #G_TBG)
        posX = GetGadgetState(#G_TBG) * 7; 7 =  (#WIN_GFX_W - #SPR_W) / 100
      EndIf
    Case #PB_Event_CloseWindow : Break
  EndSelect

  ClearScreen(#Black)
  DisplaySprite(#SPR_KASPER, posX, 200)
  FlipBuffers()
  Delay(3)
ForEver

End
D.h.: Du könntest theoretisch das Kontroll-Fenster auf den Monitor legen und das Anzeige-Fenster dem Beamer zuweisen.
Ich weiß allerdings nicht ob/wie das in der Praxis funktioniert, da ich weder einen Beamer noch einen zweiten Monitor habe. :lol:
We´re going backwards, armed with new technology.
Going backwards, to a cavemen mentality.
Benutzeravatar
Delle
Beiträge: 1162
Registriert: 10.05.2005 22:48

Re: Kasperletheater digital

Beitrag von Delle »

@mk-soft:

ScreenGadget() hab ich mir angeschaut, leider buggy und optisch absolut nicht die Wucht :-(

@Burstnibbler:

Geile Idee! ;) Naja es funktioniert, weil du die Fenster "tauscht".

Ich hab zwischenzeitlich eine Lösung gefunden:

(Idee mit Slider verworfen)
- Auswahl der Charakter mittels F1 - F4
- Bewegung mittels Cursortasten bzw. Maus
- Mimik-Änderung der aktuell fokussierten Figur mittels Tasten 1 - 4
- F12: Verbreiterung Fenster um 300 Pixel, dort sind Gadgets für weitere Einstellungen - mit F12 wieder zurück zum "puren" OpenWindowedScreen()
PB 6.30 | Win 11
Benubi
Beiträge: 188
Registriert: 22.10.2004 17:51
Wohnort: Berlin, Wedding

Re: Kasperletheater digital

Beitrag von Benubi »

Du kannst auch ein zweites "externes" Steuerprogram benutzen, und eine Client/Server Architektur nutzen.

VLC Player hat beispielsweise eine Telnet Schnittstelle mit der sich viele Steuerbefehle ausführen lassen, alles was man in Menü findet denke ich mal und Sachen die sonst nur über Scripting zugänglich wären. Mit so einer Schnittstelle brauchst Du auch nicht am Präsentationsrechner stehen, kannst möglichweise in einem anderen Raum sein, oder Du könntest auch ein Programm haben das ganz eigenständig die Präsentation leitet (z. B. eine Art Script oder Batch mit Steuerbefehlen abspielt, die das Theaterstück ausmachen).
Antworten