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.
309 lines
19 KiB
309 lines
19 KiB
<!--
|
|
CO_OP_TRANSLATOR_METADATA:
|
|
{
|
|
"original_hash": "2e83e38c35dc003f046d7cc0bbfd4920",
|
|
"translation_date": "2025-08-25T22:23:10+00:00",
|
|
"source_file": "6-space-game/4-collision-detection/README.md",
|
|
"language_code": "mr"
|
|
}
|
|
-->
|
|
# स्पेस गेम तयार करा भाग ४: लेझर जोडणे आणि टक्कर शोधणे
|
|
|
|
## प्री-लेक्चर क्विझ
|
|
|
|
[प्री-लेक्चर क्विझ](https://ff-quizzes.netlify.app/web/quiz/35)
|
|
|
|
या धड्यात तुम्ही JavaScript वापरून लेझर कसे शूट करायचे ते शिकाल! आपण आपल्या गेममध्ये दोन गोष्टी जोडणार आहोत:
|
|
|
|
- **लेझर**: हे लेझर तुमच्या हिरोच्या जहाजातून वरच्या दिशेने उडवले जाईल.
|
|
- **टक्कर शोधणे**: *शूटिंग* कार्यक्षमता अंमलात आणताना आपण काही छान गेम नियम देखील जोडणार आहोत:
|
|
- **लेझर शत्रूला लागते**: लेझर लागल्यास शत्रू नष्ट होतो.
|
|
- **लेझर स्क्रीनच्या वरच्या भागाला लागते**: स्क्रीनच्या वरच्या भागाला लागल्यास लेझर नष्ट होते.
|
|
- **शत्रू आणि हिरोची टक्कर**: शत्रू आणि हिरो एकमेकांना धडकले तर दोघेही नष्ट होतात.
|
|
- **शत्रू स्क्रीनच्या तळाशी पोहोचतो**: शत्रू स्क्रीनच्या तळाशी पोहोचल्यास शत्रू आणि हिरो दोघेही नष्ट होतात.
|
|
|
|
थोडक्यात, तुम्हाला -- *हिरो* -- सर्व शत्रूंना लेझरने मारायचे आहे, त्याआधी ते स्क्रीनच्या तळाशी पोहोचण्याचा प्रयत्न करतील.
|
|
|
|
✅ पहिल्या संगणक गेमबद्दल थोडे संशोधन करा. त्याची कार्यक्षमता काय होती?
|
|
|
|
चला, हिरो बनूया!
|
|
|
|
## टक्कर शोधणे
|
|
|
|
टक्कर शोधणे कसे करायचे? आपल्याला आपल्या गेम ऑब्जेक्ट्सना हालणाऱ्या आयताकृती म्हणून विचार करावा लागेल. का, असे तुम्ही विचाराल? कारण गेम ऑब्जेक्ट काढण्यासाठी वापरलेले चित्र आयताकृती असते: त्याला `x`, `y`, `width` आणि `height` असते.
|
|
|
|
जर दोन आयत, म्हणजेच हिरो आणि शत्रू *एकमेकांना ओलांडतात*, तर टक्कर होते. त्यानंतर काय घडावे हे गेमच्या नियमांवर अवलंबून असते. टक्कर शोधण्यासाठी तुम्हाला खालील गोष्टींची आवश्यकता आहे:
|
|
|
|
1. गेम ऑब्जेक्टचे आयताकृती प्रतिनिधित्व मिळवण्याचा एक मार्ग, असे काहीतरी:
|
|
|
|
```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);
|
|
}
|
|
```
|
|
|
|
## गोष्टी कशा नष्ट करायच्या
|
|
|
|
गेममध्ये गोष्टी नष्ट करण्यासाठी गेमला कळवावे लागते की त्या वस्तूला गेम लूपमध्ये पुन्हा रंगवले जाऊ नये. यासाठी, काहीतरी घडल्यावर गेम ऑब्जेक्टला *मृत* म्हणून चिन्हांकित करणे हा एक मार्ग आहे, असे:
|
|
|
|
```javascript
|
|
// collision happened
|
|
enemy.dead = true
|
|
```
|
|
|
|
यानंतर तुम्ही *मृत* वस्तूंची छाननी करून स्क्रीन पुन्हा रंगवू शकता, असे:
|
|
|
|
```javascript
|
|
gameObjects = gameObject.filter(go => !go.dead);
|
|
```
|
|
|
|
## लेझर कसे फायर करायचे
|
|
|
|
लेझर फायर करणे म्हणजे की-इव्हेंटला प्रतिसाद देणे आणि एका विशिष्ट दिशेने हालणारी वस्तू तयार करणे. यासाठी खालील पायऱ्या पार पाडाव्या लागतील:
|
|
|
|
1. **लेझर ऑब्जेक्ट तयार करा**: हिरोच्या जहाजाच्या वरच्या भागातून, जे तयार होताच स्क्रीनच्या वरच्या दिशेने हालते.
|
|
2. **की इव्हेंटला कोड जोडा**: कीबोर्डवरील एक की निवडावी लागेल जी लेझर शूट करण्याचे प्रतिनिधित्व करते.
|
|
3. **लेझरसारखा दिसणारा गेम ऑब्जेक्ट तयार करा**: जेव्हा की दाबली जाते.
|
|
|
|
## लेझरवर कूलडाउन
|
|
|
|
लेझर प्रत्येक वेळी की दाबल्यावर फायर होणे आवश्यक आहे, जसे *स्पेस* की. परंतु, खूप कमी वेळात खूप जास्त लेझर तयार होऊ नयेत म्हणून आपण यावर उपाय करावा लागेल. यासाठी *कूलडाउन* नावाचा एक टाइमर लागू करावा लागतो, जो सुनिश्चित करतो की लेझर फक्त ठराविक वेळानेच फायर होईल. तुम्ही हे खालीलप्रमाणे लागू करू शकता:
|
|
|
|
```javascript
|
|
class Cooldown {
|
|
constructor(time) {
|
|
this.cool = false;
|
|
setTimeout(() => {
|
|
this.cool = true;
|
|
}, time)
|
|
}
|
|
}
|
|
|
|
class Weapon {
|
|
constructor {
|
|
}
|
|
fire() {
|
|
if (!this.cooldown || this.cooldown.cool) {
|
|
// produce a laser
|
|
this.cooldown = new Cooldown(500);
|
|
} else {
|
|
// do nothing - it hasn't cooled down yet.
|
|
}
|
|
}
|
|
}
|
|
```
|
|
|
|
✅ स्पेस गेम मालिकेतील पहिल्या धड्याचा संदर्भ घ्या आणि *कूलडाउन* बद्दल आठवा.
|
|
|
|
## काय तयार करायचे
|
|
|
|
तुम्ही मागील धड्यातील कोड (जो तुम्ही साफसफाई करून पुन्हा तयार केला असेल) घेऊन त्याचा विस्तार कराल. भाग II मधील कोडपासून सुरुवात करा किंवा [भाग III- स्टार्टर](../../../../../../../../../your-work) येथील कोड वापरा.
|
|
|
|
> टीप: लेझर आधीच तुमच्या अॅसेट्स फोल्डरमध्ये आहे आणि तुमच्या कोडमध्ये संदर्भित केले गेले आहे.
|
|
|
|
- **टक्कर शोधणे जोडा**, जेव्हा लेझर कोणत्याही गोष्टीला धडकते तेव्हा खालील नियम लागू होतात:
|
|
1. **लेझर शत्रूला लागते**: लेझर लागल्यास शत्रू नष्ट होतो.
|
|
2. **लेझर स्क्रीनच्या वरच्या भागाला लागते**: स्क्रीनच्या वरच्या भागाला लागल्यास लेझर नष्ट होते.
|
|
3. **शत्रू आणि हिरोची टक्कर**: शत्रू आणि हिरो एकमेकांना धडकले तर दोघेही नष्ट होतात.
|
|
4. **शत्रू स्क्रीनच्या तळाशी पोहोचतो**: शत्रू स्क्रीनच्या तळाशी पोहोचल्यास शत्रू आणि हिरो दोघेही नष्ट होतात.
|
|
|
|
## शिफारस केलेल्या पायऱ्या
|
|
|
|
`your-work` सब फोल्डरमध्ये तयार केलेल्या फाइल्स शोधा. त्यात खालील गोष्टी असाव्यात:
|
|
|
|
```bash
|
|
-| assets
|
|
-| enemyShip.png
|
|
-| player.png
|
|
-| laserRed.png
|
|
-| index.html
|
|
-| app.js
|
|
-| package.json
|
|
```
|
|
|
|
तुमचा प्रोजेक्ट `your_work` फोल्डरमधून सुरू करा:
|
|
|
|
```bash
|
|
cd your-work
|
|
npm start
|
|
```
|
|
|
|
वरील कमांड HTTP सर्व्हर `http://localhost:5000` या पत्त्यावर सुरू करेल. ब्राउझर उघडा आणि हा पत्ता टाका, सध्या तुम्हाला हिरो आणि सर्व शत्रू दिसतील, पण काहीही हलत नाही - अजून :).
|
|
|
|
### कोड जोडा
|
|
|
|
1. **तुमच्या गेम ऑब्जेक्टसाठी आयताकृती प्रतिनिधित्व सेट करा, टक्कर हाताळण्यासाठी** खालील कोड तुम्हाला `GameObject` चे आयताकृती प्रतिनिधित्व मिळवण्यास अनुमती देतो. तुमच्या 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
|
|
);
|
|
}
|
|
```
|
|
|
|
3. **लेझर फायर करण्याची क्षमता जोडा**
|
|
1. **की-इव्हेंट संदेश जोडा**. *स्पेस* कीने हिरो जहाजाच्या थोड्या वर लेझर तयार करावे. Messages ऑब्जेक्टमध्ये तीन कॉन्स्टंट्स जोडा:
|
|
|
|
```javascript
|
|
KEY_EVENT_SPACE: "KEY_EVENT_SPACE",
|
|
COLLISION_ENEMY_LASER: "COLLISION_ENEMY_LASER",
|
|
COLLISION_ENEMY_HERO: "COLLISION_ENEMY_HERO",
|
|
```
|
|
|
|
1. **स्पेस की हाताळा**. `window.addEventListener` च्या keyup फंक्शनमध्ये स्पेससाठी कोड जोडा:
|
|
|
|
```javascript
|
|
} else if(evt.keyCode === 32) {
|
|
eventEmitter.emit(Messages.KEY_EVENT_SPACE);
|
|
}
|
|
```
|
|
|
|
1. **लिसनर्स जोडा**. `initGame()` फंक्शन संपादित करा जेणेकरून स्पेस बार दाबल्यावर हिरो लेझर फायर करू शकेल:
|
|
|
|
```javascript
|
|
eventEmitter.on(Messages.KEY_EVENT_SPACE, () => {
|
|
if (hero.canFire()) {
|
|
hero.fire();
|
|
}
|
|
```
|
|
|
|
आणि एक नवीन `eventEmitter.on()` फंक्शन जोडा जेव्हा शत्रू लेझरला धडकतो तेव्हा वर्तन सुनिश्चित करण्यासाठी:
|
|
|
|
```javascript
|
|
eventEmitter.on(Messages.COLLISION_ENEMY_LASER, (_, { first, second }) => {
|
|
first.dead = true;
|
|
second.dead = true;
|
|
})
|
|
```
|
|
|
|
1. **ऑब्जेक्ट हलवा**, लेझर हळूहळू स्क्रीनच्या वरच्या दिशेने हलते याची खात्री करा. तुम्ही नवीन Laser वर्ग तयार कराल जो `GameObject` ला विस्तारित करतो, जसे तुम्ही यापूर्वी केले होते:
|
|
|
|
```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)
|
|
}
|
|
}
|
|
```
|
|
|
|
1. **टक्कर हाताळा**, लेझरसाठी टक्कर नियम लागू करा. `updateGameObjects()` फंक्शन जोडा जे टक्कर झालेल्या वस्तूंसाठी चाचणी करते:
|
|
|
|
```javascript
|
|
function updateGameObjects() {
|
|
const enemies = gameObjects.filter(go => go.type === 'Enemy');
|
|
const lasers = gameObjects.filter((go) => go.type === "Laser");
|
|
// laser hit something
|
|
lasers.forEach((l) => {
|
|
enemies.forEach((m) => {
|
|
if (intersectRect(l.rectFromGameObject(), m.rectFromGameObject())) {
|
|
eventEmitter.emit(Messages.COLLISION_ENEMY_LASER, {
|
|
first: l,
|
|
second: m,
|
|
});
|
|
}
|
|
});
|
|
});
|
|
|
|
gameObjects = gameObjects.filter(go => !go.dead);
|
|
}
|
|
```
|
|
|
|
`window.onload` मधील गेम लूपमध्ये `updateGameObjects()` समाविष्ट करा.
|
|
|
|
4. **लेझरवर कूलडाउन लागू करा**, त्यामुळे ते फक्त ठराविक वेळानेच फायर होईल.
|
|
|
|
शेवटी, 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;
|
|
}
|
|
}
|
|
```
|
|
|
|
या टप्प्यावर, तुमच्या गेममध्ये काही कार्यक्षमता आहे! तुम्ही तुमच्या अॅरो कीजने नेव्हिगेट करू शकता, स्पेस बारने लेझर फायर करू शकता, आणि शत्रू त्यांना लागल्यावर गायब होतात. छान काम केले!
|
|
|
|
---
|
|
|
|
## 🚀 आव्हान
|
|
|
|
स्फोट जोडा! [स्पेस आर्ट रेपो](../../../../6-space-game/solution/spaceArt/readme.txt) मधील गेम अॅसेट्स पाहा आणि लेझर परग्रहवासीयाला लागल्यावर स्फोट कसा जोडायचा ते प्रयत्न करा.
|
|
|
|
## पोस्ट-लेक्चर क्विझ
|
|
|
|
[पोस्ट-लेक्चर क्विझ](https://ff-quizzes.netlify.app/web/quiz/36)
|
|
|
|
## पुनरावलोकन आणि स्व-अभ्यास
|
|
|
|
तुमच्या गेममधील वेळेच्या अंतरांशी प्रयोग करा. तुम्ही त्यात बदल केल्यावर काय होते? [JavaScript टाइमिंग इव्हेंट्स](https://www.freecodecamp.org/news/javascript-timing-events-settimeout-and-setinterval/) बद्दल अधिक वाचा.
|
|
|
|
## असाइनमेंट
|
|
|
|
[टक्कर शोधा](assignment.md)
|
|
|
|
**अस्वीकरण**:
|
|
हा दस्तऐवज AI भाषांतर सेवा [Co-op Translator](https://github.com/Azure/co-op-translator) वापरून भाषांतरित करण्यात आला आहे. आम्ही अचूकतेसाठी प्रयत्नशील असलो तरी, कृपया लक्षात घ्या की स्वयंचलित भाषांतरांमध्ये त्रुटी किंवा अचूकतेचा अभाव असू शकतो. मूळ भाषेतील मूळ दस्तऐवज हा अधिकृत स्रोत मानला जावा. महत्त्वाच्या माहितीसाठी, व्यावसायिक मानवी भाषांतराची शिफारस केली जाते. या भाषांतराचा वापर केल्यामुळे उद्भवणाऱ्या कोणत्याही गैरसमज किंवा चुकीच्या अर्थासाठी आम्ही जबाबदार राहणार नाही. |