Seite 1 von 2

WindowedScreen im ScrollAreaGadget

Verfasst: 16.06.2007 11:37
von Fusselohr
Hallo an alle ^^,
ich hab mal ne Frage:
Ich versuche zur Zeit einen WindowedScreen in ein ScrollAreaGadget zu packen, aber immer wenn ich mit der Scrollbar etwas rübergehe kommt immer das alte Bild nach. Kann mir jm. Helfen ?

Mit freundlichen Grüßen,
Fusselohr

Verfasst: 16.06.2007 11:43
von Green Snake
Ich würde das nicht so lösen.
Besser wäre es, wenn du einfach den Inhalt des Screens (Sprites, ...) relativ zu den beiden ScrollBars verschieben würdest. :D

Verfasst: 16.06.2007 11:49
von Fusselohr
Achso also dann einfach mit ein paar pfeilen die die Position des Screeninhaltes ändern oder ?

Aber mit dem Scrollareagadget gehts jetzt nicht oder ?

Verfasst: 16.06.2007 14:36
von bobobo
muss es ein windowedscreen sein? oder reicht nicht vielleicht auch ein selbstbemaltest imagegadget. damit sollten kaum probleme auftreten.

Verfasst: 16.06.2007 14:45
von Fusselohr
Ich möchte halt ein Map-Editor machen und da fänd ich das mit dem Screen einfacher.

Verfasst: 16.06.2007 14:51
von bobobo
aha .. einfacher :) deshalb ja auch die probleme mit dem scrolldings :D

..ein selbstbemaltes imagegadget kannst du allerdings locker mit so nem scrollgadget verschieben. 8)

Verfasst: 16.06.2007 20:51
von Zaphod
Das wäre aber sowieso Wahnsinn einfach mal das gesamte Level vorzuzeichnen und dann nur zu verschieben. Wenn du eh eine Tilemap hast, zeichne doch nur einen ausschnitt abhängig von der Position des Betrachters auf der Map. Das ist vollkommen trivial umzusetzen.

Sonst hast du ja schon bei winzigen Maps gigantischen Speicherverbrauch.

Verfasst: 16.06.2007 22:41
von Xaby
Schau mal hier:

http://www.purebasic.fr/german/viewtopi ... ht=folkisa

Ohne Scrolling.

Code: Alles auswählen

; Autor Folker Linstedt
; 2007|06|16

#MainWin=0

If OpenWindow(#MainWin, 0, 0, 200, 200, ":: FL :: Mapper", #PB_Window_SystemMenu|#PB_Window_ScreenCentered | #PB_Window_SizeGadget | #PB_Window_MaximizeGadget) And CreateGadgetList(WindowID(#MainWin)) 
  
  CreateImage(0,500,500)
  StartDrawing(ImageOutput(0))
  For i=0 To 23
    Box(30+15*i,20*i,15,80,RGB(i*8,255-4*i,Random(255)))
  Next
  StopDrawing()
  
  ScrollAreaGadget(0,0,0,200,200,500,500,20)
  
  ImageGadget(1,0,0,500,500,ImageID(0))
  
  
  Repeat
    Event=WaitWindowEvent()
    
    XX=WindowMouseX(#MainWin)-GadgetX(0)-GadgetX(1)+GetGadgetAttribute(0,#PB_ScrollArea_X )
    YY=WindowMouseY(#MainWin)-GadgetY(0)-GadgetY(1)+GetGadgetAttribute(0,#PB_ScrollArea_Y )
    
    If Event =#PB_Event_SizeWindow
      ResizeGadget(0,#PB_Ignore,#PB_Ignore,WindowWidth(#MainWin),WindowHeight(#MainWin))
    EndIf
    
    SetWindowTitle(#MainWin,Str(XX)+" : "+Str(YY))
    
    
  Until Event=16
  
EndIf  

Verfasst: 16.06.2007 23:36
von Xaby
Und hier noch mal eine PB-Hilfe für den OpenWindowScreen etwas abgewandelt, um zu zeigen, wie eine Welt aussehen könnte.

Code: Alles auswählen

; Autor Folker Linstedt
; 2007|06|16

;/ PB-Hilfe

If InitSprite() = 0
  MessageRequester("Error", "Can't open screen & sprite enviroment!", 0)
  End
EndIf
  
;/ PB-Hilfe

If OpenWindow(0, 0, 0, 400, 400, "A screen in a window...", #PB_Window_SystemMenu | #PB_Window_ScreenCentered)
  If CreateGadgetList(WindowID(0))
    ButtonGadget(0, 350, 370, 45, 20, "Quit")
    
    ScrollBarGadget(1, 10, 370, 200, 20, 0, 100, 10) 
    ScrollBarGadget(2, 370, 10, 20, 200, 0, 100, 10,#PB_ScrollBar_Vertical) 
   
    ButtonGadget(0, 350, 370, 45, 20, "Quit")
    ButtonGadget(0, 350, 370, 45, 20, "Quit")
    
  EndIf
  If OpenWindowedScreen(WindowID(0), 0, 0, 320, 320, 0, 0, 0)
    
    ;/ Mein Teil
    
    Dim Sprites(15,15)
    
    For iy=0 To 15 ; die Sprites zu erstellen dauert etwas
      For ix=0 To 15
        Sprites(ix,iy)=16*iy+ix ; es können Sprites neu erstellt werden. Es müssen also nicht 400 verschiedene Sprites sein.
        CreateSprite(Sprites(ix,iy),32,32)
        StartDrawing(SpriteOutput(Sprites(ix,iy)))
        Box(0,0,32,32,RGB(Random(255),Random(255),Random(255)))
        StopDrawing()
      Next 
    Next
    
    Dim Welt(100,100)
    
    For iy=0 To 100 ; die Sprites zu erstellen dauert etwas
      For ix=0 To 100
        Welt(ix,iy)=Random(255)
      Next 
    Next
    
    
    ;/
    
  Else
    MessageRequester("Error", "Can't open windowed screen!", 0)
    End
  EndIf
EndIf
  
Repeat
  
  Repeat
    ;Event = WindowEvent()
   Event = WaitWindowEvent(50) ; 200 ist doch etwas zu langsam

    
    Select Event 
      Case #PB_Event_Gadget
        GadgetNr=EventGadget()
        If GadgetNr = 0
          End
        EndIf
        
        ;/ Meins
        
        If GadgetNr=1
          xxx=GetGadgetState(1)
          Debug xxx
        EndIf
        
        If GadgetNr=2
          yyy=GetGadgetState(2)
          Debug yyy
        EndIf
        
        ;/
         
      Case #PB_Event_CloseWindow
        End 
    EndSelect
    
    ;/ Meins
    
    If WindowMouseX(0)>-1 And WindowMouseX(0)<320 And WindowMouseY(0)>-1 And WindowMouseY(0)<320
      SetWindowTitle(0,"X : "+Str(WindowMouseX(0)/32+GetGadgetState(1))+", Y: "+Str(WindowMouseY(0)/32+GetGadgetState(2)))
    EndIf
    
    ;/
    
  Until Event = 0
  
  ;/ Meins
  
  ;ClearScreen(RGB(0, 0, 0))
   
  For iy=0 To 9
    For ix=0 To 9
      DisplaySprite(Welt(ix+xxx,iy+yyy),32*ix,32*iy)
    Next
  Next  
  
  ;/
  
;  Delay(1) ; Auf Anraten von ts-soft
  
  FlipBuffers() 
  
ForEver


Verfasst: 16.06.2007 23:47
von ts-soft
Wenn man jetzt Delay entfernt und WaitWindowEvent(200) benutzt, sinkt
die CPU Last von 80 - 100, auf 5 - 10 %, und ist dann IMHO tatsächlich
benutzbar. Es sei denn man mag kein Multitasking :mrgreen: