Screenshot

Previous topic - Next topic

Vampire

Ich möchte in meinem Programm Screenshots machen können.
Die sollen aber nicht überschrieben werden, sondern durchnummeriert gespeichert werden.
also:
Test1.bmp
Test2.bmp
Test3.bmp
usw...

Ich habe diesen Code geschrieben

Code (glbasic) Select

IF KEY(59) = 1       THEN GOSUB shot
       SHOWSCREEN
WEND



// ------------------------------------------------------------- //
// ---  SHOT  ---
// ------------------------------------------------------------- //
SUB shot:
zaehl = zaehl + 1
SAVEBMP "test" + zaehl + ".bmp"
PLAYSOUND (2, 0, 1.0)
RETURN
ENDSUB // SHOT


Das klappt soweit auch ganz gut, nur, mit jedem Druck auf F1 = Key[59]
erhalte ich DREI Screenshots, sauber durchnummeriert von 1 bis 3  =D

Was mach ich falsch?

Schranz0r

Musst dir nen Timer setzen


Code (glbasic) Select
IF timer < GETTIMERALL()
    //Mache Screenshot hier
    timer = GETTIMERALL()+500 // 500ms bis zum nächsten Screenshot
ENDIF
I <3 DGArray's :D

PC:
AMD Ryzen 7 3800X 16@4.5GHz, 16GB Corsair Vengeance LPX DDR4-3200 RAM, ASUS Dual GeForce RTX™ 3060 OC Edition 12GB GDDR6, Windows 11 Pro 64Bit, MSi Tomahawk B350 Mainboard

Vampire

Jetzt  bekomm ich zwar pro Druck nur einen Screenshot , die heissen aber Test1.bmp
Test4.bmp und Test6.bmp...bei 3 mal F1 drücken

is aber schonmal besser als vorher , thx :)

Quentin

oder du leerst die Tastaturpuffer von evtl. weiteren vorhandenen F1-Tastendrücken mit

Code (glbasic) Select
WHILE KEY(59); WEND

Dann bekommst du auf jeden Fall bei Druck auf F1 immer nur ein Bild. Unschöner Nebeneffekt. Solange du F1 gedrückt hälst, hält das Programm an.

Code (glbasic) Select

WHILE TRUE
GOSUB show_something
IF KEY(59)
GOSUB shot
ENDIF
SHOWSCREEN
WEND



SUB shot:
STATIC zahl%
WHILE KEY(59); WEND
INC zahl
SAVEBMP "test" + zahl + ".bmp"
PLAYSOUND(2, 0, 1.0)
ENDSUB


SUB show_something:
LOCAL x%, y%, width%, height%, color%

x = RND(640)
y = RND(480)
width = x + 100
height = y + 50
color = RGB(RND(255), RND(255), RND(255))
DRAWRECT x, y, width, height, color
ENDSUB

Schranz0r

Quote from: Vampire on 2011-May-23
Jetzt  bekomm ich zwar pro Druck nur einen Screenshot , die heissen aber Test1.bmp
Test4.bmp und Test6.bmp...bei 3 mal F1 drücken

is aber schonmal besser als vorher , thx :)

Code pls ;)

Musst deinen Zähler auch richtig platzieren
I <3 DGArray's :D

PC:
AMD Ryzen 7 3800X 16@4.5GHz, 16GB Corsair Vengeance LPX DDR4-3200 RAM, ASUS Dual GeForce RTX™ 3060 OC Edition 12GB GDDR6, Windows 11 Pro 64Bit, MSi Tomahawk B350 Mainboard

monono

Oder du überprüfst eine weiter Variable die nur wieder true wird wenn die taste losgelassen wurde
Code (glbasic) Select


WHILE....
.....
IF KEY(59) = FALSE THEN losgelassen = TRUE
IF KEY(59)=TRUE AND losgelassen = TRUE THEN GOSUB shot
SHOWSCREEN
WEND

SUB shot:
losgelassen = FALSE
....

D2O

Wieso benutzt Du nicht die KeyHit Funktion von Gernot?

Hier mal mein beispiel dazu.
Das ganze ist mal auf 20 Screenshots begrenzt, kannst es ja dann selber noch anpassen.
Es wird überprüft ob das bild schon vorhanden ist und dem entsprechend der counter erhöht.
Alternativ könnte man den counter weglassen und und PLATFORMINFO$("TIME") benutzen.
So hätte jedes bild immer einen eigenen Namen.


Code (glbasic) Select
// --------------------------------- //
// Project: My_Screenshot
// Start: Tuesday, May 24, 2011
// IDE Version: 9.040


SETCURRENTDIR("Media") // seperate media and binaries?






WHILE TRUE

F_KeyHitUpdate()

DRAWRECT 100,100,32,32,RGB(RND(200),RND(200),RND(200))

IF F_KeyHit(57) = 2 // 57 = spacetaste
F_SCREENSHOT()
ENDIF



SHOWSCREEN

WEND



FUNCTION F_SCREENSHOT:l_name$ = "screenshot/screenshot"

LOCAL l_do% = FALSE
STATIC l_count
LOCAL l_oki
LOCAL l_end = FALSE

WHILE l_end = FALSE
//Überprüfung ob die datei vorhanden ist
        l_oki = DOESFILEEXIST(l_name$+l_count+".png")
//Wenn nicht, datei erstellen und die schleife beenden
IF l_oki = FALSE
SAVEBMP l_name$+l_count+".png"
l_end = TRUE
ENDIF

// wenn ja, l_counter um eins zu erhöhen um den Dateinamen zu ändern
IF l_oki = TRUE
l_count = l_count + 1
ENDIF

//Ne einfache Kontrolle ausgeben/speichern
// PUTFILE "Ausgabe.txt",l_count,"Name des Bildes ist: "dir$+l_name$+l_count+".bmp"+" : "+"Status von keyhit ist: "+KeyHit(57)
IF l_count > 20 THEN l_end = TRUE //Nicht mehr als 21 Bilder speichern
WEND
l_do% = TRUE
RETURN l_do%
ENDFUNCTION




FUNCTION F_KeyHitUpdate:
GLOBAL   gKeyDown[], gKeyState[]
LOCAL  k
LOCAL i
STATIC a
    // First Time call/ zum ersten Mal hier
    //IF BOUNDS(gKeyDown[],0)=0
    IF a = 0
        DIM gKeyDown[256]
        DIM gKeyState[256]
        a =1
    ENDIF

    // For each key / für jede Taste
    FOR i=0 TO 255
        k = KEY(i)
        // Key is pressed / Taste ist gedrückt
        IF k
            IF gKeyDown[i]
                gKeyState[i]=1
            ELSE
                gKeyDown[i]=1
                gKeyState[i]=2
            ENDIF
        ELSE
            // Key is not pressed / Taste nicht gedrückt

            // Has key been pressed before?
            // War die Taste gedrückt?
            IF gKeyDown[i]
                gKeyDown[i] = 0
                gKeyState[i] = -1
            ELSE
                gKeyState[i]=0
            ENDIF
        ENDIF
    NEXT
ENDFUNCTION



//  0 = not pressed / nicht gedrückt
//  2 = just pressed / gerade runtergedrückt
//  1 = pressed / gedrückt (gehalten)
// -1 = release event / wieder losgelassen
FUNCTION F_KeyHit: nkey
    RETURN gKeyState[nkey]
ENDFUNCTION

I7 2600K; 8 GB RAM ; Win10 Pro x64 | NVidia GTX 750 TI 2048MB ; Realtec OnBoard Sound;
Lenovo ThinkPad T400: XP Pro
GLB Premium-immer Aktuell

Vampire

huh^^ was is denn hier los?
Is ja toll, vielen Dank für all die Guten Tipps, Jungs. :D
Ich werde das alles mal ausprobieren...

@SchranzOr,

hier der Code:

Code (glbasic) Select
IF KEY(59) = 1       THEN GOSUB shot
       SHOWSCREEN
  WEND



// ------------------------------------------------------------- //
// ---  SHOT  ---
// ------------------------------------------------------------- //
SUB shot:
zaehl = zaehl + 1
IF timer < GETTIMERALL()
  SAVEBMP "test" + zaehl + ".bmp"
  PLAYSOUND (2, 0, 1.0)
timer = GETTIMERALL()+500
ENDIF
RETURN
ENDSUB // SHOT

Schranz0r

#8
Code (glbasic) Select
IF KEY(59) = 1       THEN GOSUB shot
       SHOWSCREEN
  WEND



// ------------------------------------------------------------- //
// ---  SHOT  ---
// ------------------------------------------------------------- //
SUB shot:
IF timer < GETTIMERALL()
  zaehl = zaehl + 1
  SAVEBMP "test" + zaehl + ".bmp"
  PLAYSOUND (2, 0, 1.0)
timer = GETTIMERALL()+500
ENDIF
ENDSUB


ne Funktion ist aber schöner ;)

@ D2O:

Wenn er nur das für den Screenshot braucht, reicht ja was simples ;)
I <3 DGArray's :D

PC:
AMD Ryzen 7 3800X 16@4.5GHz, 16GB Corsair Vengeance LPX DDR4-3200 RAM, ASUS Dual GeForce RTX™ 3060 OC Edition 12GB GDDR6, Windows 11 Pro 64Bit, MSi Tomahawk B350 Mainboard

Vampire

Cool  8) jetzt laüft alles so wie ich mir das vorgestellt habe.
Nochmal Danke an alle die mir geantwortet haben :)

Im Projektordner finde ich plötzlich die Datei  "profile.csv" mit diesem Inhalt:

Date,Time,QuerPerfFreq
May 23 2011,20:05:33,3579
Function,Calls,Tot.with childs,Exec.only,Av.Exe[s/call]
shot,5,0.037,0.037,0.007
__MainGameSub_,1,39.973,39.936,39.936
Total,6,40.010,39.973