Speichern + Spielen gleichzeitig? [GELÖST]

Übersicht BlitzBasic Beginners-Corner

Neue Antwort erstellen

 

CO2

ehemals "SirMO"

Betreff: Speichern + Spielen gleichzeitig? [GELÖST]

BeitragDo, Dez 30, 2010 21:03
Antworten mit Zitat
Benutzer-Profile anzeigen
Hallo,
Ich habe da mal ne Frage: Wenn ich mit Savebuffer() meinen aktuellen Frontbuffer als Datei speichere, braucht der immer ein paar sekunden um das zu tun. In der Zeit bleibt dann das ganze Programm stehen. Meine Frage: Kann man das irgendwie einfädeln, das er den Frontbuffer während des Spielens speichert, also ohne das das Prog stehen bleibt? Oder fällt das wieder unter Multithreading, was - meines wissens nach - BB nicht beherrscht?

mfG,
CO2
mfG, CO²

Sprachen: BlitzMax, C, C++, C#, Java
Hardware: Windows 7 Ultimate 64-Bit, AMX FX-6350 (6x3,9 GHz), 32 GB RAM, Nvidia GeForce GTX 750 Ti
  • Zuletzt bearbeitet von CO2 am Do, Dez 30, 2010 22:22, insgesamt einmal bearbeitet

Xeres

Moderator

BeitragDo, Dez 30, 2010 21:06
Antworten mit Zitat
Benutzer-Profile anzeigen
Nein, geht so direkt nicht.
Win10 Prof.(x64)/Ubuntu 16.04|CPU 4x3Ghz (Intel i5-4590S)|RAM 8 GB|GeForce GTX 960
Wie man Fragen richtig stellt || "Es geht nicht" || Video-Tutorial: Sinus & Cosinus
T
HERE IS NO FAIR. THERE IS NO JUSTICE. THERE IS JUST ME. (Death, Discworld)

ComNik

BeitragDo, Dez 30, 2010 21:18
Antworten mit Zitat
Benutzer-Profile anzeigen
Das fällt unter Multithreading.
Wenn du einfach schreibst SaveBuffer() wird die Funktion erst abgearbeitet bevor es weiter geht.
Sie muss aber gleichzeitig ausgeführt werden.

Übrigens wäre es nur mit Multithreading nicht getan. Das hakelige ist es sicherzustellen, dass die Threads nicht auf die gleichen Daten gleichzeitig zugreifen wollen...

lg
ComNik
WIP: Vorx.Engine
 

CO2

ehemals "SirMO"

BeitragDo, Dez 30, 2010 21:36
Antworten mit Zitat
Benutzer-Profile anzeigen
Also wäre es nicht möglich, oder was?
mfG, CO²

Sprachen: BlitzMax, C, C++, C#, Java
Hardware: Windows 7 Ultimate 64-Bit, AMX FX-6350 (6x3,9 GHz), 32 GB RAM, Nvidia GeForce GTX 750 Ti

Hubsi

BeitragDo, Dez 30, 2010 21:49
Antworten mit Zitat
Benutzer-Profile anzeigen
Nicht ohne ruckeln. Ist dabei eher die Frage des Zwecks. Willst Du nur ein Video basteln zur Projektvorstellung oder als Trailer mußt ja auch nur Du einmal das Geruckel aushalten, das wäre ja zumutbar. Wenn der Spieler das aushalten muß wirds schwierig Very Happy
Den ganzen Doag im Bett umanandflagga und iaz daherkema und meine Hendl`n fressn...
 

CO2

ehemals "SirMO"

BeitragDo, Dez 30, 2010 22:22
Antworten mit Zitat
Benutzer-Profile anzeigen
Das ganze währe für ein screenshotsystem. Der spieler drückt meinetwegen die Taste [F12], datraufhin wird der aktuelle Frontbuffer als Datei gespeichert.

naja, dann muss der Spieler halt damit leben Very Happy

mfG,
CO2
mfG, CO²

Sprachen: BlitzMax, C, C++, C#, Java
Hardware: Windows 7 Ultimate 64-Bit, AMX FX-6350 (6x3,9 GHz), 32 GB RAM, Nvidia GeForce GTX 750 Ti

Eingeproggt

BeitragDo, Dez 30, 2010 22:29
Antworten mit Zitat
Benutzer-Profile anzeigen
Mal so rein theoretisch, ohne mich wirklich damit auseinander gesetzt zu haben, wie wärs mit folgendem Ansatz?

BlitzBasic: [AUSKLAPPEN]
;Initialisierung
screenshot_index=-1
screenshot_start=False
gfx_w=GraphicsWidth()
gfx_h=GraphicsHeight()

;in Hauptschleife
If screenshot_start Then ;Wenn Spieler Screenshot machen will
img=CreateImage(gfx_w,gfx_h)
CopyRect 0,0,gfx_w,gfx_h,0,0,FrontBuffer(),ImageBuffer(img)
screenshot_file=WriteFile("screenshot.bmp")
screenshot_index=0
screenhot_start=False
EndIf

If screenshot_index<>-1 Then
;Hier kommt die Kunst: Nämlich die Farbwerte auf unserem img als bmp speichern
;Weiß nicht genau wie, aber sollte eigentlich möglich sein, da bmp ja für jeden pixel einfach die Farbe speichert, ähnlich wie es BB auch macht in seinen Buffern

screenshot_index=screenshot_index+1
If screenshot_index>=gfx_h Then
screenshot_index=-1
FreeImage img
CloseFile screenshot_file
EndIf
EndIf


Also kurz erklärt: Man "merkt" sich das Bild in einem ImageBuffer, welchen man dann zeilenweise (oder spaltenweise, kA) in eine bmp schreibt - dazu muss man in der Lage sein das bmp-Format selber zu verwenden.... Mag umständlich sein aber wenn man es wirklich will, sollte das ohne weiters möglich sein... Ist ja nur ne simple, unkomprimierte Rastergraphik...

mfG, Christoph.
Gewinner des BCC 18, 33 und 65 sowie MiniBCC 9
 

Sterbendes Lüftlein

BeitragFr, Dez 31, 2010 0:43
Antworten mit Zitat
Benutzer-Profile anzeigen
Text entfernt
 

CO2

ehemals "SirMO"

BeitragFr, Dez 31, 2010 0:47
Antworten mit Zitat
Benutzer-Profile anzeigen
@ Eingeproggt: Dafür gibt es ja schon eine funktion: Savebuffer(Buffer, Datei). Ich wollte eig nur, das das Programm weiterläuft währenddessen der Frontbuffer als .bmp gespeichert wird

Aber da ist ja wieder das Problem mit dem multithreading...
mfG, CO²

Sprachen: BlitzMax, C, C++, C#, Java
Hardware: Windows 7 Ultimate 64-Bit, AMX FX-6350 (6x3,9 GHz), 32 GB RAM, Nvidia GeForce GTX 750 Ti

Eingeproggt

BeitragFr, Dez 31, 2010 1:10
Antworten mit Zitat
Benutzer-Profile anzeigen
Dann hast du nicht verstanden, was ich dir näher bringen wollte:
Ein Ansatz, mit dem man die Datei "stückchenweise" abspeichert - jeden Frame ein paar Pixelreihen. Das würde locker "nebenbei" gehen ohne dass der user was merkt.

mfG, Christoph.
Gewinner des BCC 18, 33 und 65 sowie MiniBCC 9
 

CO2

ehemals "SirMO"

BeitragFr, Dez 31, 2010 1:17
Antworten mit Zitat
Benutzer-Profile anzeigen
ok, dann habe ich dich eben falsch verstanden Embarassed

Aber dann kommt ja das Problem mit der Dateien. Welche daten müssen in eine bmp datei, wie ist der Header aufgebaut, etc.

mfG,
CO2
mfG, CO²

Sprachen: BlitzMax, C, C++, C#, Java
Hardware: Windows 7 Ultimate 64-Bit, AMX FX-6350 (6x3,9 GHz), 32 GB RAM, Nvidia GeForce GTX 750 Ti
 

n-Halbleiter

BeitragFr, Dez 31, 2010 1:23
Antworten mit Zitat
Benutzer-Profile anzeigen
3 Minuten mit Google (Suchbegriff "bmp file format") suchen spuckt das aus: http://www.fileformat.info/format/bmp/corion.htm Wink
mfg, Calvin
Maschine: Intel Core2 Duo E6750, 4GB DDR2-Ram, ATI Radeon HD4850, Win 7 x64 und Ubuntu 12.04 64-Bit
Ploing!
Blog

"Die Seele einer jeden Ordnung ist ein großer Papierkorb." - Kurt Tucholsky (09.01.1890 - 21.12.1935)
 

CO2

ehemals "SirMO"

BeitragFr, Dez 31, 2010 1:46
Antworten mit Zitat
Benutzer-Profile anzeigen
Shocked Davon verstehe ich gar nix...

naja ist auch egal... dann muss es halt so gehen.
mfG, CO²

Sprachen: BlitzMax, C, C++, C#, Java
Hardware: Windows 7 Ultimate 64-Bit, AMX FX-6350 (6x3,9 GHz), 32 GB RAM, Nvidia GeForce GTX 750 Ti

count-doku

BeitragFr, Dez 31, 2010 9:54
Antworten mit Zitat
Benutzer-Profile anzeigen
Hi,

es gab mal hier im Forum eine Funktion, die aus einer Bitmap die Daten in eine Bank liest,
und auch wieder schreiben kann.

Habe sie gefunden: ( bewe3D-scanner )
BlitzBasic: [AUSKLAPPEN]

Global breite=640,hoehe=480
;Datensatz = CreateBank(breite*hoehe*3)

Function BmpLaden(Dateiname$,Datensatz)
; Prüfen ob die Datei existiert
If Dateiname = "" Then Return 0
stream = ReadFile(Dateiname)
If Not Stream Then RuntimeError "Bilddatei nicht gefunden!"

; Header und Dataheader überspringen
SeekFile (stream,54)

; Bilddaten einlesen
For i= 0 To (breite*hoehe*3)-1
PokeByte Datensatz,i, ReadByte (Stream)
Next
End Function

Function BmpZeichnen (Datensatz,VerschiebungX=0,VerschiebungY=0)
i=0
LockBuffer BackBuffer()
For y =hoehe-1 To 0 Step -1
For x = 0 To breite-1
b = PeekByte (Datensatz,i)
i=i+1
g = PeekByte (Datensatz,i)
i=i+1
r = PeekByte (Datensatz,i)
i=i+1

rgb=a*$1000000 + r*$10000 + g*$100 + b
WritePixelFast x+VerschiebungX,y+VerschiebungY,rgb, BackBuffer()
Next
Next
UnlockBuffer BackBuffer()
End Function

Function BmpSpeichern (Datensatz,Pfad$="Test.bmp")
Stream = WriteFile (Pfad)

WriteByte Stream,66 ;Asci-code für B
WriteByte Stream,77 ;Asci-code für M, BM = Dateikennung

; Header und Dataheader schreiben
WriteInt Stream,230454 ;Dateigrösse
WriteInt Stream,0;Reserved
WriteInt Stream,54;BMPstart
WriteInt Stream,40 ;InfoHeadergrösse
WriteInt Stream,640;Bitmapbreite->------------------------------auch über eingabe!!
WriteInt Stream,480 ;Bitmaphoehe
WriteShort Stream,1;FlaechenAnzahl
WriteShort Stream,24;BitsProPixel
WriteInt Stream,0 ;Kompression
WriteInt Stream,230400 ;BMPDatenanzahl
WriteInt Stream,3780;XPixelProMeter
WriteInt Stream,3780;YPixelProMeter
WriteInt Stream,0 ;AnzahlgebrauchterFarben
WriteInt Stream,0;AnzahlWichtigerFarben

;Bilddaten schreiben
For i = 0 To (breite*hoehe*3)-1
WriteByte Stream,PeekByte(Datensatz,i)
Next

CloseFile Stream
End Function


Vllt. kannst damit was anfangen.
Einfach die Bank zeilenweise schreiben.

lg,
count-doku

EDIT: Code gerade nochmal überarbeitet und angepasst Smile
  • Zuletzt bearbeitet von count-doku am Fr, Dez 31, 2010 18:24, insgesamt einmal bearbeitet

Hummelpups

BeitragFr, Dez 31, 2010 11:10
Antworten mit Zitat
Benutzer-Profile anzeigen
und wenn man eine Zeile pro Frame ausliest, sieht der screenshot danach
bestimmt lustig aus ^^ jeh nach spiel

Hubsi

BeitragFr, Dez 31, 2010 11:25
Antworten mit Zitat
Benutzer-Profile anzeigen
Das man den Frontbuffer vorher in ein Image kopiert sollte klar sein Mr. Green
Den ganzen Doag im Bett umanandflagga und iaz daherkema und meine Hendl`n fressn...

Neue Antwort erstellen


Übersicht BlitzBasic Beginners-Corner

Gehe zu:

Powered by phpBB © 2001 - 2006, phpBB Group