Nalika sampeyan plug in controller, sampeyan remukan tombol, mindhah teken, narik pemicu ... lan minangka pangembang, sampeyan ora weruh. Browser njupuk munggah, mesthi, nanging kajaba sampeyan lagi logging nomer ing console, iku ora katon. Sing sirah karo Gamepad API. Iku wis watara kanggo taun, lan iku bener cukup kuat. Sampeyan bisa maca tombol, tongkat, pemicu, karya. Nanging akeh wong ora ndemek. Kenging punapa? Amarga ora ana tanggapan. Ora ana panel ing alat pangembang. Ora ana cara sing jelas kanggo ngerti manawa pengontrol nindakake apa sing sampeyan pikirake. Rasane kaya mabur buta. Sing bugged kula cukup kanggo mbangun alat sethitik: Gamepad Cascade Debugger. Tinimbang ndeleng output console, sampeyan entuk tampilan langsung, interaktif saka pengontrol. Pencet soko lan nanggepi ing layar. Lan nganggo CSS Cascade Layers, gaya tetep diatur, dadi luwih resik kanggo debug. Ing kirim iki, aku bakal nuduhake sampeyan kenapa pengontrol debugging pancen lara, kepiye CSS mbantu ngresiki, lan kepiye carane nggawe debugger visual sing bisa digunakake maneh kanggo proyek sampeyan dhewe.

Sanajan sampeyan bisa mlebu kabeh, sampeyan bakal entuk spam konsol sing ora bisa diwaca. Contone: [0,0,1,0,0,0,5,0,...] [0,0,0,0,1,0,0,...] [0,0,1,0,0,0,0,...]

Bisa ngomong apa tombol ditekan? Mungkin, nanging mung sawise ketegangan mata lan ilang sawetara input. Dadi, ora, debugging ora gampang nalika maca input. Masalah 3: Kurang Struktur Sanajan sampeyan nggawe visualisasi cepet, gaya bisa cepet dadi kacau. Status standar, aktif, lan debug bisa tumpang tindih, lan tanpa struktur sing jelas, CSS sampeyan dadi rapuh lan angel ditambahi. CSS Cascade Layers bisa mbantu. Dheweke nglumpukake gaya dadi "lapisan" sing diurutake miturut prioritas, supaya sampeyan mandheg nglawan spesifik lan ngira, "Napa gaya debugku ora ditampilake?" Nanging, sampeyan njaga keprihatinan sing kapisah:

Dasar: Standar pengontrol, tampilan awal. Aktif: Sorotan kanggo tombol sing dipencet lan dipindhah. Debug: Overlay kanggo pangembang (contone, maca angka, pandhuan, lan liya-liyane).

Yen kita nemtokake lapisan ing CSS miturut iki, kita kudu: /* prioritas paling murah nganti paling dhuwur */ @layer base, aktif, debug;

@lapisan dasar { /* ... */ }

@lapisan aktif { /* ... */ }

@layer debug { /* ... */ }

Amarga saben lapisan tumpukan predictably, sampeyan tansah ngerti kang aturan menang. Prediksi kasebut ndadekake debugging ora mung luwih gampang, nanging bisa diatur. Kita wis ngrampungake masalah kasebut (input sing ora katon, rame) lan pendekatan (debugger visual sing dibangun nganggo Lapisan Cascade). Saiki kita bakal mlaku liwat proses langkah-langkah kanggo mbangun debugger. Konsep Debugger Cara paling gampang kanggo nggawe input sing didhelikake katon yaiku mung nggambar ing layar. Sing apa debugger iki. Tombol, pemicu, lan joystick kabeh entuk visual.

Pencet A: A bunder murup. Nudge tongkat: bunder mubeng. Narik pemicu separo: Bar isi setengah.

Saiki sampeyan ora mandeng ing 0s lan 1s, nanging bener nonton controller reaksi langsung. Mesthi, yen sampeyan miwiti tumpukan ing negara kaya standar, dipencet, info debug, bisa uga mode rekaman, CSS wiwit saya gedhe lan luwih rumit. Sing ngendi lapisan cascade teka ing Handy. Punika conto sing diudani: @lapisan dasar { .tombol { latar mburi: # 222; wates-radius: 50%; jembaré: 40px; dhuwur: 40px; } }

@lapisan aktif { .tombol.ditekan { latar mburi: #0f0; /* ijo padhang */ } }

@layer debug { .tombol::sawise { isi: attr(nilai-data); ukuran font: 12px; warna: #fff; } }

Urutan lapisan penting: basa → aktif → debug.

dhasar ndudohke controller. aktif Ngalahake negara dipencet. debug mbalang ing overlays.

Mbusak kaya iki tegese sampeyan ora nglawan perang spesifik sing aneh. Saben lapisan wis panggonan, lan sampeyan tansah ngerti apa menang. Mbangun Iku Ayo entuk soko ing layar dhisik. Ora perlu katon apik - mung kudu ana supaya kita bisa nggarap.

Gamepad Cascade Debugger

A
B
X

Debugger ora aktif

Sing secara harfiah mung kothak. Durung nyenengake, nanging menehi kita gagang kanggo njupuk mengko karo CSS lan JavaScript. Oke, aku nggunakake lapisan kaskade ing kene amarga tetep diatur yen sampeyan nambahake luwih akeh negara. Punika pass kasar:

/* ================================================== CASCADE LAYERS SETUP Prekara pesenan: dhasar → aktif → debug ================================================== */

/* Nemtokake urutan lapisan ing ngarep */ @layer base, aktif, debug;

/* Lapisan 1: Gaya dhasar - tampilan standar */ @lapisan dasar { .tombol { latar mburi: # 333; wates-radius: 50%; jembaré: 70px; dhuwur: 70px; tampilan: flex; mbenerake-isi: tengah; align-item: tengah; }

.ngaso { jembaré: 20px; dhuwur: 70px; latar mburi: # 333; tampilan: inline-block; } }

/* Layer 2: Status aktif - nangani tombol sing ditekan */ @lapisan aktif { .tombol.aktif { latar mburi: #0f0; /* Ijo padhang nalika ditekan */ ngowahi: skala (1.1); /* rada nggedhekake tombol */ }

.pause.active { latar mburi: #0f0; ngowahi: skalaY(1.1); /* Muter vertikal nalika ditekan */ } }

/* Lapisan 3: Debug overlay - info pangembang */ @layer debug { .tombol::sawise { isi: attr(nilai-data); /* Nuduhake nilai numerik */ ukuran font: 12px; warna: #fff; } }

Kaendahan saka pendekatan iki yaiku saben lapisan nduweni tujuan sing jelas. Lapisan dhasar ora bakal bisa ngalahake aktif, lan aktif ora bisa ngilangi debug, preduli saka kekhususan. Iki ngilangi perang spesifik CSS sing biasane nyerang alat debugging. Saiki katon kaya sawetara klompok lungguh ing latar mburi peteng. Jujur, ora ala banget.

Nambahake JavaScript wektu JavaScript. Iki ngendi controller bener nindakake soko. Kita bakal mbangun langkah iki. Langkah 1: Nggawe Manajemen Negara Pisanan, kita butuh variabel kanggo nglacak status debugger: // ================================================== // MANAJEMEN NEGARA // ==================================================

supaya mlaku = palsu; // Trek apa debugger aktif ayo rafId; // Nyimpen ID requestAnimationFrame kanggo pembatalan

Variabel kasebut ngontrol loop animasi sing terus maca input gamepad. Langkah 2: Njupuk Referensi DOM Sabanjure, kita entuk referensi kanggo kabeh unsur HTML sing bakal dianyari: // ================================================== // DOM ELEMENT REFERENSI // ==================================================

const btnA = document.getElementById("btn-a"); const btnB = document.getElementById("btn-b"); const btnX = document.getElementById("btn-x"); const pause1 = document.getElementById("pause1"); const pause2 = document.getElementById("pause2"); status const = document.getElementById("status");

Nyimpen referensi kasebut ing ngarep luwih efisien tinimbang takon DOM bola-bali. Langkah 3: Tambah Keyboard Fallback Kanggo nguji tanpa pengontrol fisik, kita bakal peta tombol keyboard menyang tombol: // ================================================== // KEYBOARD FALLBACK (kanggo nguji tanpa pengontrol) // ==================================================

const keyMap = { "a": btnA, "b": btnB, "x": btnX, "p": [pause1, pause2] // tombol 'p' ngontrol loro jeda bar };

Iki ngidini kita nyoba UI kanthi mencet tombol ing keyboard. Langkah 4: Nggawe Loop Update Utama Ing kene kedadeyan sihir. Fungsi iki mlaku terus-terusan lan maca status gamepad: // ================================================== // UTAMA GAMEPAD UPDATE LOOP // ==================================================

fungsi updateGamepad() { // Njaluk kabeh gamepads disambungake const gamepads = navigator.getGamepads(); yen (! gamepads) bali;

// Gunakake gamepad disambungake pisanan const gp = gamepads[0];

yen (gp) { // Tombol nganyari nyatakake kanthi ngganti kelas "aktif". btnA.classList.toggle("aktif", gp.buttons[0].ditekan); btnB.classList.toggle("aktif", gp.buttons[1].ditekan); btnX.classList.toggle("aktif", gp.buttons[2].ditekan);

// Tombol ngaso (tombol indeks 9 ing paling pengontrol) const pausePressed = gp.tombol[9].ditekan; pause1.classList.toggle("aktif", pausePressed); pause2.classList.toggle("aktif", pausePressed);

// Mbangun dhaptar tombol saiki dipencet kanggo tampilan status ayo ditekan = []; gp.buttons.forEach((btn, i) => { yen (btn.ditekan)ditekan.push("Tombol "+i); });

// Nganyari teks status yen ana tombol sing dipencet yen (ditekan.length > 0) { status.textContent = "Ditekan: " + ditekan.join(", "); } }

// Terus daur ulang yen debugger mlaku yen (mlaku) { rafId = requestAnimationFrame(updateGamepad); } }

Cara classList.toggle () nambah utawa mbusak kelas aktif adhedhasar apa tombol dipencet, kang micu gaya lapisan CSS kita. Langkah 5: Ngatur Acara Keyboard Pamireng acara iki nggawe fallback keyboard bisa digunakake: // ================================================== // KEYBOARD EVENT HANDLERS // ==================================================

document.addEventListener("keydown", (e) => { yen (keyMap[e.key]) { // Nangani siji utawa sawetara unsur yen (Array.isArray(keyMap[e.key])) { keyMap[e.key].forEach(el => el.classList.add("aktif")); } liyane { keyMap[e.key].classList.add("aktif"); } status.textContent = "Tombol ditekan: " + e.key.toUpperCase(); } });

document.addEventListener("keyup", (e) => { yen (keyMap[e.key]) { // Mbusak status aktif nalika tombol dirilis yen (Array.isArray(keyMap[e.key])) { keyMap[e.key].forEach(el => el.classList.remove("aktif")); } liyane { keyMap[e.key].classList.remove("aktif"); } status.textContent = "Kunci dirilis: " + e.key.toUpperCase(); } });

Langkah 6: Tambah Kontrol Mulai / Mungkasi Pungkasan, kita butuh cara kanggo ngaktifake lan mateni debugger: // ================================================== // TOGGLE DEBUGGER ON / OFF // ==================================================

document.getElementById("toggle").addEventListener("klik", () => { mlaku = !mlaku; // Flip negara mlaku

yen (mlaku) { status.textContent = "Debugger mlaku..."; updateGamepad(); // Miwiti loop nganyari } liyane { status.textContent = "Debugger ora aktif"; cancelAnimationFrame(rafId); // Mungkasi loop } });

Dadi ya, pencet tombol lan sumunar. Push tongkat lan gerakane. mekaten. Siji liyane: nilai mentah. Kadhangkala sampeyan mung pengin ndeleng nomer, ora lampu.

Ing tahap iki, sampeyan kudu ndeleng:

Pengontrol layar sing prasaja, Tombol sing nanggepi nalika sampeyan sesambungan karo wong-wong mau, lan Wacan debug opsional sing nuduhake indeks tombol sing ditekan.

Kanggo nggawe iki kurang abstrak, iki demo cepet saka controller ing layar reaksi ing wektu nyata:

Saiki, mencet Mulai Rekam log kabeh nganti sampeyan mencet Stop Rekaman. 2. Ngekspor Data menyang CSV/JSON Sawise kita duwe log, kita bakal pengin nyimpen.

Langkah 1: Nggawe Helper Download Pisanan, kita butuh fungsi helper sing nangani download file ing browser: // ================================================== // FILE DOWNLOAD HELPER // ==================================================

function downloadFile(nama file, konten, tipe = "teks/plain") { // Nggawe blob saka isi const blob = new Blob([konten], {tipe}); const url = URL.createObjectURL(blob);

// Gawe link download sementara banjur klik const a = document.createElement("a"); a.href = url; a.download = jeneng berkas; a.klik();

// Ngresiki URL obyek sawise diundhuh setTimeout(() => URL.revokeObjectURL(url), 100); }

Fungsi iki bisa digunakake kanthi nggawe Blob (obyek gedhe binar) saka data sampeyan, ngasilake URL sementara, lan ngeklik link undhuhan kanthi program. Reresik njamin kita ora bocor memori. Langkah 2: Nangani Ekspor JSON JSON sampurna kanggo njaga struktur data lengkap:

// ================================================== // EXPORT AS JSON // ==================================================

document.getElementById("ekspor-json").addEventListener("klik", () => { // Priksa yen ana apa-apa kanggo ngekspor yen (!frames.length) { console.warn("Ora ana rekaman sing bisa diekspor."); bali; }

// Nggawe payload karo metadata lan pigura muatan const = { createdAt: new Date().toISOString(), pigura };

// Download minangka format JSON Unduh File( "gamepad-log.json", JSON.stringify(payload, null, 2), "aplikasi/json" ); });

Format JSON nggawe kabeh terstruktur lan gampang diurai, saengga cocog kanggo dimuat maneh menyang alat dev utawa bareng karo kanca-kanca. Langkah 3: Nangani Ekspor CSV Kanggo ekspor CSV, kita kudu flatten data hirarkis menyang baris lan kolom:

//=================================== // EKSPOR AS CSV // ==================================================

document.getElementById("ekspor-csv").addEventListener("klik", () => { // Priksa yen ana apa-apa kanggo ngekspor yen (!frames.length) { console.warn("Ora ana rekaman sing bisa diekspor."); bali; }

// Mbangun baris header CSV (kolom kanggo timestamp, kabeh tombol, kabeh sumbu) const headerButtons = frames[0].buttons.map((_,i) => btn${i}); const headerAxes = pigura[0].axes.map((_, i) => sumbu${i}); const header = ["t", ...headerButtons, ...headerAxes].join(",") + "\n";

// Mbangun baris data CSV const rows = frames.map(f => { const btnVals = f.buttons.map(b => b.value); bali [f.t, ...btnVals, ...f.axes].join(","); }).join("\n");

// Ngundhuh minangka CSV downloadFile("gamepad-log.csv", header + rows, "text/csv"); });

CSV apik banget kanggo analisis data amarga mbukak langsung ing Excel utawa Google Sheets, ngidini sampeyan nggawe grafik, nyaring data, utawa pola titik kanthi visual. Saiki yen tombol ekspor wis ana, sampeyan bakal weruh rong pilihan anyar ing panel: Ekspor JSON lan Ekspor CSV. JSON becik yen sampeyan pengin mbuwang log mentah maneh menyang alat dev utawa ngubengi struktur kasebut. CSV, ing sisih liya, mbukak langsung menyang Excel utawa Google Sheets supaya sampeyan bisa nggambar, nyaring, utawa mbandhingake input. Tokoh ing ngisor iki nuduhake tampilan panel karo kontrol ekstra kasebut.

3. Sistem Snapshot Kadhangkala sampeyan ora perlu rekaman lengkap, mung "screenshot" cepet saka negara input. Ing kono tombol Njupuk Snapshot mbantu.

Lan JavaScript:

// ================================================== // TAKE Snapshot // ==================================================

document.getElementById("snapshot").addEventListener("klik", () => { // Njaluk kabeh gamepads disambungake const pads = navigator.getGamepads(); const activePads = [];

// Loop liwat lan njupuk negara saben gamepad disambungake kanggo (const gp saka bantalan) { yen (!gp) terus; // Skip slot kosong

activePads.push({ id: gp.id, // Jeneng/model pengontrol timestamp: performance.now(), tombol: gp.buttons.map(b => ({ ditekan: b. ditekan, nilai: b.nilai })), sumbu: [...gp.axes] }); }

// Priksa manawa ana gamepad sing ditemokake yen (!activePads.length) { console.warn("Ora ana gamepad sing disambungake kanggo snapshot."); alert("Ora ana pengontrol sing dideteksi!"); bali; }

// Log lan ngabari pangguna console.log("Snapshot:", activePads); tandha(Snapshot dijupuk! Dijupuk ${activePads.length} controller(s).); });

Potret membekukan status pengontrol sampeyan ing sawijining wektu. 4. Ghost Input Replay Saiki kanggo sing nyenengake: muter maneh input hantu. Iki njupuk log lan muter maneh kanthi visual kaya pemain phantom nggunakake controller.

JavaScript kanggo muter maneh: // ================================================== // GHOST REPLAY // ==================================================

document.getElementById("muter maneh").addEventListener("klik", () => { // Njamin kita duwe rekaman kanggo muter maneh yen (!frames.length) { alert("Ora ana rekaman kanggo muter maneh!"); bali; }

console.log("Mulai puter maneh hantu...");

// Track wektu kanggo puter maneh nyelarasake ayo startTime = performance.now(); supaya frameIndex = 0;

// Puter maneh animasi loop fungsi step() { const saiki = performance.now(); const elapsed = saiki - startTime;

// Proses kabeh pigura sing kudu wis dumadi saiki while (frameIndex

// Update UI karo tombol direkam negara btnA.classList.toggle("aktif", frame.buttons[0].ditekan); btnB.classList.toggle("aktif", frame.buttons[1].ditekan); btnX.classList.toggle("aktif", frame.buttons[2].ditekan);

// Update status tampilan ayo ditekan = []; frame.buttons.forEach((btn, i) => { if (btn.pressed) pressed.push("Tombol " + i); }); yen (ditekan.length > 0) { status.textContent = "Ghost: " + pressed.join(", "); }

frameIndex++; }

// Terus daur ulang yen ana luwih pigura yen (frameIndex

// Miwiti muter maneh langkah (); });

Kanggo nggawe debugging luwih cepet, aku nambahake ulangan hantu. Sawise sampeyan wis ngrekam sesi, sampeyan bisa mencet muter maneh lan nonton UI tumindak metu, meh kaya pemain phantom mlaku pad. Tombol Replay Ghost anyar katon ing panel kanggo iki.

Hit Rekam, kekacoan watara karo controller dicokot, mungkasi, banjur muter maneh. UI mung nyuarakke kabeh sing sampeyan lakoni, kaya hantu ngetutake input sampeyan. Apa keganggu karo tambahan iki?

Rekaman/ekspor nggampangake panguji kanggo nuduhake persis apa sing kedadeyan. Snapshots beku sedhela, migunani banget nalika sampeyan nguber bug aneh. Muter ulang Ghost apik kanggo tutorial, mriksa aksesibilitas, utawa mung mbandhingake persiyapan kontrol.

Ing wektu iki, ora mung demo sing apik, nanging ana sing bisa ditindakake. Kasus Gunakake Donya Nyata Saiki kita duwe debugger iki sing bisa nindakake akeh. Iki nuduhake input langsung, ngrekam log, ngekspor, lan malah muter maneh. Nanging pitakonan sing bener yaiku: sapa sing peduli? Kanggo sapa iki migunani? Pangembang Game Pengontrol minangka bagean saka proyek, nanging debugging? Biasane nyeri. Mbayangno sampeyan lagi nyoba combo game gelut, kaya ↓ → + pukulan. Tinimbang ndedonga, sampeyan mencet kanthi cara sing padha kaping pindho, sampeyan ngrekam sapisan, lan muter maneh. rampung. Utawa sampeyan ngganti log JSON karo kanca kanggo mriksa yen kode multiplier sampeyan bereaksi padha ing mesin kasebut. Sing ageng. Praktisi Aksesibilitas Iki sing cedhak karo atiku. Ora saben wong muter karo "standar" controller. Pengontrol adaptif kadhangkala mbuwang sinyal aneh. Kanthi alat iki, sampeyan bisa ndeleng persis apa sing kedadeyan. Guru, peneliti, sapa wae. Dheweke bisa njupuk log, mbandhingake, utawa muter maneh input sisih-sisih. Dumadakan, barang sing ora katon katon jelas. Pengujian Jaminan Mutu Penguji biasane nulis cathetan kaya "Aku mashed tombol ing kene lan pecah." Ora banget mbiyantu. Saiki? Dheweke bisa njupuk tekanan sing tepat, ngekspor log, lan ngirim. Ora ngira. Pendidik Yen sampeyan nggawe tutorial utawa video YouTube, muter maneh hantu iku emas. Sampeyan bisa ngomong kanthi harfiah, "Iki apa sing dak lakoni karo pengontrol," nalika UI nuduhake kedadeyan kasebut. Ndadekake panjelasan luwih jelas. Ngluwihi Games Lan ya, iki ora mung babagan game. Wong wis nggunakake pengontrol kanggo robot, proyek seni, lan antarmuka aksesibilitas. Masalah sing padha saben wektu: apa sing dideleng browser? Kanthi iki, sampeyan ora kudu ngira. Kesimpulan Debugging input controller tansah felt kaya mabur wuta. Ora kaya DOM utawa CSS, ora ana inspektur sing dibangun kanggo gamepads; iku mung nomer mentahan ing console, gampang ilang ing gangguan. Kanthi sawetara atus baris HTML, CSS, lan JavaScript, kita nggawe sing beda:

Debugger visual sing nggawe input sing ora katon katon. Sistem CSS berlapis sing njaga UI resik lan debuggable. Seperangkat tambahan (rekaman, ekspor, jepretan, puter maneh hantu) sing nambah saka demo menyang alat pangembang.

Proyek iki nuduhake sepira sampeyan bisa pindhah kanthi nyampur kekuwatan Platform Web kanthi kreatifitas cilik ing CSS Cascade Layers. Alat sing dak jelasake kanthi lengkap yaiku sumber terbuka. Sampeyan bisa kloning repo GitHub lan nyoba dhewe. Nanging sing luwih penting, sampeyan bisa nggawe dhewe. Tambah lapisan dhewe. Mbangun logika muter maneh dhewe. Integrasi karo prototipe game. Utawa malah nggunakake ing cara aku wis ora mbayangno. Kanggo piwulang, aksesibilitas, utawa analisis data. Ing pungkasan dina, iki ora mung babagan debugging gamepads. Iku bab mencorong cahya ing input didhelikake, lan menehi pangembang kapercayan kanggo bisa karo hardware sing web isih ora kebak. Dadi, pasang pengontrol sampeyan, bukak editor, lan wiwiti eksperimen. Sampeyan bisa uga kaget apa sing bisa ditindakake browser lan CSS sampeyan.

You May Also Like

Enjoyed This Article?

Get weekly tips on growing your audience and monetizing your content — straight to your inbox.

No spam. Join 138,000+ creators. Unsubscribe anytime.

Create Your Free Bio Page

Join 138,000+ creators on Seemless.

Get Started Free