Seite 1 von 2

ScrollAreaGadget IM Screen

Verfasst: 07.11.2010 20:34
von Bisonte
Hallo.

Nun hab ich da mal ein kleines Problem und die Suche hat mir nicht wirklich geholfen.

Ich möchte gerne ein ScrollAreaGadget IN einem (per OpenWindowedScreen()) Screen machen.
Um z.B. einen Textblock (auf einem Sprite gezeichnet) in einem bestimmten Bereich des Screens
anzeigen zu können. (Mit Scrollbalken)

Ich steh da absolut auf dem Schlauch, hab noch nicht einmal eine Ahnung wie ich an das ganze herangehen soll...

Bitte um Hilfe.

Re: ScrollAreaGadget IM Screen

Verfasst: 07.11.2010 20:52
von #NULL
ich habe hier nen kleinen demo-code in meinem archiv, der zumindest schonmal das clipping zeigt. einen simplen scrollbar zu programmieren, der dann die koordinaten steuert ist auch nicht sehr kompliziert

Code: Alles auswählen

InitSprite()
InitMouse()
InitKeyboard()

ww=1024
wh=768
;OpenWindowedScreen(OpenWindow(0,0,0,ww,wh,"..", #PB_Window_BorderLess|#PB_Window_ScreenCentered), 0,0,ww,wh,0,0,0)
OpenScreen(1024,768,32,"fllscrn")

sprw=300
sprh=300
spr=CreateSprite(#PB_Any, sprw,sprh)
StartDrawing(SpriteOutput(spr)) :: DrawingMode(#PB_2DDrawing_Outlined|#PB_2DDrawing_Transparent)
  For i=0 To 200
    Circle(Random(sprw),Random(sprh),Random(32),Random($ffffff))
  Next
  Box(0,0,8,8,$0000ff)
StopDrawing()

rx1 = 300
ry1 = 250
rx2 = rx1+450
ry2 = ry1+150


Repeat
  ems=ElapsedMilliseconds()
  If timer < ems
    timer=ems+300
    fps$=Str(fps)
  EndIf
  ExamineMouse()
  mx=MouseX()
  my=MouseY()
  
  ; get left clipping border
  If mx<rx1
    x=rx1-mx
  Else
    x=0
  EndIf
  
  ; get top clipping border
  If my<ry1
    y=ry1-my
  Else
    y=0
  EndIf
  
  ; get right clipping border
  If mx<rx2
    If mx>rx1
      w=rx2-mx
    Else
      w=rx2-rx1
    EndIf
  Else
    w=0
  EndIf
  
  ; get left clipping border
  If my<ry2
    If my>ry1
      h=ry2-my
    Else
      h=ry2-ry1
    EndIf
  Else
    h=0
  EndIf
  
  ClipSprite(spr,x,y,w,h)
  
  
  ExamineKeyboard()
  StartDrawing( ScreenOutput() )
    DrawingMode(#PB_2DDrawing_Outlined|#PB_2DDrawing_Transparent)
    Circle(mx,my,10,$00aa00)
    Box(mx,my,sprw,sprh)
    Box(rx1,ry1,rx2-rx1,ry2-ry1)
  StopDrawing()
  DisplayTransparentSprite(spr, mx+x, my+y)
  FlipBuffers()
  ClearScreen($333333)
  ;Delay(10)
Until KeyboardPushed(#PB_Key_Escape) Or (IsWindow(0) And WindowEvent()=#PB_Event_CloseWindow)

Re: ScrollAreaGadget IM Screen

Verfasst: 07.11.2010 21:11
von Bisonte
Danke schonmal... aber genau dieser bucklige Scrollbalken macht mir die meisten Kopfschmerzen :(
Die Berechnungen der Koordinaten des Clipbereiches, Scrollbalkenposition
und die "Mausbedienung".

Aber diese kleine Demo ist sehr nett anzuschauen :allright:

Re: ScrollAreaGadget IM Screen

Verfasst: 07.11.2010 21:50
von STARGÅTE
Du brauchst doch nur mit relativen Werten Spielen:
Anzeigebereich / Gesamtbereich = Balkenhöhe / Gesamtscrollhöhe
Anzeigeposition / Gesamtbereich = Balkenposition / Gesamtscrollhöhe

Dann noch n paar Mausfunktionen wie: Erster Anschalg, und loslassen um das ziehen zu ermöglichen ...

Re: ScrollAreaGadget IM Screen

Verfasst: 07.11.2010 21:57
von PureLust
Bisonte hat geschrieben:Ich möchte gerne ein ScrollAreaGadget IN einem (per OpenWindowedScreen()) Screen machen.
Um z.B. einen Textblock (auf einem Sprite gezeichnet) in einem bestimmten Bereich des Screens
anzeigen zu können. (Mit Scrollbalken)
Hmmm .... hab' ich da was in Deiner Anfrage überlesen, oder was spricht gegen ein ScrollAreaGadget3D()?

Re: ScrollAreaGadget IM Screen

Verfasst: 07.11.2010 22:09
von Bisonte
PureLust hat geschrieben:
Bisonte hat geschrieben:Ich möchte gerne ein ScrollAreaGadget IN einem (per OpenWindowedScreen()) Screen machen.
Um z.B. einen Textblock (auf einem Sprite gezeichnet) in einem bestimmten Bereich des Screens
anzeigen zu können. (Mit Scrollbalken)
Hmmm .... hab' ich da was in Deiner Anfrage überlesen, oder warum benutzt Du nicht einfach ein ScrollAreaGadget3D()?
Das würde ja die ganze 3D Maschinerie nach sich ziehen, oder nicht ?... und von dem ganzen 3D Krams mit Enti... oder wie das alles heisst hab ich nun überhaupt keinen blassen Schimmer.

Edit: Und soviel ich weiss bin ich dann an das CEGUI gebunden,
wobei ich weniger grafische Gestaltungsmöglichkeiten habe, wenn ich das richtig gelesen habe.

Re: ScrollAreaGadget IM Screen

Verfasst: 07.11.2010 22:12
von PureLust
Bisonte hat geschrieben:Das würde ja die ganze 3D Maschinerie nach sich ziehen, oder nicht ?... und von dem ganzen 3D Krams mit Enti... oder wie das alles heisst hab ich nun überhaupt keinen blassen Schimmer.
Hab da auch noch nie was mit gemacht, aber hier mal das lauffähige Beispiel aus der PB-Hilfe.
(Müsstest dann halt einfach mal ein ScrollAreaGadget3D() einfügen.)

Code: Alles auswählen

#CameraSpeed = 10

#MainWindow = 0
#CloseButton = 0

Define.f KeyX, KeyY, MouseX, MouseY

If InitEngine3D()
  
  Add3DArchive("Data/", #PB_3DArchive_FileSystem)
  Add3DArchive("GUI/", #PB_3DArchive_FileSystem)
  Add3DArchive("Data/skybox.zip", #PB_3DArchive_Zip)
  
  
  InitSprite()
  InitKeyboard()
  InitMouse()
  
  If OpenWindow(0,0,0,800,600,"3D GUI-Test", #PB_Window_SystemMenu | #PB_Window_ScreenCentered)
    
    If OpenWindowedScreen(WindowID(0),0,0,800, 600, 0,0,0)
      
      SkyBox("desert07.jpg")
      
      CreateCamera(0, 0, 0, 100, 100)  ; Front camera
      CameraLocate(0,0,100,100)
      
      
      OpenWindow3D(#MainWindow, 100, 100, 300, 300, "Hello in 3D !")
      
      ButtonGadget3D(#CloseButton, 10, 260, 120, 25, "Close")
      
      ShowGUI(128, 1) ; Display the GUI, semi-transparent and display the mouse cursor
      
      Repeat
        Event = WindowEvent()
        
        If ExamineKeyboard()
          Input$ = KeyboardInkey()
        EndIf
        
        If ExamineMouse()
          MouseX = -(MouseDeltaX()/10)*#CameraSpeed
          MouseY = -(MouseDeltaY()/10)*#CameraSpeed
          
          InputEvent3D(MouseX(), MouseY(), MouseButton(#PB_MouseButton_Left), Input$)
        EndIf
        
        ; Handle the GUI 3D events, it's similar to regular GUI events
        ;
        Repeat
          Event = WindowEvent3D()
          
          Select Event
            Case #PB_Event3D_Gadget
              If EventGadget3D() = #CloseButton
                CloseWindow3D(#MainWindow)
              EndIf
              
          EndSelect
        Until Event = 0
        
        RenderWorld()
        
        FlipBuffers()
      Until KeyboardPushed(#PB_Key_Escape) Or Quit = 1
    EndIf
    
  Else
    MessageRequester("Error", "The 3D Engine can't be initialized",0)
  EndIf
EndIf
Gruß, PL.

[EDIt:] Hab den Code mal ein wenig von unnötigem Ballast bereinigt.

Re: ScrollAreaGadget IM Screen

Verfasst: 07.11.2010 22:20
von Bisonte
Ich sach ja... irgendwas ist bei mir nicht zu sowas fähig :(
Bei dem Code bekomme ich einen "Assertion failed!" Error...
Expression: !ms_Singleton

Was dass heisst ? Keine Ahnung. Aber diese 3D Windowgeschichten hab ich noch nie wirklich zum laufen bekommen.

Re: ScrollAreaGadget IM Screen

Verfasst: 07.11.2010 22:30
von PureLust
Bisonte hat geschrieben:Ich sach ja... irgendwas ist bei mir nicht zu sowas fähig :(
Bei dem Code bekomme ich einen "Assertion failed!" Error...
Expression: !ms_Singleton

Was dass heisst ? Keine Ahnung. Aber diese 3D Windowgeschichten hab ich noch nie wirklich zum laufen bekommen.
Hatte ich eben auch bei meinem ersten Test.

DIESER THREAD hat mir weiter geholfen.
(Im Grunde hab ich nur in den "PB-Einstellungen => Compiler => Standards" das "Aktuelle Verzeichnis" auf das PB-Verzeichnis ("D:\Programme\PureBasic_x64\Examples\Sources\") gesetzt und dann PB nochmal neu gestartet.
Danach hatte es dann auf Anhieb geklappt.)

Hinweis: Habe das vorherige Beispiel inzwischen noch ein wenig reduziert.

Re: ScrollAreaGadget IM Screen

Verfasst: 07.11.2010 23:10
von Bisonte
Jo so funktioniert das beispiel... Aber wie bereits erwähnt, ist das 3D Zeugs nicht wirklich was für mich...
Ist ja nochmehr Mathematik drin ;)
Das muss ja vor dem Windows3D Zeug auch funktioniert haben. Ich probier es mit Stargates "Formeln" grade,
obwohl ich noch nich so ganz rausgefunden hab wie er das meint...