Schönen Heiligabend liebe Community,
ich würde gerne wissen wie ich abfragen kann ob ein Spieler eine Taste 3 Sekundenlang drückt ?
Schönen Heiligabend liebe Community,
ich würde gerne wissen wie ich abfragen kann ob ein Spieler eine Taste 3 Sekundenlang drückt ?
#define PRESSED(%0) \
(((newkeys & (%0)) == (%0)) && ((oldkeys & (%0)) != (%0)))
#define RELEASED(%0) \
(((newkeys & (%0)) != (%0)) && ((oldkeys & (%0)) == (%0)))
new ThreeSecondHoldingTimerHandle[MAX_PLAYERS];
public OnPlayerKeyStateChange(playerid, newkeys, oldkeys) {
if(PRESSED(KEY_FIRE)) {
ThreeSecondHoldingTimerHandle[playerid] = SetTimerEx("ThreeSecondHoldingTimer", 3000, false, "i", playerid);
SetPVarInt(playerid, "ThreeSecondHoldingTrigger", 1);
} else if(RELEASED(KEY_FIRE)) {
if(GetPVarInt(playerid, "ThreeSecondHoldingTrigger") != 0) {
KillTimer(ThreeSecondHoldingTimerHandle[playerid]);
SetPVarInt(playerid, "ThreeSecondHoldingTrigger", 0);
}
}
}
forward ThreeSecondHoldingTimer(playerid);
public ThreeSecondHoldingTimer(playerid) {
SetPVarInt(playerid, "ThreeSecondHoldingTrigger", 0);
// Spieler mit der ID playerid hat nun den Key "KEY_FIRE" für drei Sekunden gehalten.
}
Lies dich mal hier ein:
http://wiki.sa-mp.com/wiki/Keys
http://wiki.sa-mp.com/wiki/OnPlayerKeyStateChange
Statt nen Timer kannste auch einfach nen Timestamp verwenden, dann bleibt es bei ner Variable und ner Abfrage.
Statt nen Timer kannste auch einfach nen Timestamp verwenden, dann bleibt es bei ner Variable und ner Abfrage.
Ein Timer muss in diesem Fall nicht unbedingt schlecht sein. Bei 500 Spielern 500 Variablen alle paar Millisekunden zu überprüfen wird a) ungenau und b) sicherlich nicht performancemäßig besser.
Warum sollte die Variable alle paar Ms überprüft werden? Bei der Timer Variante (Oh Gott, geh bitte nicht von 500 Spielern aus, guck dir die Server an .. ) wird bei jedem Spieler pro Mausklick (je nach Einstellungen) ein Timer gestartet. Bei meiner Variante wird nur eine Variable gefüllt, beim loslassen abgefragt. Kann mir keiner was sagen, die Timestamp Variante ist schneller, mache gerne nen dingends (hab das Wort gerade nicht parat, zum messen der Zeit der Tat..)
Warum sollte die Variable alle paar Ms überprüft werden? Bei der Timer Variante (Oh Gott, geh bitte nicht von 500 Spielern aus, guck dir die Server an .. ) wird bei jedem Spieler pro Mausklick (je nach Einstellungen) ein Timer gestartet. Bei meiner Variante wird nur eine Variable gefüllt, beim loslassen abgefragt. Kann mir keiner was sagen, die Timestamp Variante ist schneller, mache gerne nen dingends (hab das Wort gerade nicht parat, zum messen der Zeit der Tat..)
Ich gehe immer nach dem Worst-Case-Szenario.
Das funktioniert aber nur, wenn nur getestet werden muss, ob die Taste mehr oder gleich drei Sekunden gedrückt gehalten wurde. Ich ging davon aus, dass nach drei Sekunden etwas passieren sollte und nicht erst, wenn die Taste wieder losgelassen wurde. Die bessere Version hängt nun vom Anwendungsfall ab - ich gebe dir Recht, wenn die Abfrage erst beim Loslassen des Keys kommen muss, dann wäre deine Version besser. Im anderen Fall würde ich jedoch für den Timer gehen.