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
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?
Musst dir nen Timer setzen
IF timer < GETTIMERALL()
//Mache Screenshot hier
timer = GETTIMERALL()+500 // 500ms bis zum nächsten Screenshot
ENDIF
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 :)
oder du leerst die Tastaturpuffer von evtl. weiteren vorhandenen F1-Tastendrücken mit
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.
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
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
Oder du überprüfst eine weiter Variable die nur wieder true wird wenn die taste losgelassen wurde
WHILE....
.....
IF KEY(59) = FALSE THEN losgelassen = TRUE
IF KEY(59)=TRUE AND losgelassen = TRUE THEN GOSUB shot
SHOWSCREEN
WEND
SUB shot:
losgelassen = FALSE
....
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.
// --------------------------------- //
// 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
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:
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
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 ;)
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