Screen mit scrollen manipulieren, wie geht das oder mit Spri

Fragen zu Grafik- & Soundproblemen und zur Spieleprogrammierung haben hier ihren Platz.
funkheld
Beiträge: 649
Registriert: 31.12.2009 11:58

Screen mit scrollen manipulieren, wie geht das oder mit Spri

Beitrag von funkheld »

Hallo , guten Tag.
Ich habe einen Z1013-Screen mit 32x32 Zeichen, die aufgrund der Windowauflösung je Zeichen 16x16 Pixel sind.
Die Zeichen werden Pixelweise aus einer Font-Datei.bin hergestellt. Nun möchte ich , wenn der Grafiktext unten angekommen ist den Inhalt des Screen 16 Grafikzeilen nach oben Scrollen, das die oberste Zeile verschwindet und unten eine Leerzeile gesetzt wird.

Wie kann man das Scrollen machen mit dem Screen ?
Oder kann wie kann man das irgenwie mit Sprite verwirklichen ?

Bild


Danke.

Gruss
peter
Benutzeravatar
NicTheQuick
Ein Admin
Beiträge: 8809
Registriert: 29.08.2004 20:20
Computerausstattung: Ryzen 7 5800X, 64 GB DDR4-3200
Ubuntu 24.04.2 LTS
GeForce RTX 3080 Ti
Wohnort: Saarbrücken

Re: Screen mit scrollen manipulieren, wie geht das oder mit

Beitrag von NicTheQuick »

Du hast die selbe Frage doch schon an anderer Stelle gestellt. Wieso jetzt hier wieder?
Benutzeravatar
Bisonte
Beiträge: 2468
Registriert: 01.04.2007 20:18

Re: Screen mit scrollen manipulieren, wie geht das oder mit

Beitrag von Bisonte »

Alzheimer ? Authist ? oder einfach nur Voltax vergessen ?
PureBasic 6.21 (Windows x86/x64) | Windows11 Pro x64 | AsRock B850 Steel Legend Wifi | R7 9800x3D | 64GB RAM | GeForce RTX 5080 | ThermaltakeView 270 TG ARGB | build by vannicom​​
funkheld
Beiträge: 649
Registriert: 31.12.2009 11:58

Re: Screen mit scrollen manipulieren, wie geht das oder mit

Beitrag von funkheld »

Jup, hier war jetzt die Frage , wie man einen Screen scrollt.

Code: Alles auswählen

CopyMemory(*QuellMemoryID, *ZielMemoryID, Länge)
Wie bekomme ich die Adresse von "buffer" in die CopyMemory-Routine.

Die buffer-adresse ist hier von:

Code: Alles auswählen

StartDrawing(ScreenOutput())
Buffer  = DrawingBuffer()             
StopDrawing()
Bei CopyMemory werden doch nur die über "AllocateMemory(Größe [, Flags])" erkannt, ist das richtig ?

Danke.

Gruss
peter

__________________________________________________
Code-Tags hinzugefügt
11.05.2013
RSBasic
Benutzeravatar
NicTheQuick
Ein Admin
Beiträge: 8809
Registriert: 29.08.2004 20:20
Computerausstattung: Ryzen 7 5800X, 64 GB DDR4-3200
Ubuntu 24.04.2 LTS
GeForce RTX 3080 Ti
Wohnort: Saarbrücken

Re: Screen mit scrollen manipulieren, wie geht das oder mit

Beitrag von NicTheQuick »

Falsch. Mit CopyMemory kannst du jeden Speicher kopieren, der zu deinem Prozess gehört. Also auch den DrawingBuffer.
funkheld
Beiträge: 649
Registriert: 31.12.2009 11:58

Re: Screen mit scrollen manipulieren, wie geht das oder mit

Beitrag von funkheld »

Hmm, stürzt ab...
Falsch. Mit CopyMemory kannst du jeden Speicher kopieren, der zu deinem Prozess gehört. Also auch den DrawingBuffer.
..........????

Mit "Button test1" wird in den Buffer geschrieben.

Bei "Button test2" sollen die Pixel an Ende der ersten Pixel dran gehängt werden mit CopyMemory und da steigt das Programm aus, auch wenn ich nur 4 Byte kopiere, mit der Einbettung ins Startdrawing stürzt es auch ab.
Danke.

Gruss
peter

Code: Alles auswählen

 Global buffer.l,buffer1.l,buffer2.l,x.l

Declare eins()
Declare zwei()

    Enumeration
      #Window_0  
      #button_1
      #button_2
    EndEnumeration

    InitSprite()
    InitKeyboard() 

    OpenWindow(#Window_0,0,0,600,600,"test",#PB_Window_SystemMenu|#PB_Window_SizeGadget|#PB_Window_ScreenCentered)
    OpenWindowedScreen(WindowID(#Window_0), 10, 10, 512,512)
    
    ButtonGadget(#button_1, 10,550, 80, 25, "test1")
    ButtonGadget(#button_2, 100,550, 80, 25, "test2")
   
    StartDrawing(ScreenOutput())
      Buffer      = DrawingBuffer()             
      ;Pitch       = DrawingBufferPitch()        
      ;PixelFormat = DrawingBufferPixelFormat()  
      buffer1=buffer
    StopDrawing()
       
    ClearScreen(RGB(0,0,0))

    Repeat 
      Event =  WindowEvent() 
      
      Select Event
        Case #PB_Event_Gadget
          EventGadget = EventGadget()
          EventType = EventType()
          
          If EventGadget = #Button_1
             eins()
          EndIf
          If EventGadget = #Button_2
             zwei()
          EndIf  
                
        Case #PB_Event_CloseWindow
          EventWindow = EventWindow()
          If EventWindow = #Window_0
            CloseWindow(#Window_0)
            Break
          EndIf
      EndSelect
      
      FlipBuffers()

   ForEver

Procedure eins()
  buffer=buffer1
  For x = 1 To 16384  
    PokeL(buffer,$ffffff)  
    buffer=buffer+4
  Next
EndProcedure   

Procedure zwei()
  buffer=buffer1
  CopyMemory(*buffer1,*buffer+16384,16384)
EndProcedure    
Zuletzt geändert von funkheld am 11.05.2013 23:38, insgesamt 1-mal geändert.
funkheld
Beiträge: 649
Registriert: 31.12.2009 11:58

Re: Screen mit scrollen manipulieren, wie geht das oder mit

Beitrag von funkheld »

Hallo, guten Abend.

Kann hier wer helfen mit diesem CopyMemory-Absturzt ?

Danke.

Gruss
peter
funkheld
Beiträge: 649
Registriert: 31.12.2009 11:58

Re: Screen mit scrollen manipulieren, wie geht das oder mit

Beitrag von funkheld »

Hallo, guten Tag.

Gibt es bitte gegen den Absturz eine Lösung bei Copymemory/Allocate .

Danke.

Gruss
peter
Benutzeravatar
NicTheQuick
Ein Admin
Beiträge: 8809
Registriert: 29.08.2004 20:20
Computerausstattung: Ryzen 7 5800X, 64 GB DDR4-3200
Ubuntu 24.04.2 LTS
GeForce RTX 3080 Ti
Wohnort: Saarbrücken

Re: Screen mit scrollen manipulieren, wie geht das oder mit

Beitrag von NicTheQuick »

Na ist doch klar. Wenn der Buffer nun mal nur 16384 Bytes groß ist, wieso glaubst du dann, dass du die selbe Menge Bytes nochmal dahinter kopieren kannst?

Im Übrigen nutzt man nicht den Typ Long (.l) als Pointer, sondern, wenn man schon keine richtigen Pointer nutzen will, nimmt man Integer (.i), sonst läuft es bei Leuten mit 64-Bit-Betriebssystem nicht. Dann wäre es schön, wenn du 'EnableExplicit' an den Anfang deines Codes stellst, sonst wollen dir die meisten hier eh schon nicht helfen, weil es womöglich eh nur ein Tippfehler war.

Und wenn du ja schon im Screen arbeitest, wieso nutzt du dann nicht gleich Sprites, in die du deinen Text rein malst. Die kannst du dann in weniger als einer Millisekunde an beliebiger Stelle deines Screens darstellen. Oder du malst es um ein paar Pixel nach oben verschoben in ein zweites Sprite und stellst das dann an Koordinate (0, 0) dar. Naja... Aber du willst ja lieber mit deinem DrawingBuffer experimentieren, oder?
funkheld
Beiträge: 649
Registriert: 31.12.2009 11:58

Re: Screen mit scrollen manipulieren, wie geht das oder mit

Beitrag von funkheld »

Hallo, gute Abend.

ScreenOutput() hat 512x512 Pixel und jedes Pixel hat 4 Byte.
Warum soll bei ca 32000 schon die Luft raus sein ? Das verstehe ich nicht ?
Und wenn ich nur 1 Byte copiere, bricht das Programm auch schon zusammen.

Gruss
peter
Antworten