Skip to content

Petikan Kod

Bahagian ini merangkumi tiga petikan kod yang berguna untuk LightScript Anda: meter, pengendali keadaan, dan pengendali kesan.

Sebagai sambungan dari bahagian sebelumnya, kelas Meter direka untuk membantu menjejak perubahan bermakna dalam data meteran yang tidak stabil. Fikirkan ia sebagai pedal brek untuk kod Anda — memberikan kestabilan walaupun dalam zon yang kompleks. Setiap meter menyimpan susunan nilai yang boleh dikustomisasi yang dikumpulkan semasa setiap jalan fungsi kemaskini Anda. Apabila semua nilai dalam susunan itu adalah sama (iaitu, data “stabil”), meter mengemas kini nilainya dan mencetuskan fungsi panggilan balik yang dipautkan untuk mengaktifkan kesan.

KaedahDeskripsi
Meter(size, callback)Pembina menerima kedua-dua size dan callback.\n\n\n\nsize — bilangan kali nilai yang sama harus hadir untuk nilai meter dianggap cukup ‘stabil’ untuk diproses. Nilai yang lebih tinggi menghasilkan lebih banyak ketepatan, nilai yang lebih rendah menghasilkan kurang kelewatan.\n\n\ncallback — fungsi yang dipanggil apabila nilai meter stabil dan telah berubah.
Meter.setValue(value)Anda harus memanggil setValue(value) setiap bingkai, atau bila-bila masa data mentah baru untuk meter ini tersedia.

Proses pengumpulan data skrin secara umum harus mengikuti struktur ini:

  1. Nilai engine.vision.meter dikemas kini berdasarkan data baru dari skrin.
  2. Di dalam fungsi kemaskini, Meter.setValue(engine.vision.meter) dipanggil untuk merekod nilai baru.
  3. Meter memeriksa susunan dalamannya untuk melihat apakah semua nilai adalah sama. Jika ya, ia mengemas kini keadaannya sendiri dan menjalankan fungsi panggilan balik yang ditugaskan.
  4. Fungsi panggilan balik kemudian menilai syarat tertentu menggunakan pemboleh ubah Meter dan melaksanakan kodnya jika syarat tersebut dipenuhi.

NOTA PENTING:

Jangan langkau penggunaan panggilan balik. Memandangkan fungsi kemaskini berjalan secara berterusan, ia mesti kekal seefisien mungkin. Peranan utamanya harus untuk mengemas kini nilai Meter. Elakkan menghubungkan syarat bersyarat dalam kemaskini untuk memeriksa meter dan mencetuskan kesan, kerana ini membawa kepada pemeriksaan yang tidak perlu pada setiap kitaran. Sebaliknya, tentukan kesan Anda dalam fungsi berasingan dan hantar mereka ke Meter Anda sebagai panggilan balik.

Apabila stabil, Meter akan menyediakan beberapa nilai kepada fungsi panggilan baliknya:

Pemboleh UbahDeskripsi
Meter.valueNilai semasa meter.
Meter.increasedBoolean yang menunjukkan sama ada nilai kita telah meningkat pada kemaskini ini
Meter.decreasedBoolean yang menunjukkan sama ada nilai kita telah menurun pada kemaskini ini
Meter.diffNilai mutlak perubahan yang meter alami pada kemaskini ini.

Berikut adalah persediaan meter tunggal asas, termasuk kod kelas Meter:

<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();
}
};
}

Pengendali keadaan adalah tindanan kesan yang khusus mengendalikan kesan yang mempunyai keutamaan ke atas semua yang lain. Jika Anda mahukan satu animasi dominan yang besar untuk berjalan sehingga selesai tanpa gangguan, masukkan ke dalam pengendali keadaan.

KaedahDeskripsi
StateHandler()Pembina tidak memerlukan sebarang argumen.
StateHandler.push(new State())Anda boleh menolak keadaan baru ke tindanan keadaan menggunakan push, dan pemprosesan akan bermula serta-merta.
StateHandler.pop()Mengeluarkan keadaan semasa dari tindanan keadaan, dan mula memproses keadaan sebelumnya pada tindanan keadaan.

Sebarang objek yang ditolak ke pengendali keadaan mesti melaksanakan Process(). Fungsi Process menentukan jangka hayat kesan dalam pengendali.

Berikut menunjukkan pengendali keadaan asas, ditambah fungsi Process yang seharusnya berjalan di dalam fungsi kesan Anda:

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();
};

Pengendali kesan sangat berguna untuk menyimpan dan merender kesan yang lebih kecil dan lebih ringan bersama-sama. Setiap kesan dalam pengendali akan dinilai pada setiap panggilan kemaskini, dan ia dialih keluar apabila mencapai penghujung jangka hayatnya.

Pengendali kesan hanyalah susunan untuk menyimpan kesan. Itu sahaja.

// Declare effects array
let effects = [];
// (Not shown) Evaluate Meter, callback function pushes effect into effects array
effects.push(new SpecialEffect());
// Iterate through the array, animating a frame for each effect
for (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);
}
}

Pengurus keadaan adalah khusus untuk kesan keutamaan, yang bermakna kita perlu memberikannya keutamaan semasa pelaksanaan. Dalam fungsi kemaskini Anda, proses pengendali kesan KEMUDIAN pengendali keadaan. Ini akan melukis kesan keadaan di atas item pengendali kesan.

Seperti ini:

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();
}

Menyimpan data USB adalah proses yang mudah, tetapi pemacu yang digunakan oleh program ini diketahui bercanggah dengan sistem tertentu, kadang-kadang melumpuhkan port USB sehingga perisian dialih keluar. Pembetulan biasa adalah menyahaktifkan ‘Secure Boot’ dalam tetapan BIOS/UEFI Anda. Sebelum meneruskan, sangat disyorkan untuk mempunyai pemulihan sistem yang tersedia pada pemacu kilat atau cara untuk mengakses komputer Anda dari jauh yang tidak bergantung pada input pengguna semasa but. Ini penting sekiranya menyahaktifkan Secure Boot tidak menyelesaikan isu dan Anda tidak dapat mengakses sistem untuk menyahpasang program. Dalam kes sedemikian, penyegaran Windows mungkin diperlukan untuk mengalih keluar semua program yang dipasang sambil menyimpan fail peribadi Anda. Anda melakukan ini atas risiko Anda sendiri. Jika Anda tidak berasa selesa untuk mencuba, minta peranti Anda di sini. Jangan gunakan sistem komputer riba untuk proses ini.

Setelah dipasang, prosesnya mudah dan akan menangkap semua data yang melalui peranti USB Anda. Jangan taip sebarang maklumat sensitif semasa menangkap jika Anda merancang untuk berkongsi data, kerana ketukan kekunci disertakan dalam rakaman. Dua program pihak ketiga yang boleh digunakan adalah Usblyzer (percubaan percuma) dan Wireshark (percuma). Kedua-duanya berfungsi, tetapi jika Anda memilih Wireshark, pastikan USBPcap dipilih.

Lihat halaman seterusnya kami, Callbacks, untuk maklumat lanjut tentang membina panggilan balik meter dan fungsi kesan.