# Paggawa ng laro gamit ang mga event
Naisip mo na ba kung paano nalalaman ng mga website kapag nag-click ka sa isang button o nag-type sa isang text box? Iyan ang mahika ng event-driven programming! Ano pa ang mas magandang paraan para matutunan ang mahalagang kasanayang ito kundi ang paggawa ng isang kapaki-pakinabang na bagay - isang typing speed game na tumutugon sa bawat keystroke na iyong ginagawa.
Makikita mo mismo kung paano "nakikipag-usap" ang mga web browser sa iyong JavaScript code. Sa tuwing magki-click, magta-type, o gagalaw ang iyong mouse, nagpapadala ang browser ng maliliit na mensahe (tinatawag natin itong mga event) sa iyong code, at ikaw ang magpapasya kung paano tutugon!
Kapag natapos na tayo dito, makakagawa ka ng isang tunay na typing game na sumusubaybay sa iyong bilis at katumpakan. Mas mahalaga, mauunawaan mo ang mga pangunahing konsepto na nagpapatakbo sa bawat interactive na website na ginamit mo. Tara na!
## Pre-Lecture Quiz
[Pre-lecture quiz](https://ff-quizzes.netlify.app/web/quiz/21)
## Event-driven programming
Isipin ang iyong paboritong app o website - ano ang nagpaparamdam na ito ay buhay at tumutugon? Lahat ito ay tungkol sa kung paano ito tumutugon sa iyong ginagawa! Ang bawat tap, click, swipe, o keystroke ay lumilikha ng tinatawag nating "event," at dito nagaganap ang tunay na mahika ng web development.
Narito ang nagpapakainteresante sa programming para sa web: hindi natin alam kung kailan magki-click ang isang tao sa button o magsisimulang mag-type sa text box. Maaaring mag-click sila kaagad, maghintay ng limang minuto, o baka hindi mag-click kailanman! Ang kawalang-katiyakan na ito ay nangangahulugan na kailangan nating mag-isip nang iba tungkol sa kung paano natin isusulat ang ating code.
Sa halip na magsulat ng code na tumatakbo mula itaas hanggang ibaba tulad ng isang recipe, nagsusulat tayo ng code na matiyagang naghihintay para sa isang bagay na mangyari. Katulad ito ng mga operator ng telegrapo noong 1800s na nakaupo sa kanilang mga makina, handang tumugon sa sandaling dumating ang isang mensahe sa wire.
Kaya ano nga ba ang "event"? Sa madaling salita, ito ay isang bagay na nangyayari! Kapag nag-click ka sa isang button - iyon ay isang event. Kapag nag-type ka ng isang letra - iyon ay isang event. Kapag gumalaw ka ng mouse - isa pang event iyon.
Ang event-driven programming ay nagbibigay-daan sa atin na i-set up ang ating code upang makinig at tumugon. Gumagawa tayo ng mga espesyal na function na tinatawag na **event listeners** na matiyagang naghihintay para sa mga partikular na bagay na mangyari, pagkatapos ay kumikilos kapag nangyari ang mga ito.
Isipin ang event listeners na parang doorbell para sa iyong code. I-set up mo ang doorbell (`addEventListener()`), sabihin dito kung anong tunog ang pakikinggan (tulad ng 'click' o 'keypress'), at pagkatapos ay tukuyin kung ano ang dapat mangyari kapag may nag-ring nito (ang iyong custom na function).
**Narito kung paano gumagana ang event listeners:**
- **Nakikinig** sa mga partikular na aksyon ng user tulad ng pag-click, pag-type, o paggalaw ng mouse
- **Nagpapatupad** ng iyong custom na code kapag nangyari ang tinukoy na event
- **Tumutugon** kaagad sa mga interaksyon ng user, na lumilikha ng seamless na karanasan
- **Humahawak** ng maraming event sa parehong elemento gamit ang iba't ibang listeners
> **NOTE:** Mahalaga ring tandaan na maraming paraan upang gumawa ng event listeners. Maaari kang gumamit ng anonymous functions, o gumawa ng mga named functions. Maaari kang gumamit ng iba't ibang shortcut, tulad ng pag-set ng `click` property, o paggamit ng `addEventListener()`. Sa ating exercise, magpo-focus tayo sa `addEventListener()` at anonymous functions, dahil ito ang pinakakaraniwang teknik na ginagamit ng mga web developer. Ito rin ang pinaka-flexible, dahil gumagana ang `addEventListener()` para sa lahat ng event, at ang pangalan ng event ay maaaring ibigay bilang parameter.
### Karaniwang mga event
Bagama't nag-aalok ang mga web browser ng dose-dosenang iba't ibang event na maaari mong pakinggan, karamihan sa mga interactive na application ay umaasa lamang sa ilang mahahalagang event. Ang pag-unawa sa mga core event na ito ay magbibigay sa iyo ng pundasyon upang makabuo ng mga sopistikadong interaksyon ng user.
Mayroong [dose-dosenang mga event](https://developer.mozilla.org/docs/Web/Events) na magagamit mo upang pakinggan kapag gumagawa ng application. Karaniwang anumang ginagawa ng user sa isang pahina ay nagdudulot ng event, na nagbibigay sa iyo ng maraming kapangyarihan upang matiyak na makakamit nila ang karanasang nais mo. Sa kabutihang-palad, karaniwan mong kakailanganin lamang ang ilang mahahalagang event. Narito ang ilang karaniwang mga event (kasama ang dalawa na gagamitin natin sa paggawa ng ating laro):
| Event | Deskripsyon | Karaniwang Gamit |
|-------|-------------|------------------|
| `click` | Nag-click ang user sa isang bagay | Mga button, link, interactive na elemento |
| `contextmenu` | Nag-right click ang user gamit ang mouse | Mga custom na right-click menu |
| `select` | Nag-highlight ang user ng ilang teksto | Pag-edit ng teksto, mga operasyon ng kopya |
| `input` | Nag-input ang user ng teksto | Pag-validate ng form, real-time na paghahanap |
**Pag-unawa sa mga uri ng event na ito:**
- **Nagti-trigger** kapag nakipag-interact ang mga user sa mga partikular na elemento sa iyong pahina
- **Nagbibigay** ng detalyadong impormasyon tungkol sa aksyon ng user sa pamamagitan ng mga event object
- **Nagpapahintulot** sa iyo na lumikha ng mga tumutugon, interactive na web application
- **Gumagana** nang pare-pareho sa iba't ibang browser at device
## Paggawa ng laro
Ngayon na nauunawaan mo kung paano gumagana ang mga event, ilagay natin ang kaalamang iyon sa praktika sa pamamagitan ng paggawa ng isang kapaki-pakinabang na bagay. Gagawa tayo ng typing speed game na nagpapakita ng event handling habang tinutulungan kang bumuo ng isang mahalagang kasanayan bilang developer.
Gagawa tayo ng laro upang tuklasin kung paano gumagana ang mga event sa JavaScript. Susubukan ng ating laro ang kasanayan ng isang manlalaro sa pag-type, na isa sa mga pinaka-underrated na kasanayan na dapat taglayin ng lahat ng developer. Fun fact: ang QWERTY keyboard layout na ginagamit natin ngayon ay talagang idinisenyo noong 1870s para sa mga typewriter - at ang mahusay na kasanayan sa pag-type ay mahalaga pa rin para sa mga programmer ngayon! Ang pangkalahatang daloy ng laro ay ganito:
```mermaid
flowchart TD
A[Player clicks Start] --> B[Random quote displays]
B --> C[Player types in textbox]
C --> D{Word complete?}
D -->|Yes| E[Highlight next word]
D -->|No| F{Correct so far?}
F -->|Yes| G[Keep normal styling]
F -->|No| H[Show error styling]
E --> I{Quote complete?}
I -->|No| C
I -->|Yes| J[Show success message with time]
G --> C
H --> C
```
**Narito kung paano gumagana ang ating laro:**
- **Nagsisimula** kapag nag-click ang manlalaro sa start button at nagpapakita ng random na quote
- **Sinusubaybayan** ang progreso ng pag-type ng manlalaro word by word sa real-time
- **Ine-highlight** ang kasalukuyang salita upang gabayan ang pokus ng manlalaro
- **Nagbibigay** ng agarang visual na feedback para sa mga error sa pag-type
- **Kinakalkula** at ipinapakita ang kabuuang oras kapag natapos ang quote
Gawin natin ang ating laro, at matutunan ang tungkol sa mga event!
### File structure
Bago tayo magsimulang mag-code, mag-organisa muna tayo! Ang pagkakaroon ng malinis na file structure mula sa simula ay makakatulong sa iyo na maiwasan ang sakit ng ulo sa hinaharap at gawing mas propesyonal ang iyong proyekto. 😊
Panatilihin natin itong simple gamit ang tatlong file lamang: `index.html` para sa istruktura ng ating pahina, `script.js` para sa lahat ng logic ng ating laro, at `style.css` upang gawing maganda ang lahat. Ito ang klasikong trio na nagpapatakbo sa karamihan ng web!
**Gumawa ng bagong folder para sa iyong trabaho sa pamamagitan ng pagbukas ng console o terminal window at pag-type ng sumusunod na command:**
```bash
# Linux or macOS
mkdir typing-game && cd typing-game
# Windows
md typing-game && cd typing-game
```
**Narito ang ginagawa ng mga command na ito:**
- **Gumagawa** ng bagong direktoryo na tinatawag na `typing-game` para sa mga file ng iyong proyekto
- **Nag-navigate** sa bagong likhang direktoryo nang awtomatiko
- **Nagse-set up** ng malinis na workspace para sa iyong game development
**Buksan ang Visual Studio Code:**
```bash
code .
```
**Ang command na ito:**
- **Nagla-launch** ng Visual Studio Code sa kasalukuyang direktoryo
- **Binubuksan** ang folder ng iyong proyekto sa editor
- **Nagbibigay** ng access sa lahat ng development tools na kakailanganin mo
**Magdagdag ng tatlong file sa folder sa Visual Studio Code na may mga sumusunod na pangalan:**
- `index.html` - Naglalaman ng istruktura at nilalaman ng iyong laro
- `script.js` - Humahawak sa lahat ng logic ng laro at event listeners
- `style.css` - Nagde-define ng visual na hitsura at styling
## Gumawa ng user interface
Ngayon, gawin natin ang stage kung saan magaganap ang lahat ng aksyon ng ating laro! Isipin ito na parang pagdidisenyo ng control panel para sa isang spaceship - kailangan nating tiyakin na ang lahat ng kailangan ng ating mga manlalaro ay nasa lugar kung saan nila ito inaasahan.
Alamin natin kung ano ang talagang kailangan ng ating laro. Kung ikaw ay naglalaro ng typing game, ano ang gusto mong makita sa screen? Narito ang mga kailangan natin:
| UI Element | Layunin | HTML Element |
|------------|---------|-------------|
| Quote Display | Nagpapakita ng text na ita-type | `
` na may `id="quote"` |
| Message Area | Nagpapakita ng status at success messages | `
` na may `id="message"` |
| Text Input | Kung saan nagta-type ang mga manlalaro ng quote | `` na may `id="typed-value"` |
| Start Button | Nagsisimula ng laro | `