Snippets
Deze sectie bevat drie nuttige codeknipsels voor uw LightScripts: meters, toestandshandlers en effecthandlers.
De Meter
Section titled “De Meter”Als vervolg op de vorige sectie is de Meter-klasse ontworpen om betekenisvolle wijzigingen in onstabiele metergegevens bij te houden. Beschouw het als een rempedaal voor uw code — het biedt stabiliteit zelfs in complexe zones. Elke meter bevat een aanpasbare array van waarden die worden verzameld tijdens elke uitvoering van uw updatefunctie. Wanneer alle waarden in die array hetzelfde zijn (d.w.z. de gegevens zijn “stabiel”), werkt de meter zijn waarde bij en activeert een gekoppelde callbackfunctie om een effect te activeren.
| Methode | Beschrijving |
|---|---|
| Meter(size, callback) | De constructor accepteert zowel een size als een callback.\n\n\n\nsize — het aantal keren dat een identieke waarde aanwezig moet zijn zodat de meterwaarde als ‘stabiel’ genoeg wordt beschouwd om te worden verwerkt. Hogere waarden resulteren in meer nauwkeurigheid, lagere waarden resulteren in minder latentie.\n\n\ncallback — een functie die wordt aangeroepen wanneer de meterwaarde stabiel is en is veranderd. |
| Meter.setValue(value) | U moet setValue(value) aanroepen elk frame, of elke keer dat er nieuwe ruwe gegevens voor deze meter beschikbaar zijn. |
Het proces van het verzamelen van schermgegevens moet over het algemeen deze structuur volgen:
- De waarde engine.vision.meter wordt bijgewerkt op basis van nieuwe gegevens van het scherm.
- Binnen de updatefunctie wordt Meter.setValue(engine.vision.meter) aangeroepen om de nieuwe waarde vast te leggen.
- De Meter controleert zijn interne array om te zien of alle waarden identiek zijn. Als dat zo is, werkt het zijn eigen toestand bij en voert zijn toegewezen callbackfunctie uit.
- De callbackfunctie evalueert vervolgens specifieke condities met behulp van de variabelen van de Meter en voert zijn code uit als aan die condities wordt voldaan.
BELANGRIJKE OPMERKING:
Sla het gebruik van callbacks niet over. Omdat de updatefunctie continu wordt uitgevoerd, moet deze zo efficiënt mogelijk blijven. Zijn primaire rol moet zijn het bijwerken van Meter-waarden. Vermijd het koppelen van conditionals binnen de update om meters te controleren en effecten te activeren, omdat dit leidt tot onnodige controles bij elke cyclus. Definieer in plaats daarvan uw effecten in afzonderlijke functies en geef ze door aan uw Meter als callbacks.
Metervariabelen
Section titled “Metervariabelen”Wanneer stabiel, geeft de Meter een paar waarden aan zijn callbackfunctie:
| Variabelen | Beschrijving |
|---|---|
| Meter.value | De huidige waarde van de meter. |
| Meter.increased | Een booleaanse waarde die aangeeft of onze waarde is gestegen in deze update |
| Meter.decreased | Een booleaanse waarde die aangeeft of onze waarde is gedaald in deze update |
| Meter.diff | De absolute waarde van de wijziging die de meter heeft ondergaan in deze update. |
Metervoorbeeld
Section titled “Metervoorbeeld”Hier is een eenvoudige enkelvoudige meteropstelling, inclusief de Meter-klassecode:
<head> <title>Meter Example</title> <meta description="Step-by-step metering" /> <meta meter="health" tags="vlc,fortnite" x= ".05" y=".9" width=".189" h="70-140" s="40-100" l="40-100" type="linear" /></head>
<body style="margin: 0; padding: 0; background: #000;"> <canvas id="exCanvas" width="320" height="200"></canvas></body>
<script> var c = document.getElementById("exCanvas"); var ctx = c.getContext("2d");
// Initialize meter var healthMeter = new Meter(5, healthEffect);
function update(){ // Update Meter values healthMeter.setValue(engine.vision.health);
window.requestAnimationFrame(update); }
function healthEffect(){ if(healthMeter.increased){ // Trigger effect } else if (healthMeter.value == 0){ // Trigger effect } else if (healthMeter.diff > .3){ // Trigger effect } }
function Meter(size, callback) { this.size = size; this.value = 0; this.diff = 0; this.increased = false; this.decreased = false; var values = [];
this.setValue = function (updatedValue) { // Add and shift. values.push(updatedValue); if (values.length > this.size) { values.shift(); }
// Exit early if we don't have a long-term match. for (var i = 0; i < values.length - 1; i++) { if (values[i] !== values[i + 1]) return; }
// We got here, so we've got a matching value collection. Set variables and execute callback. if (this.value !== values[0]) { this.diff = Math.abs(this.value - values[0]); this.increased = this.value < values[0]; this.decreased = this.value > values[0]; this.value = values[0]; callback(); } }; }
window.requestAnimationFrame(update);
</script><head> <title>Meter Example</title> <meta description="Step-by-step metering" /> <meta meter="health" tags="vlc,fortnite" x= ".05" y=".9" width=".189" h="70-140" s="40-100" l="40-100" type="linear" /></head><body style="margin: 0; padding: 0; background: #000;"> <canvas id="exCanvas" width="320" height="200"></canvas></body><script> var c = document.getElementById("exCanvas"); var ctx = c.getContext("2d");
// Initialize meter var healthMeter = new Meter(5, healthEffect);
function update(){ // Update Meter values healthMeter.setValue(engine.vision.health);
window.requestAnimationFrame(update); }
function healthEffect(){ if(healthMeter.increased){ // Trigger effect } else if (healthMeter.value == 0){ // Trigger effect } else if (healthMeter.diff > .3){ // Trigger effect } }
function Meter(size, callback) { this.size = size; this.value = 0; this.diff = 0; this.increased = false; this.decreased = false; var values = [];
this.setValue = function (updatedValue) { // Add and shift. values.push(updatedValue); if (values.length > this.size) { values.shift(); }
// Exit early if we don't have a long-term match. for (var i = 0; i < values.length - 1; i++) { if (values[i] !== values[i + 1]) return; }
// We got here, so we've got a matching value collection. Set variables and execute callback. if (this.value !== values[0]) { this.diff = Math.abs(this.value - values[0]); this.increased = this.value < values[0]; this.decreased = this.value > values[0]; this.value = values[0]; callback(); } }; }
window.requestAnimationFrame(update);
</script>function Meter(size, callback) { this.size = size; this.value = 0; this.diff = 0; this.increased = false; this.decreased = false; var values = [];
this.setValue = function (updatedValue) { // Add and shift. values.push(updatedValue); if (values.length > this.size) { values.shift(); }
// Exit early if we don't have a long-term match. for (var i = 0; i < values.length - 1; i++) { if (values[i] !== values[i + 1]) return; }
// We got here, so we've got a matching value collection. Set variables and execute callback. if (this.value !== values[0]) { this.diff = Math.abs(this.value - values[0]); this.increased = this.value < values[0]; this.decreased = this.value > values[0]; this.value = values[0]; callback(); } }; }De toestandshandler
Section titled “De toestandshandler”De toestandshandler is een effectstapel die specifiek effecten afhandelt die prioriteit hebben boven alle andere. Als u één grote dominante animatie wilt laten uitvoeren totdat deze klaar is zonder onderbreking, plaatst u deze in de toestandshandler.
| Methode | Beschrijving |
|---|---|
| StateHandler() | De constructor vereist geen argumenten. |
| StateHandler.push(new State()) | U kunt een nieuwe toestand op de toestandsstapel plaatsen met push, en de verwerking begint onmiddellijk. |
| StateHandler.pop() | Haalt de huidige toestand van de toestandsstapel, en begint de vorige toestand op de stapel te verwerken. |
Elk object geplaatst in de toestandshandler moet Process() implementeren. De Process-functie bepaalt de levensduur van een effect in de handler.
Voorbeeld toestandshandler
Section titled “Voorbeeld toestandshandler”Het volgende toont een eenvoudige toestandshandler, plus de Process-functie die binnen uw effectfuncties moet worden uitgevoerd:
var stateHdlr = new StateHandler();
function StateHandler() { var stack = []; var state = null;
// Set current state to the top item in the stack var updateState = function () { if (stack.length > 0) { state = stack[stack.length - 1]; } else { state = null; } };
// Allows dev to add effect to state handler this.Push = function (newState) { stack.push(newState); updateState(); }; // Allows dev to remove effect from handler this.Pop = function () { stack.pop(); updateState(); }; // Call the Process function of the current state (effect) this.Process = function () { if (state != null) { state.Process(); } }; }
function update(){ stateHdlr.Process();}this.start = new Date.now()this.elapsed = 0;this.duration = 1000;
this.Process = function () { // Evaluate time since effect start this.elapsed = new Date.now() - this.start; // If the effect has reached its lifespan, remove it from the state handler if (this.elapsed > this.duration) { stateMgr.Pop(); } // If the effect is still running, call the effect draw function this.Draw();};De effecthandler
Section titled “De effecthandler”Effecthandlers zijn uitstekend voor het samen opslaan en renderen van kleinere, lichtere effecten. Elk effect in de handler wordt bij elke update-aanroep geëvalueerd en wordt verwijderd wanneer het einde van zijn levensduur is bereikt.
De effectshandler is gewoon een array om effecten op te slaan. Dat is alles.
// Declare effects arraylet effects = [];
// (Not shown) Evaluate Meter, callback function pushes effect into effects arrayeffects.push(new SpecialEffect());
// Iterate through the array, animating a frame for each effectfor (let i = 0; i < effects.length; i++) { effects[i].draw(); // Remove effect if the lifetime has ended if (effects[i].lifetime <= 0) { effects.splice(i, 1); }}WAARSCHUWING EFFECT VS. TOESTAND
Section titled “WAARSCHUWING EFFECT VS. TOESTAND”De toestandsmanager is specifiek voor prioriteitseffecten, wat betekent dat we er prioriteit aan moeten geven tijdens de uitvoering. Verwerk in uw updatefunctie de effecthandler VERVOLGENS de toestandshandler. Dit tekent het toestandseffect bovenop de items van de effecthandler.
Zo:
function update(){ // Evaluate effects handler for (let i = 0; i < effects.length; i++) { effects[i].draw(); if (effects[i].lifetime <= 0) { effects.splice(i, 1); } }
// THEN evaluate state handler stateMgr.Process();}Gids voor het vastleggen van USB-gegevens
Section titled “Gids voor het vastleggen van USB-gegevens”Het opslaan van USB-gegevens is een eenvoudig proces, maar de stuurprogramma’s die door deze programma’s worden gebruikt, zijn bekend om conflicten te veroorzaken met bepaalde systemen, soms USB-poorten uitschakelend totdat de software is verwijderd. De gebruikelijke oplossing is om ‘Veilig opstarten’ uit te schakelen in uw BIOS/UEFI-instellingen. Voordat u doorgaat, wordt sterk aanbevolen om een systeemherstel beschikbaar te hebben op een USB-stick of een manier om op afstand toegang te krijgen tot uw computer die niet afhankelijk is van gebruikersinvoer bij het opstarten. Dit is belangrijk voor het geval het uitschakelen van Veilig opstarten het probleem niet oplost en u geen toegang kunt krijgen tot het systeem om het programma te verwijderen. In dergelijke gevallen kan een Windows-vernieuwing nodig zijn om alle geïnstalleerde programma’s te verwijderen terwijl uw persoonlijke bestanden behouden blijven. U doet dit op eigen risico. Als u zich hier niet comfortabel bij voelt, vraag uw apparaat hier aan. Gebruik geen laptop voor dit proces.
Eenmaal geïnstalleerd is het proces eenvoudig en legt het alle gegevens vast die door uw USB-apparaten gaan. Typ geen gevoelige informatie tijdens het vastleggen als u van plan bent de gegevens te delen, omdat toetsaanslagen zijn opgenomen in de opname. Twee programma’s van derden die kunnen worden gebruikt zijn Usblyzer (gratis proefversie) en Wireshark (gratis). Beide werken, maar als u Wireshark kiest, zorg dan dat USBPcap is geselecteerd.
Bekijk onze volgende pagina, Callbacks, voor meer details over het samenstellen van metercallbacks en effectfuncties.