WindowedScreen im ScrollAreaGadget

Anfängerfragen zum Programmieren mit PureBasic.
Benutzeravatar
Fusselohr
Beiträge: 236
Registriert: 02.04.2007 10:43
Kontaktdaten:

WindowedScreen im ScrollAreaGadget

Beitrag 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
Benutzeravatar
Green Snake
Beiträge: 1394
Registriert: 22.02.2005 19:08

Beitrag 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
-.-"
Benutzeravatar
Fusselohr
Beiträge: 236
Registriert: 02.04.2007 10:43
Kontaktdaten:

Beitrag 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 ?
Benutzeravatar
bobobo
jaAdmin
Beiträge: 3873
Registriert: 13.09.2004 17:48
Kontaktdaten:

Beitrag von bobobo »

muss es ein windowedscreen sein? oder reicht nicht vielleicht auch ein selbstbemaltest imagegadget. damit sollten kaum probleme auftreten.
Zuletzt geändert von bobobo am 16.06.2007 14:48, insgesamt 1-mal geändert.
‮pb aktuel 6.2 windoof aktuell und sowas von 10
Ich hab Tinnitus im Auge. Ich seh nur Pfeifen.
Benutzeravatar
Fusselohr
Beiträge: 236
Registriert: 02.04.2007 10:43
Kontaktdaten:

Beitrag von Fusselohr »

Ich möchte halt ein Map-Editor machen und da fänd ich das mit dem Screen einfacher.
Benutzeravatar
bobobo
jaAdmin
Beiträge: 3873
Registriert: 13.09.2004 17:48
Kontaktdaten:

Beitrag 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)
‮pb aktuel 6.2 windoof aktuell und sowas von 10
Ich hab Tinnitus im Auge. Ich seh nur Pfeifen.
Benutzeravatar
Zaphod
Beiträge: 2875
Registriert: 29.08.2004 00:40

Beitrag 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.
Benutzeravatar
Xaby
Beiträge: 2144
Registriert: 12.11.2005 11:29
Wohnort: Berlin + Zehdenick
Kontaktdaten:

Beitrag 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  
Kinder an die Macht http://scratch.mit.edu/
Benutzeravatar
Xaby
Beiträge: 2144
Registriert: 12.11.2005 11:29
Wohnort: Berlin + Zehdenick
Kontaktdaten:

Beitrag 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

Zuletzt geändert von Xaby am 17.06.2007 00:24, insgesamt 1-mal geändert.
Kinder an die Macht http://scratch.mit.edu/
Benutzeravatar
ts-soft
Beiträge: 22292
Registriert: 08.09.2004 00:57
Computerausstattung: Mainboard: MSI 970A-G43
CPU: AMD FX-6300 Six-Core Processor
GraKa: GeForce GTX 750 Ti, 2 GB
Memory: 16 GB DDR3-1600 - Dual Channel
Wohnort: Berlin

Beitrag 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:
PureBasic 5.73 LTS | SpiderBasic 2.30 | Windows 10 Pro (x64) | Linux Mint 20.1 (x64)
Nutella hat nur sehr wenig Vitamine. Deswegen muss man davon relativ viel essen.
Bild
Antworten