You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
Web-Dev-For-Beginners/translations/km/6-space-game/4-collision-detection/README.md

767 lines
59 KiB

This file contains invisible Unicode characters!

This file contains invisible Unicode characters that may be processed differently from what appears below. If your use case is intentional and legitimate, you can safely ignore this warning. Use the Escape button to reveal hidden characters.

# រៀបចំហ្គេមអាកាស Part 4: បន្ថែមកាំភ្លើងឡាស៊ែរ និងរកមើលការប៉ះទង្គิច
```mermaid
journey
title នាយដំណើរការរកឃើញការប៉ះទង្គិចរបស់អ្នក
section មូលដ្ឋានរបស់រូបវិទ្យា
យល់ដឹងពីប្រអប់បញ្ជាក់: 3: Student
រៀនគណិតវិទ្យាផ្លូវកាត់: 4: Student
យល់ដឹងអំពីប្រព័ន្ធកូអរដោនេ: 4: Student
section យន្តការមេកានិចហ្គេម
អនុវត្តការបាញ់បន្លឺឡេស៊ែរ: 4: Student
បន្ថែមជីវិតវត្ថុ: 5: Student
បង្កើតច្បាប់ការប៉ះទង្គិច: 5: Student
section ការរួមបញ្ចូលប្រព័ន្ធ
សាងសង់ការស្កេនរកឃើញការប៉ះទង្គិច: 5: Student
បង្កើនប្រសិទ្ធភាព: 5: Student
ផ្ទៀងផ្ទាត់ប្រព័ន្ធអន្តរកម្ម: 5: Student
```
## ប្រឡងមុនម៉ោងបង្រៀន
[ប្រឡងមុនម៉ោងបង្រៀន](https://ff-quizzes.netlify.app/web/quiz/35)
គិតអំពីវិនាទីនៅក្នុងរឿង Star Wars ពេលដែលមុទ្ទផលិតផលប្រូតុងរបស់ Luke ប្រហែស ទៅកាន់ទីតាំងដំណក់ដង្ហើមនៃ Death Star។ ការរកឃើញប៉ះទង្គិចច្បាស់លាស់នេះបានប្តូរទិស នៃจักรวាល! ក្នុងហ្គេម ការរកឃើញប៉ះទង្គិចមានដំណើរការដូចគ្នា - វាកំណត់ថា ពេលណាឯកតានានាផ្គូរផ្គងគ្នា ហើយអ្វីដែលត្រូវធ្វើបន្ទាប់។
នៅមេរៀននេះ អ្នកនឹងបន្ថែមអាវុធឡាស៊ែរ ទៅក្នុងហ្គេមអាកាសរបស់អ្នក និងអនុវត្តការរកឃើញប៉ះទង្គិច ដូចជាអ្នករៀបចំ បេសកកម្ម NASA គណនាផ្លូវគណនាកាននៃយានយន្តដើម្បីជៀសវាងសំណល់ អ្នកនឹងរៀនដឹងពីពេលណាឯកតានានាទៅប៉ះគ្នា។ យើងនឹងបំបែកដំណើរការនេះជាជំហ៊ានតូចៗដែលត្រូវចាំបាច់រួមគ្នា។
នៅចុងមេរៀន អ្នកនឹងមានប្រព័ន្ធការប្រយុទ្ធដែលដំណើរការ ដោយកាំភ្លើងឡាស៊ែរ សំរាកភ្លើងសត្រូវ ហើយការប៉ះទង្គិចបណ្តាលឲ្យមានព្រឹត្តិការណ៍ហ្គេម។ 원칙ការរកមើលប៉ះទង្គិចទាំងនេះក៏ត្រូវបានប្រើប្រាស់ក្នុងអ្វីគ្រប់យ៉ាងចាប់ពីសម្រង់ផ្នែករូបវិទ្យាដល់ចំណុចបញ្ចូលគេហទំព័របង្រៀន។
```mermaid
mindmap
root((ការស្វែងរកការប៉ះទង្គិច))
Physics Concepts
សំបកត្រីកោណ
ការប្រឡងប្រកួតចំណុចត្រូវគ្នា
ប្រព័ន្ធកំណត់អក្ខរ
ត្រឹមត្រូវបំបែក
Game Objects
ខ្នាតបាញ់ប្រហារលាស៊ែរ
ទូកសត្រូវ
តួអង្គវីរបុរស
តំបន់ប៉ះទង្គិច
Lifecycle Management
ការបង្កើតវត្ថុ
ការអាប់ដេតចលនា
ទំនាក់ទំនងការបំផ្លាញ
ការសម្អាតអង្គចងចាំ
Event Systems
ការបញ្ចូលក្តារចុច
ព្រឹត្តិការណ៍ប៉ះទង្គិច
ការផ្លាស់ប្តូររដ្ឋហ្គេម
ផលប៉ះពាល់សម្លេង/ទស្សន៍
Performance
គណិតវិទ្យាដែលមានប្រសិទ្ធភាព
ការបង្កើនអត្រាស៊ុម
ការគ្រប់គ្រងអង្គចងចាំ
ការបំបែកលំនាំបន្តិច
```
✅ ស្វែងយល់បន្តិចអំពីហ្គេមកុំព្យូទ័រដំបូងបំផុតដែលបានសរសេរ។ តើមុខងារ​របស់វាជាអ្វី?
## ការរកមើលប៉ះទង្គិច
ការរកឃើញប៉ះទង្គិចដំណើរការដូចឧបករណ៍ចុះជិតនៅលើយានអូរ Apollo - វាប្រមានចម្ងាយជាប្រចាំ ហើយបញ្ចាប់សញ្ញាប្រការណ៍ពេលវត្ថុទៅចំណីជិតគ្នា។ ក្នុងហ្គេម ប្រព័ន្ធនេះកំណត់ពេលណាឯកតានានាប៉ះគ្នា ហើយអ្វីគួរធ្វើបន្ទាប់។
វិធីសាស្ត្រដែលយើងប្រើ គឺកំណត់គ្រប់ឯកតាហ្គេមជា ដុំពត់សមមាត្រជាការ​ដូចពណ៌មួយ ស្រដៀងនឹងប្រព័ន្ធគ្រប់គ្រងចរាចរណាក្នុងយន្តហោះ ដែលប្រើរាងកៅស៊ូសាមញ្ញក្នុងការតាមដានយន្តហោះ។ វិធីនេះមើលទៅមូលដ្ឋាន ប៉ុន្តែមានប្រសិទ្ធភាពគណនា និង ធ្វើការ​បានល្អសម្រាប់ស្ថានភាពហ្គេមភាគច្រើន។
### តំណាងរូបត្រីកោណ
គ្រប់ឯកតាហ្គេមត្រូវការបណ្តោយកំណត់តួអង្គ ដូចដូចរថយន្ត Mars Pathfinder ដែលបានបញ្ជាក់ទីតាំងនៅផ្ទៃដីភពភាគច្រើន។ នេះជាទីតាំងបណ្តោយទាំងនេះ:
```mermaid
flowchart TD
A["🎯 វត្ថុហ្គេម"] --> B["📍 ទីតាំង (x, y)"]
A --> C["📏 ទំហំ (ទទឹង, កម្ពស់)"]
B --> D["ខាងលើ: y"]
B --> E["ខាងឆ្វេង: x"]
C --> F["ខាងក្រោម: y + កម្ពស់"]
C --> G["ខាងស្តាំ: x + ទទឹង"]
D --> H["🔲 ខ្នាតសត្វការ៉េ"]
E --> H
F --> H
G --> H
H --> I["រួចរាល់សម្រាប់ស្វែងរកការប៉ះទង្គិច"]
style A fill:#e3f2fd
style H fill:#e8f5e8
style I fill:#fff3e0
```
```javascript
rectFromGameObject() {
return {
top: this.y,
left: this.x,
bottom: this.y + this.height,
right: this.x + this.width
}
}
```
**យើងបំបែកនេះ៖**
- **គូសខាងលើ**: នេះគឺជាទីតាំងចាប់ផ្តើមនៃវត្ថុរបស់អ្នកនៅផ្ទាល់ទ្រង់ទ្រាយការឆ្វេង (ទីតាំង y)
- **គូសខាងឆ្វេង**: ទីតាំងចាប់ផ្តើមនៅផ្ទាំងរយ (ទីតាំង x)
- **គូសខាងក្រោម**: បូកទទឹងជាមួយទីតាំង y ដើម្បីដឹងទីតាំងបញ្ចប់!
- **គូសខាងស្ដាំ**: បូកទទឹងជាមួយទីតាំង x ដើម្បីមានដែនកំណត់ពេញលេញ
### អាល់ហ្គរីធម៍ទំនាក់ទំនង
ការរកធ្ងន់ធ្ងរសៀគ្វីដុំពត់ប្រើហើបឡេ Hubble ដើម្បីកំណត់ថាវត្ថុក្រោមព្រមានឬទេក្នុងដែនមេឃរបស់វា។ អាល់ហ្គរីធម៍ពិនិត្យការផ្ទុះចេញ:
```mermaid
flowchart LR
A["ប្រវត្ដិ ១"] --> B{"ការប្រឡែងចំណែក"}
C["ប្រវត្ដិ ២"] --> B
B --> D["ឆ្វង២ ខាងឆ្វេង > ឆ្វង១ ខាងស្តាំ?"]
B --> E["ឆ្វង២ ខាងស្តាំ < ឆ្វង១ ខាងឆ្វេង?"]
B --> F["ឆ្វង២ ខាងលើ > ឆ្វង១ ខាងក្រោម?"]
B --> G["ឆ្វង២ ខាងក្រោម < ឆ្វង១ ខាងលើ?"]
D --> H{"មានមួយណាត្រឹមត្រូវទេ?"}
E --> H
F --> H
G --> H
H -->|បាទ| I["❌ មិនមានការប៉ះទង្គិច"]
H -->|ទេ| J["✅ បានរកឃើញការប៉ះទង្គិច"]
style B fill:#e3f2fd
style I fill:#ffebee
style J fill:#e8f5e8
```
```javascript
function intersectRect(r1, r2) {
return !(r2.left > r1.right ||
r2.right < r1.left ||
r2.top > r1.bottom ||
r2.bottom < r1.top);
}
```
**ការតេស្តការបំបែកដូចប្រព័ន្ធរ៉ាឌាដូចជា:**
- តើដុំពត់ទី២ ស្ថិតនៅស្ដាំយ៉ាងសុពលភាព នៃដុំពត់ទី១?
- តើដុំពត់ទី២ ស្ថិតនៅឆ្វេងយ៉ាងសុពលភាព នៃដុំពត់ទី១?
- តើដុំពត់ទី២ ស្ថិតនៅខាងក្រោមយ៉ាងសុពលភាព នៃដុំពត់ទី១?
- តើដុំពត់ទី២ ស្ថិតនៅខាងលើយ៉ាងសុពលភាព នៃដុំពត់ទី១?
ប្រសិនបើគ្មានលក្ខខណ្ឌណាដូចខាងលើមួយណានោះទេ ដុំពត់ទាំងពីរត្រូវមានការប៉ះទង្គិចគ្នា។ វិធីនេះស្រដៀងនឹងការបុគ្គលិករ៉ាឌាដែលកំណត់ថាតើយន្តហោះពីរមានចម្ងាយគ្រប់គ្រាន់ទេទេ។
## គ្រប់គ្រងវដ្តវត្ថុ
ពេលកាំភ្លើងឡាស៊ែរជ្រុះលើសត្រូវ វត្ថុទាំងពីរត្រូវបានលុបចេញពីហ្គេម។ ទោះជាយ៉ាងណា ការលុបវត្ថុកណ្តាលវដ្តអាចបណ្តាលឲ្យបញ្ហាហួសប្រើ - ជាបទពិសោធន៍ពីប្រព័ន្ធកុំព្យូទ័រដូច Apollo Guidance Computer ។ ជំនួស យើងប្រើវិធី "សម្គាល់សម្រាប់លុប" ដែលលុបវត្ថុដោយសុវត្ថិភាពនៅចន្លោះវដ្ត។
```mermaid
stateDiagram-v2
[*] --> Active: វត្ថុបានបង្កើត
Active --> Collided: មានការច៉ộcប៉ះបានស្គាល់
Collided --> MarkedDead: កំណត់ dead = true
MarkedDead --> Filtered: ស៊ុមបន្ទាប់
Filtered --> [*]: វត្ថុបានយកចេញ
Active --> OutOfBounds: បាត់ពីអេក្រង់
OutOfBounds --> MarkedDead
note right of MarkedDead
សុវត្ថិភាពក្នុងការបន្ត
ស៊ុម​បច្ចុប្បន្ន
end note
note right of Filtered
វត្ថុដែលបានយកចេញ
រវាងស៊ុម
end note
```
នេះជាវិធីសម្គាល់របស់យើងសម្រាប់លុបមួយវត្ថុ:
```javascript
// សម្គាល់វត្ថុសម្រាប់ការដកចេញ
enemy.dead = true;
```
**ហេតុអ្វីបានជាវិធីនេះបានល្អ:**
- យើងសម្គាល់វត្ថុជា "ស្លាប់" ប៉ុន្តែមិនលុបវានោះទេ
- វាអនុញ្ញាតឲ្យវដ្តហ្គេមបច្ចុប្បន្នបញ្ចប់ដោយសុវត្ថិភាព
- គ្មានការបញ្ហាហួសប្រើ ពីការប្រើវត្ថុដែលបានទៅរួចហើយ!
បន្ទាប់មកច្រកយកវត្ថុដែលមិនត្រូវបានសម្គាល់សម្រាប់លុបមុនម៉ោងបង្ហាញបន្ទាប់:
```javascript
gameObjects = gameObjects.filter(go => !go.dead);
```
**ការចំនេញនេះធ្វើដូចជា:**
- បង្កើតបញ្ជីថ្មីមានតែនៅវត្ថុ "រស់"
- បាត់បង់វត្ថុដែលសម្គាល់សម្រាប់លុប
- រក្សាហ្គេមរបស់អ្នកឲ្យរលូន
- ការពារបញ្ហាស្តុកម៉េម៉ូរីពីវត្ថុដែលខូចខាត និងចំណុះជាច្រើន
## អនុវត្តមេកានិចឡាស៊ែរ
គ្រាប់កាំភ្លើងឡាស៊ែរ ក្នុងហ្គេមដើរតាមគោលការណ៍ដូចទូតភីតុងក្នុង Star Trek - វាជាវត្ថុបាត់បង់ដែលធ្វើដំណើរជាលំនាំត្រង់រហូតដល់វាប៉ះភាគីណាមួយ។ រាល់ការចុច spacebar បង្កើតវត្ថុលាស៊ែរ ថ្មីមួយ ដែលផ្លាស់ទីលើអេក្រង់។
ដើម្បីឲ្យវាដំណើរការ យើងត្រូវសម្របសម្រួលប៉ុន្មានផ្នែកផ្សេងៗ៖
**បន្ទាប់បន្សំគួររៀន:**
- **បង្កើត** អ្នកតំណាងឡាស៊ែរ ដែលផលិតពីទីតាំងវីរបុរស
- **គ្រប់គ្រង** ការបញ្ចូលក្តារចុច ដើម្បីបង្កើតឡាស៊ែរ
- **គ្រប់គ្រង** ចលនា និងវដ្តជីវិតឡាស៊ែរ
- **បង្កើត** ការពិពណ៌នាភ្នែកងាររបស់គ្រាប់បែកឡាស៊ែរ
## អនុវត្តការត្រួតពិនិត្យអត្រាវាយបាញ់
អត្រាវាយបាញ់មិនមានកំណត់នឹងទំនាក់ទំនងម៉ាស៊ីនហ្គេម ហើយធ្វើឲ្យហ្គេមងាយពេកក្នុងការលេង។ ប្រព័ន្ធអាវុធពិតប្រាកដក៏មានកំណត់ដូចគ្នា - បែបផែនកាំភ្លើង phaser នៃ USS Enterprise ត្រូវពេលឆក់ថ្មម្ដងម្កាល។
យើងនឹងអនុវត្តប្រព័ន្ធ cooldown ដែលបញ្ឈប់ការបាញ់ដ៏រហ័សរហួន ក្នុងខណៈដែលរក្សាការត្រួតពិនិត្យឆ្លើយតបបាន៖
```mermaid
sequenceDiagram
participant Player
participant Weapon
participant Cooldown
participant Game
Player->>Weapon: ចុច Spacebar
Weapon->>Cooldown: ផ្ទៀងផ្ទាត់ថាគ្រឿងដែកត្រជាក់
alt គ្រឿងដែកត្រៀមរួចហើយ
Cooldown->>Weapon: ត្រជាក់ = ពិត
Weapon->>Game: បង្កើតកាំភ្លើងឡាស៊ែរ
Weapon->>Cooldown: ចាប់ផ្តើមពេលត្រជាក់ថ្មី
Cooldown->>Cooldown: ត្រជាក់ = ទេ
Note over Cooldown: រង់ចាំ ៥០០មីលិសេកុង
Cooldown->>Cooldown: ត្រជាក់ = ពិត
else គ្រឿងដែកកំពុងត្រជាក់
Cooldown->>Weapon: ត្រជាក់ = ទេ
Weapon->>Player: គ្មានសកម្មភាព
end
```
```javascript
class Cooldown {
constructor(time) {
this.cool = false;
setTimeout(() => {
this.cool = true;
}, time);
}
}
class Weapon {
constructor() {
this.cooldown = null;
}
fire() {
if (!this.cooldown || this.cooldown.cool) {
// បង្កើតគ្រាប់ពន្លឺឡាស៊ែរ
this.cooldown = new Cooldown(500);
} else {
// អាវុធកំពុងត្រជាក់ទៅវិញ
}
}
}
```
**របៀប cooldown ដំណើរការ:**
- នៅពេលបង្កើត សំពាធសញ្ជាតិ "ក្តៅ" (មិនអាចបាញ់បានទេ)
- បន្ទាប់ពីពេលវេលាបញ្ចប់ វាប្រែទៅ "ត្រជាក់" (រួចរាល់បាញ់)
- មុនពេលបាញ់ យើងពិនិត្យថា: "អាវុធត្រជាក់ទេ?"
- វាបញ្ឈប់ការចុចតែច្រើនបន្ទាន់ ប៉ុន្តែក៏រក្សាការត្រួតពិនិត្យឆ្លើយតបបាន
✅ អនុវត្តទៅមេរៀនទី 1 ក្នុងបណ្ដុំហ្គេមអាកាស ដើម្បីចងចាំអំពី cooldowns។
## រៀបចំប្រព័ន្ធប៉ះទង្គិច
អ្នកនឹងពង្រីកកូដហ្គេមអាកាសដែលមានរួចជាមួយប្រព័ន្ធសម្គាល់ប៉ះទង្គិច។ ដូចប្រព័ន្ធជៀសវាងប៉ះទង្គិចស្វ័យប្រវត្តិ​នៃស្ថានីយអាកាសអន្តរជាតិ កម្មវិធីហ្គេមរបស់អ្នក នឹងត្រួតពិនិត្យទីតាំងវត្ថុជាបន្តបន្ទាប់ ហើយឆ្លើយតបពេលមានការប៉ះទង្គិច។
ចាប់ផ្តើមពីកូដមេរៀនមុន អ្នកនឹងបន្ថែមការសម្គាល់ប៉ះទង្គិចជាមួយនឹងច្បាប់បញ្ជាក់ដែលគ្រប់គ្រងការផ្គួផ្គងវត្ថុ។
> 💡 **ចំណាត់ថ្នាក់ជំនាញ**: រូបតំណាងឡាស៊ែរ មានរួចក្នុងថត assets របស់អ្នកហើយបានយោងក្នុងកូដរបស់អ្នក រៀបចំរួចហើយសម្រាប់អនុវត្ត។
### ច្បាប់ប៉ះទង្គិចដែលត្រូវអនុវត្ត
**មេកានិកហ្គេមដែលត្រូវបន្ថែម:**
1. **ឡាស៊ែរ​ផៅសត្រូវ**: វត្ថុសត្រូវត្រូវបានបំបែកនៅពេលបាញ់ដោយគ្រាប់ឡាស៊ែរ
2. **ឡាស៊ែរ​ផៅដែនអេក្រង់**: ដុតកាំភ្លើងឡាស៊ែរ ត្រូវបានដកចេញ នៅពេលពួកវាទៅដល់កំពូលអេក្រង់
3. **ប៉ះទង្គិចសត្រូវ និងវីរបុរស**: វត្ថុទាំងពីរត្រូវបំបែក នៅពេលប៉ះគ្នា
4. **សត្រូវមកដល់ផ្ទៃក្រោម**: ថ្ងៃបញ្ចប់ហ្គេមនៅពេលសត្រូវដល់ផ្ទៃក្រោមអេក្រង់
### 🔄 **ការត្រួតពិនិត្យផ្នែកបង្រៀន**
**មូលដ្ឋានការរកមើលប៉ះទង្គិច**៖ មុនអនុវត្ត ប្រាកដថាអ្នកយល់ពី៖
- ✅ របៀបកំណត់ដែនកំណត់ដុំពត់
- ✅ មូលហេតុដែលការ​តេស្ត​បំបែក​លឿនជាងគណនា​ចំណុច​ឆ្លង
- ✅ សារៈសំខាន់នៃការគ្រប់គ្រងវដ្តវត្ថុក្នុងល្បែង
- ✅ របៀប​ការត្រួតពិនិត្យសកម្មភាពត្រូវរួមគ្នា
**តេស្តមួយទឹក**៖ តើអ្វីនឹងកើតឡើងប្រសិនបើអ្នកលុបវត្ថុភ្លាមៗវិញមិនបានសម្គាល់?
*ចម្លើយ៖ ការលុបកណ្តាលវដ្តអាចបណ្តាលឲ្យប្រព័ន្ធផ្ទាំងខូចពីរបៀបឬរំលងម្ដងទៀត*
**ការយល់ដឹងពីរូបវិទ្យា**៖ អ្នកឥឡូវនេះយល់ពី
- **ប្រព័ន្ធតម្រុយ**៖ របៀបកំណត់ទីតាំងនិងទំហំក្នុងដែនកំណត់
- **ហេតុផលចំណុចឆ្លង**៖ គោលការណ៍គណិតវិទ្យាមូលដ្ឋានសម្រាប់ការសម្គាល់ប៉ះទង្គិច
- **បង្កើនប្រសិទ្ធភាព**៖ ហេតុអ្វីការវិភាគលឿនមានសារៈសំខាន់នៅប្រព័ន្ធពេលតែមួយ
- **គ្រប់គ្រងម៉េម៉ូរី**៖ លំនាំប្រព័ន្ធរបស់វត្ថុសម្រាប់សុវត្ថិភាព
## រៀបចំបរិយាកាសអភិវឌ្ឍន៍របស់អ្នក
ដំណឹងល្អ - យើងបានរៀបចំផ្ទៃក្រោមសម្រាប់អ្នករួចហើយ! គ្រប់គ្រងហ្គេម និងរចនាសម្ព័ន្ធមូលដ្ឋានរបស់អ្នករង់ចាំនៅក្នុងថត `your-work` ហើយរួចរាល់សម្រាប់អ្នកបន្ថែមលក្ខណៈប៉ះទង្គិចបែបថ្មី។
### រចនាសម្ព័ន្ធគម្រោង
```bash
-| assets
-| enemyShip.png
-| player.png
-| laserRed.png
-| index.html
-| app.js
-| package.json
```
**ការយល់ពីរចនាសម្ព័ន្ធឯកសារ៖**
- **រួមមាន** រូបភាព sprite ទាំងអស់ដែលត្រូវការសម្រាប់វត្ថុហ្គេម
- **រួមបញ្ចូល** ឯកសារ HTML មេ និងឯកសារកម្មវិធី JavaScript
- **ផ្ដល់** កម្មវិធីកំណត់កញ្ចប់សម្រាប់ម៉ាស៊ីនបម្រើអភិវឌ្ឍន៍ក្នុងមូលដ្ឋាន
### ចាប់ផ្តើមម៉ាស៊ីនបម្រើអភិវឌ្ឍន៍
ចូលទៅក្នុងថតគម្រោងហើយចាប់ផ្តើមម៉ាស៊ីនបម្រើក្នុងមូលដ្ឋាន៖
```bash
cd your-work
npm start
```
**សំណុំបញ្ជា​នេះ៖**
- **ប្ដូរទីតាំងទៅ** ថតគម្រោងរបស់អ្នក
- **ចាប់ផ្តើម** ម៉ាស៊ីនបម្រើ HTTP ក្នុងផ្ទៃក្នុង `http://localhost:5000`
- **បម្រើ** ឯកសារហ្គេមរបស់អ្នក សម្រាប់ការធ្វើតេស្ត និងអភិវឌ្ឍន៍
- **បើក** អភិវឌ្ឍន៍បន្តពេលវេលាដោយឡើយបិទកំណត់
បើកកម្មវិធីរុករកហើយចូលទៅកាន់ `http://localhost:5000` ដើម្បីមើលស្ថានភាពហ្គេមបច្ចុប្បន្ន ដែលមានវីរបុរស និងសត្រូវបង្ហាញលើអេក្រង់។
### អនុវត្តជំហាន​ដោយ​ជំហាន
ដូចយុទ្ធសាស្រ្ត NASA បញ្ចូលកម្មវិធី Voyager រៀបចំយ៉ាងយកចិត្តទុកដាក់ យើងនឹងអនុវត្តការរកមើលប៉ះទង្គិច ដំណើរការជាជំហ៊ានតូចៗ។
```mermaid
flowchart TD
A["១. រង្វាស់ជុំវិញស្របបន្ទាត់"] --> B["២. ការរកឃើញចំណុចឆ្លុះឡើងវិញ"]
B --> C["៣. ប្រព័ន្ធកាំរស្មី"]
C --> D["៤. ការគ្រប់គ្រងព្រឹត្តិការណ៍"]
D --> E["៥. នីតិវិធីប៉ះស្និទ្ធ"]
E --> F["៦. ប្រព័ន្ធពេលវេលាដំណើរការ"]
G["ព្រំដែនវត្ថុ"] --> A
H["រូបមន្តរូបវិទ្យា"] --> B
I["ការបង្កើតគ្រាប់ផ្ដោះ"] --> C
J["ការបញ្ចូលក្តារចុច"] --> D
K["តុល្យភាពហ្គេម"] --> E
L["ការកំណត់អត្រា"] --> F
F --> M["🎮 ហ្គេមពេញលេញ"]
style A fill:#e3f2fd
style B fill:#e8f5e8
style C fill:#fff3e0
style D fill:#f3e5f5
style E fill:#e0f2f1
style F fill:#fce4ec
style M fill:#e1f5fe
```
#### 1. បន្ថែមដែនកំណត់ដុំពត់
ជាមុនសិន យើងចង់បង្រៀនឲ្យវត្ថុហ្គេមអធិប្បាយពីដែនកំណត់របស់វា។ បន្ថែមវិធីសាស្រ្តនេះទៅថ្នាក់ `GameObject` របស់អ្នក៖
```javascript
rectFromGameObject() {
return {
top: this.y,
left: this.x,
bottom: this.y + this.height,
right: this.x + this.width,
};
}
```
**វិធីសាស្រ្តនេះធ្វើការ:**
- **បង្កើត** វត្ថុដុំពត់ដែលមានតំណាងទំហំដែនកំណត់ច្បាស់លាស់
- **គណនា** គូសខាងក្រោម និងស្ដាំដោយគិតទីតាំង និងទំហំ
- **ត្រឡប់** វត្ថុដែលមានសម្រាប់អាល់ហ្គរីធម៍សម្គាល់ប៉ះទង្គិច
- **ផ្ដល់** ចំណុចប្រទាក់ផ្ទាល់កំណត់សម្រាប់គ្រប់វត្ថុនៅក្នុងហ្គេម
#### 2. អនុវត្តការសម្គាល់ការប៉ះពាល់
ឥឡូវនេះ អ្នកត្រូវបង្កើតឱ្យមានមូលដ្ឋានសម្គាល់ប៉ះទង្គិច - មុខងារ​ដែលស្គាល់ពេលឯកតាដុំពត់ពីរប៉ះទំនាក់ទំនងគ្នា៖
```javascript
function intersectRect(r1, r2) {
return !(
r2.left > r1.right ||
r2.right < r1.left ||
r2.top > r1.bottom ||
r2.bottom < r1.top
);
}
```
**អាល់ហ្គរីធម៍នេះធ្វើការ:**
- **តេស្ត** លក្ខខណ្ឌបំបែកចំនួនបួន រវាងដុំពត់ទាំងពីរ
- **ត្រឡប** `false` ប្រសិនបើលក្ខខណ្ឌបំបែកណាមួយមានសុពលភាព
- **បញ្ជាក់** ករណីប៉ះទង្គិច ពេលគ្មានការបំបែក
- **ប្រើ** យុទ្ធសាស្ត្របដិសេធសំណួរ សម្រាប់ការរកដំណើរការលឿន
#### 3. អនុវត្តប្រព័ន្ធបាញ់កាំភ្លើងឡាស៊ែរ
នេះជាពេលវេលាទីកន្លែងរំភើប! គេរៀបចំប្រព័ន្ធបាញ់កាំភ្លើងឡាស៊ែរ។
##### អថេរចំណារផ្ញើសារ
ជាមុនសិន ចង់កំណត់ប្រភេទសារជាច្រើន ដើម្បីផ្នែកផ្សេងៗនៃហ្គេមរបស់យើងអាចផ្ញើការប្រាស្រ័យទាក់ទងគ្នា៖
```javascript
KEY_EVENT_SPACE: "KEY_EVENT_SPACE",
COLLISION_ENEMY_LASER: "COLLISION_ENEMY_LASER",
COLLISION_ENEMY_HERO: "COLLISION_ENEMY_HERO",
```
**អថេរចំណារទាំងនេះផ្ដល់:**
- **ធម្មតា** ឈ្មោះព្រឹត្តិការណ៍សកលទូទាំងកម្មវិធី
- **អនុញ្ញាត** ការប្រាស្រ័យទាក់ទងដោយរលូនរវាងប្រព័ន្ធហ្គេម
- **ការពារជៀសវាង** អក្សរពិចារណារហូតក្នុងការចុចចំរស់
##### ការគ្រប់គ្រងការបញ្ចូលដោយក្តារចុច
បន្ថែមការស្គាល់ចុច space នៅក្នុងអ្នកស្តាប់ព្រឹត្តិការណ៍ក្តារចុច៖
```javascript
} else if(evt.keyCode === 32) {
eventEmitter.emit(Messages.KEY_EVENT_SPACE);
}
```
**អ្នកដំណើរការបញ្ចូលនេះ:**
- **រកឃើញ** ការចុច space key ដោយប្រើ keyCode 32
- **បញ្ចូន** សារព្រឹត្តិការណ៍ប្រកបដោយស្តង់ដា
- **អនុញ្ញាត** ការបាញ់ដោយគ្មានការទំនាក់ទំនងផ្ទាល់លើក្តារចុច
##### ការចុះបញ្ជីអ្នកស្ដាប់ព្រឹត្តិការណ៍
ចុះបញ្ជីការបាញ់នៅក្នុងមុខងារ `initGame()` របស់អ្នក៖
```javascript
eventEmitter.on(Messages.KEY_EVENT_SPACE, () => {
if (hero.canFire()) {
hero.fire();
}
});
```
**អ្នកស្ដាប់ព្រឹត្តិការណ៍នេះ:**
- **ឆ្លើយតប** ការចុចក្តារតំណាក់តួសម្រាប់ space key
- **ពិនិត្យ** ស្ថានភាព cooldown មុនពេលអនុញ្ញាតបាញ់
- **បញ្ចេញ** ការបង្កើតឡាស៊ែរ នៅពេលអនុញ្ញាត
បន្ថែមការគ្រប់គ្រងប៉ះទង្គិចសម្រាប់ឡាស៊ែរ និងសត្រូវ:
```javascript
eventEmitter.on(Messages.COLLISION_ENEMY_LASER, (_, { first, second }) => {
first.dead = true;
second.dead = true;
});
```
**អ្នកគ្រប់គ្រងប៉ះទង្គិចនេះ:**
- **ទទួលយក** ទិន្នន័យព្រឹត្តិការណ៍ប៉ះទង្គិច មានវត្ថុទាំងពីរ
- **សម្គាល់** វត្ថុទាំងពីរឲ្យលុប
- **ធានា** ការសម្អាតត្រឹមត្រូវបន្ទាប់ពីប៉ះទង្គិច
#### 4. បង្កើតថ្នាក់ Laser
អនុវត្តគ្រាប់បាញ់ឡាស៊ែរ ដែលផ្លាស់ទីទៅលើ និងគ្រប់គ្រងវដ្តជីវិតរបស់វា៖
```javascript
class Laser extends GameObject {
constructor(x, y) {
super(x, y);
this.width = 9;
this.height = 33;
this.type = 'Laser';
this.img = laserImg;
let id = setInterval(() => {
if (this.y > 0) {
this.y -= 15;
} else {
this.dead = true;
clearInterval(id);
}
}, 100);
}
}
```
**ការអនុវត្តថ្នាក់នេះ:**
- **បន្ត** ពីថ្នាក់ GameObject ដើម្បីទទួលកម្មវិធីមូលដ្ឋាន
- **កំណត់** ទំហំសមរម្យសម្រាប់រូបតំណាងឡាស៊ែរ
- **បង្កើត** ចលនាឡើងជាប្រចាំដោយប្រើ `setInterval()`
- **គ្រប់គ្រង** ការរំលាយខ្លួនឯងនៅពេលទៅដល់កំពូលអេក្រង់
- **គ្រប់គ្រង** ពេលវេលាអនុវត្តន៍និងការសម្អាត
#### 5. អនុវត្តប្រព័ន្ធសម្គាល់ប៉ះទង្គិច
បង្កើតមុខងារសម្គាល់ប៉ះទង្គិចសរុប៖
```javascript
function updateGameObjects() {
const enemies = gameObjects.filter(go => go.type === 'Enemy');
const lasers = gameObjects.filter(go => go.type === "Laser");
// សាកល្បងការប៉ះទង្គិចរវាងបាញ់វាយសត្រូវ
lasers.forEach((laser) => {
enemies.forEach((enemy) => {
if (intersectRect(laser.rectFromGameObject(), enemy.rectFromGameObject())) {
eventEmitter.emit(Messages.COLLISION_ENEMY_LASER, {
first: laser,
second: enemy,
});
}
});
});
// ហែកវត្ថុដែលបានបំផ្លាញ
gameObjects = gameObjects.filter(go => !go.dead);
}
```
**ប្រព័ន្ធប៉ះទង្គិចនេះ:**
- **ត្រង់** វត្ថុហ្គេមតាមប្រភេទ ដើម្បីធ្វើតេស្តបានលឿន
- **តេស្ត** គ្រប់ឡាស៊ែរ ទល់នឹងសត្រូវសម្រាប់ចំណុចឆ្លង
- **បញ្ចេញ** ព្រឹត្តិការណ៍ប៉ះទង្គិច នៅពេលរកឃើញការ​ឆ្លង
- **សម្អាត** វត្ថុដែលបំផ្លាញបន្ទាប់ពីដំណើរការប៉ះទង្គិច
> ⚠️ **សំខាន់**៖ បន្ថែម `updateGameObjects()` ទៅវដ្តហ្គេមសំខាន់នៅក្នុង `window.onload` ដើម្បីបើកចំហប្រព័ន្ធសម្គាល់ប៉ះទង្គិច។
#### 6. បន្ថែមប្រព័ន្ធ cooldown ទៅថ្នាក់ Hero
បង្កើនថ្នាក់ Hero ជាមួយមេកានិចការបាញ់ និងការកំណត់អត្រា៖
```javascript
class Hero extends GameObject {
constructor(x, y) {
super(x, y);
this.width = 99;
this.height = 75;
this.type = "Hero";
this.speed = { x: 0, y: 0 };
this.cooldown = 0;
}
fire() {
gameObjects.push(new Laser(this.x + 45, this.y - 10));
this.cooldown = 500;
let id = setInterval(() => {
if (this.cooldown > 0) {
this.cooldown -= 100;
} else {
clearInterval(id);
}
}, 200);
}
canFire() {
return this.cooldown === 0;
}
}
```
**ការយល់ពីថ្នាក់ Hero បានបង្កើន:**
- **ចាប់ផ្ដើម** ម៉ោង cooldown ជាសូន្យ (រួចរាល់បាញ់)
- **បង្កើត** វត្ថុលាស៊ែរ ដែលមានទីតាំងលើទូកវីរបុរស
- **កំណត់** ពេល cooldown ដើម្បីទប់ស្កាត់ការបាញ់ឡើងលឿនពេក
- **កាត់បន្ថយ** ម៉ោង cooldown ដោយការអាប់ដេតប្រក្រតី
- **ផ្ដល់** មុខងារ `canFire()` សម្រាប់ពិនិត្យស្ថានភាពបាញ់
### 🔄 **ការត្រួតពិនិត្យផ្នែកបង្រៀន**
**ការយល់ដឹងសរុប**៖ ប្រាកដថាអ្នកចេះគ្រប់គ្រងប្រព័ន្ធប៉ះទង្គិច ៖
- ✅ របៀបដែនកំណត់ដុំពត់ជួយការសម្គាល់ប៉ះទង្គិចបានលឿន?
- ✅ ហេតុអ្វីការគ្រប់គ្រងវដ្តវត្ថុមានសារៈសំខាន់សម្រាប់ស្ថិរភាពហ្គេម?
- ✅ មុខងារ cooldown ព្យាបាលបញ្ហាប្រសិទ្ធភាពយ៉ាងដូចម្តេច?
- ✅ តើស្ថាបត្យកម្មធ្វើម៉េច គ្រប់គ្រងការឆ្លើយតបប៉ះទង្គិច?
**ការសម្របសម្រួលប្រព័ន្ធ**៖ អ្នកអាចបង្ហាញ៖
- **ភាពត្រឹមត្រូវគណិតវិទ្យា**៖ អាល់ហ្គរីធម៍ចំណុចឆ្លងដុំពត់
- **បង្កើនប្រសិទ្ធភាព**៖ រចនាសម្ព័ន្ធធ្វើតេស្តប៉ះទង្គិចលឿន
- **គ្រប់គ្រងម៉េម៉ូរី**៖ លំនាំសុវត្ថិភាពក្នុងការបង្កើតនិងបំផ្លាញវត្ថុ
- **ការត្រួតពិនិត្យឯកត្តកម្ម**៖ ការទាក់ទងគ្មានការចងខ្សែបន្ទាត់
- **ដំណើរការតាមពេលពិត**៖ ការអាប់ដេតប្រក្រតីចំពោះវដ្តហ្គេម
**លំនាំអាជីព**៖ អ្នកបានអនុវត្ត៖
- **ការបែងចែកភារកិច្ច**៖ ផ្នែករូបវិទ្យា ការបង្ហាញចេញ និងបញ្ចូល
- **រចនាមានវត្ថុអចិន្រ្តៃយ៍**៖ ការពង្រីក និងពហុរាង
- **ការគ្រប់គ្រងស្ថានភាព**៖ ការត្រួតពិនិត្យវដ្តជីវិតវត្ថុ និងស្ថានភាពហ្គេម
- **បង្កើនប្រសិទ្ធភាព**៖ អាល់ហ្គរីធម៍សម្រាប់ប្រព័ន្ធគំរូពេលវេលាពិត
### ពិនិត្យការអនុវត្តរបស់អ្នក
ហ្គេមអាកាសរបស់អ្នកឥឡូវ មានប្រព័ន្ធសម្គាល់ប៉ះទង្គិច និងមេកានិចប្រយុទ្ធល្អត្រង់។ 🚀 ថតសាកល្បងលទ្ធផលថ្មីៗនេះ៖
- **រុំរើ** ជាមួយក្តារចុចព្រួយដើម្បីពិនិត្យការគ្រប់គ្រងចលនា
- **បាញ់ឡាស៊ែរ** ជាមួយ spacebar - លាតត្រដាងថា cooldown ទប់ស្កាត់ការចុចហួសពេក
- **មើលការប៉ះទង្គិច** កាលណាកាំភ្លើងបាញ់សត្រូវ រំលាយវា
- **បញ្ជាក់ការសម្អាត** ពេលវត្ថុខូចភាពបាត់ពីហ្គេម
អ្នកបានអនុវត្តប្រព័ន្ធសម្គាល់ប៉ះទង្គិចដោយប្រើគោលការណ៍គណិតវិទ្យា ដូចកាលភាពដឹកនាំយានយន្តអាកាស និងរ៉ូបូទីក។
### ⚡ **អ្វីដែលអ្នកអាចធ្វើបានក្នុង 5 នាទីបន្ទាប់**
- [ ] បើក DevTools ខ្សែទាញចំណុចបំបែកក្នុងមុខងារសម្គាល់ប៉ះទង្គិចរបស់អ្នក
- [ ] សាកល្បងកំឡាំងល្បឿនឡាស៊ែរ ឬចលនាសត្រូវ ដើម្បីមើលផលប៉ះទង្គិច
- [ ] សាកល្បងតម្លៃ cooldown ផ្សេងៗ ដើម្បីតេស្តអត្រាបាញ់កាំភ្លើង
- [ ] បន្ថែម `console.log` ដើម្បីតាមដានព្រឹត្តិការណ៍ប៉ះទង្គិចពិតពេល
### 🎯 **អ្វីដែលអ្នកអាចសម្រេចបានក្នុងមួយម៉ោងនេះ**
- [ ] បញ្ចប់ប្រលងបន្ទាប់ពីមេរៀន និងយល់ដឹងអំពីអាល់ក្រីធម៍រកឃើញការប៉ះទង្គិច
- [ ] បន្ថែមអំពើវិជ្ជមានដូចជា​ភ្លើង​ផ្ទុះ​នៅពេលមានការប៉ះទង្គិច
- [ ] អនុវត្តប្រភេទគ្រាប់ផ្លេកផ្សេងៗដែលមានលក្ខណៈខុសគ្នា
- [ ] បង្កើតអំណាចបន្ថែមដែលបង្កើនសមត្ថភាពអ្នកលេងជាបណ្តោះអាសន្ន
- [ ] បន្ថែមសំឡេងផលប៉ះពាល់ដើម្បីធ្វើឲ្យការប៉ះទង្គិចមានភាពរំភើប
### 📅 **កម្មវិធីកម្មវិធីហ្គេមផ្ទាល់ខ្លួនរយៈពេលមួយសប្ដាហ៍**
- [ ] បញ្ចប់ហ្គេមខាងក្នុងផ្ទុយបរិយាយដោយប្រើប្រព័ន្ធប៉ះទង្គិចបានល្អ
- [ ] អនុវត្តរាងកាយប៉ះទង្គិចច្រើនជាងប្រអប់ (មូល, ភាគបន្ទាត់)
- [ ] បន្ថែមប្រព័ន្ធគ partículas សម្រាប់ប្រតិកម្មភ្លើងផ្ទុះមានភាពពិតប្រាកដ
- [ ] បង្កើតប្រព្រឹត្តិការណ៍គូប្រឆាំងស្មុគស្មាញដោយជៀសវាងការប៉ះទង្គិច
- [ ] បង្កើនប្រសិទ្ធភាពការរកឃើញការប៉ះទង្គិចសម្រាប់ការអនុវត្តមានវត្ថុជាច្រើន
- [ ] បន្ថែមការស្ទួចសំលេងដូចជាម៉ូម៉ង់តូម និងចលនាមានភាពពិតប្រាកដ
### 🌟 **ជំនាញហ្គេមផ្ទៃក្នុងខែរបស់អ្នក**
- [ ] បង្កើតហ្គេមជាមួយវិញ្ញាសា​ឧបករណ៍​បច្ចេកវិទ្យាឧបករណ៍ និងការស្ទួចសំលេងមានភាពពិតប្រាកដ
- [ ] រៀនអាល់ក្រីធម៍រកឃើញការប៉ះទង្គិច 3D និងការបែងចែកលំនៅទីតាំង
- [ ] មានចំណេះដឹងចូលរួមជួយឱ្យក្រុមបណ្តាញសៀវភៅហ្គេមនិងបណ្ណាល័យឧបករណ៍ប្រើប្រាស់សេរី
- [ ] ជំនាញបង្កើនប្រសិទ្ធភាពសម្រាប់កម្មវិធីផ្ទាំងក្រាហ្វិចច្របូកច្របល់
- [ ] បង្កើតមាតិកាសិក្សាអំពីហ្គេមផ្ទៃក្នុងនិងការរកឃើញការប៉ះទង្គិច
- [ ] បង្កើតកុងតាក់តាមបែបportfolio ដើម្បីបង្ហាញជំនាញកម្មវិធីហ្គេមជំនាញខ្ពស់
## 🎯 កាលវិភាគជំនាញការរកឃើញការប៉ះទង្គិចរបស់អ្នក
```mermaid
timeline
title ការសិក្សាការរកឃើញការប៉ះទង្គិច និងរូបវិទ្យាហ្គេម
section មូលដ្ឋាន (10 នាទី)
Rectangle Math: ប្រព័ន្ធសមីការជាផ្ចិត
: គណនាដែនកំណត់
: តាមដានទីតាំង
: គ្រប់គ្រងវិមាត្រ
section ការរចនាអាល់គូរីធម៌ (20 នាទី)
Intersection Logic: ការធ្វើតេស្តការបង្ហាញ
: ការរកឃើញការអាប់ឡាប់
: ការបង្កើនប្រសិទ្ធភាព
: ការដោះស្រាយករណីជម្រាល
section ការអនុវត្តហ្គេម (30 នាទី)
Object Systems: ការគ្រប់គ្រងជីវិត
: ការសម្របសម្រួលព្រឹត្តិការណ៍
: តាមដានស្ថានភាព
: ការសម្អាតអង្គចងចាំ
section លក្ខណៈអន្តរកម្ម (40 នាទី)
Combat Mechanics: ប្រព័ន្ធគ្រាប់បែក
: ការកម្តៅអាវុធ
: ការគណនាគ្រោះថ្នាក់
: មតិយោបល់វិស្វកម្ម
section រូបវិទ្យាជំនាញខ្ពស់ (50 នាទី)
Real-time Systems: ការបង្កើនសមត្ថភាពអត្រាស៊ឺរផ្រេម
: ការបែងចែកទំហំតំបន់
: ប្រតិកម្មការប៉ះទង្គិច
: ការសមីការរូបវិទ្យា
section បច្ចេកទេសវិជ្ជាជីវៈ (1 សប្ដាហ៍)
Game Engine Concepts: ប្រព័ន្ធមុខងារ
: ស៊ុមរូបវិទ្យា
: ការវិភាគប្រសិទ្ធភាព
: ការបង្កើនសមត្ថភាពក្រៅវេទិកា
section ការអនុវត្តឧស្សាហកម្ម (1 ខែ)
Production Skills: ការបង្កើនសមត្ថភាពទំហំធំនៃផលិតកម្ម
: ការសហការក្រុម
: ការអភិវឌ្ឍកម្មវិធីបង្កើតហ្គេម
: ការដាក់បញ្ចូលវេទិកា
```
### 🛠️ សង្ខេបឧបករណ៍ហ្គេមផ្ទៃក្នុងរបស់អ្នក
បន្ទាប់ពីបញ្ចប់មេរៀននេះ អ្នកគឺជាម្ចាស់ជំនាញ:
- **គណិតវិទ្យាអំពីការប៉ះទង្គិច**: អាល់ក្រីធម៍ប៉ះទង្គិចប្រអប់និងប្រព័ន្ធទិសដៅ
- **ការបង្កើនប្រសិទ្ធភាព**: ការរកឃើញការប៉ះទង្គិចមានប្រសិទ្ធភាពសម្រាប់កម្មវិធី Real-time
- **ការគ្រប់គ្រងអាយុកាលវត្ថុ**: ការបង្កើតប្រាកដ, ការអាប់ដេត និងគំរាមកំហែង
- **ស្ថាបត្យកម្មផ្អែកលើព្រឹត្តិការណ៍**: ប្រព័ន្ធផ្អែកព្រឹត្តិការណ៍ជាការបញ្ចាក់ចំណាច់ការប៉ះទង្គិច
- **ការរួមបញ្ចូលក្នុង Game Loop**: ការអាប់ដេតហើយត្រូវបានសម្រួលនឹងការផ្ទាំងឡើងវិញនៅក្នុងប្រព័ន្ធហ្គេម
- **ប្រព័ន្ធបញ្ចូលព័ត៌មាន**: ការត្រួតពិនិត្យឆ្លើយតបជាមួយកំណត់អត្រា និងមតិយោបល់
- **ការគ្រប់គ្រងចងចាំ**: ការប្រើប្រាស់ម៉ាស៊ីនផ្លាស់ប្តូរគោលនយោបាយ និងវិធីសាស្រ្តសម្អាត
**ការអនុវត្តក្នុងពិភពលោកពិត**: ជំនាញរកឃើញការប៉ះទង្គិចរបស់អ្នកអាចអនុវត្តទៅ:
- **ការស្ទួចសំលេងបន្តផ្ទាល់**: គំរូវិទ្យាសាស្រ្ត និងឧបករណ៍សិក្សា
- **ការរចនាផ្ទាំងប្រើប្រាស់**: ការចញ្ចឹម និងការរកមើលនៅលើទូរស័ព្ទ
- **ការសង្ហារឹមទិន្នន័យ**: បង្ហាញតារាងប្រតិបត្តិការមានអន្តរជាតិ និងធាតុចុចបាន
- **ការអភិវឌ្ឍទូរស័ព្ទ**: ការទទួលស្គាល់ចលនា និងការគ្រប់គ្រងការប៉ះទង្គិច
- **កម្មវិធីរ៉ូបូត**: ការធ្វើផែនទីផ្លូវ និងជៀសវាងឧបសគ្គ
- **ក្រាហ្វិចកុំព្យូទ័រ**: ការតាមដានកាំរស្មី និងអាល់ក្រិធម៍លំនៅទីតាំង
**ជំនាញវិជ្ជាជីវៈទទួលបាន**: ឥឡូវនេះអ្នកអាច:
- **រចនា** អាល់ក្រីធម៍មានប្រសិទ្ធភាពសម្រាប់ការរកឃើញការប៉ះទង្គិច Real-time
- **អនុវត្ត** ប្រព័ន្ធហ្គេមដែលពឹងផ្អែកលើហ្វីសិកសម្រាប់វត្ថុស្មុគស្មាញ
- **ធ្វើដំណោះស្រាយកំហុស** ប្រព័ន្ធអន្តរកម្មស្មុគស្មាញដោយប្រើគោលការណ៍គណិតវិទ្យា
- **បង្កើនប្រសិទ្ធភាព** សម្រាប់សមត្ថភាពរបស់សំភារៈ និងកម្មវិធីរុករក
- **ស្ថាបនាស្ថាពរកម្មវិធីហ្គេម** ដោយប្រើបែបបទរចនាដែលបានភ្ជាប់មក
**គំនិតអភិវឌ្ឍហ្គេមបានរៀន**:
- **ការស្ទួចសំលេងហ្គេម**: ការរកឃើញការប៉ះទង្គិច និងការឆ្លើយតប
- **ការអប់រំនៅឡើងវិញ**: អាល់ក្រីធម៍អាប់តុទបន្ទាន់សម្រាប់កម្មវិធីដែលមានអន្តរកម្ម
- **ប្រព័ន្ធព្រឹត្តិការណ៍**: និងកាសង្កត់ផ្សារជាមួយបំណែកហ្គេម
- **ការគ្រប់គ្រងវត្ថុ**: វិធីសាស្រ្តអាយុកាលប្រាកដសម្រាប់មាតិកាចល័ត
- **ការគ្រប់គ្រងបញ្ចូលព័ត៌មាន**: ត្រួតពិនិត្យឆ្លើយតបជាមួយមតិយោបល់សមស្រប
**ជំហានបន្ទាប់**: អ្នករួចរាល់រួចទៅទស្សនាវិញ្ញាសា​ឧបករណ៍ Matter.js លក្ខណៈខ្ពស់, អនុវត្តការរកឃើញការប៉ះទង្គិច 3D, ឬបង្កើតប្រព័ន្ធក្រ partículas ស្មុគស្មាញ!
🌟 **ការសម្រេចបាន**: អ្នកបានបង្កើតប្រព័ន្ធអន្តរកម្មផ្អែកលើហ្វីសិកសម្រាប់ការរកឃើញការប៉ះទង្គិចជាចំនួនដែលមានគុណភាពវិជ្ជាជីវៈ!
## GitHub Copilot Agent Challenge 🚀
ប្រើម៉ូដ Agent ដើម្បីបញ្ចប់បញ្ហាខាងក្រោម៖
**ការពិពណ៌នា:** បង្កើនប្រព័ន្ធការរកឃើញការប៉ះទង្គិចដោយអនុវត្តអំណាចបន្ថែមដែលបង្កើតឡើងដោយចៃដន្យ និងផ្តល់សមត្ថភាពបណ្តោះអាសន្ននៅពេលបានប្រមូលប៊ិចស៊ី
**ការបង្ហាញ:** បង្កើតថ្នាក់ PowerUp ដែលពង្រឹង GameObject ហើយអនុវត្តការរកឃើញការប៉ះទង្គិចរវាងវត្ថុហេរ៉ូ និងអំណាចបន្ថែម។ បន្ថែមប្រភេទ PowerUp យ៉ាងហោចណាស់ពីរប្រភេទ៖ មួយសម្រាប់បង្កើនអត្រាស្ទះភ្លើង (បន្ថយពេលឈប់), និងមួយសម្រាប់បង្កើតថ្នាំការពារបណ្តោះអាសន្ន។ រួមបញ្ចូលគន្លងបង្កើតដែលបង្កើត PowerUp នៅពេលចៃដន្យនិងទីតាំងចៃដន្យ។
---
## 🚀 បញ្ហា
បន្ថែមភ្លើងផ្ទុះ! សូមមើលឯកសារហ្គេមនៅក្នុង [the Space Art repo](../../../../6-space-game/solution/spaceArt/readme.txt) ហើយព្យាយាមបន្ថែមភ្លើងផ្ទុះពេលថ្លើមឡាស៊ែរ​ប៉ះបាញ់តួអាឡឺន
## ប្រលងបន្ទាប់ពីមេរៀន
[Post-lecture quiz](https://ff-quizzes.netlify.app/web/quiz/36)
## ការពិនិត្យឡើងវិញ និងសិក្សាឯកឯង
សាកល្បងការប្រែប្រួលចន្លោះពេលនៅក្នុងហ្គេមរបស់អ្នកបច្ចុប្បន្ន។ តើមានអ្វីកើតឡើងពេលអ្នកផ្លាស់ប្ដូរពេល? សូមអានបន្ថែមអំពី [JavaScript timing events](https://www.freecodecamp.org/news/javascript-timing-events-settimeout-and-setinterval/)។
## មុខងារ
[Explore collisions](assignment.md)
---
<!-- CO-OP TRANSLATOR DISCLAIMER START -->
**ការប្រកាសបដិសេធ**៖
ឯកសារនេះត្រូវបានបកប្រែដោយប្រើសេវាបកប្រែ AI [Co-op Translator](https://github.com/Azure/co-op-translator)។ ខណៈពេលយើងខិតខំគិតទៅរកភាពត្រឹមត្រូវ សូមជម្រាបឲ្យដឹងថាការបកប្រែដោយយន្តមayមានកំហុសឬភាពមិនត្រឹមត្រូវ។ ឯកសារដើមនៅភាសារបស់ខ្លួនគួរត្រូវបានគិតថាជា ប្រភពដើមដែលមានអំណាច។ សម្រាប់ព័ត៌មានសំខាន់ៗ សូមផ្ដល់អនុសាសន៍ឲ្យមានការបកប្រែដោយមនុស្សជំនាញ។ យើងមិនទទួលខុសត្រូវចំពោះការយល់ច្រឡំ ឬការបកស្រាយខុសពីការប្រើប្រាស់ការបកប្រែនេះទេ។
<!-- CO-OP TRANSLATOR DISCLAIMER END -->