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.
234 lines
15 KiB
234 lines
15 KiB
<!--
|
|
CO_OP_TRANSLATOR_METADATA:
|
|
{
|
|
"original_hash": "01336cddd638242e99b133614111ea40",
|
|
"translation_date": "2025-08-25T22:35:17+00:00",
|
|
"source_file": "6-space-game/6-end-condition/README.md",
|
|
"language_code": "bn"
|
|
}
|
|
-->
|
|
# মহাকাশ গেম তৈরি করুন পর্ব ৬: শেষ এবং পুনরায় শুরু
|
|
|
|
## প্রাক-লেকচার কুইজ
|
|
|
|
[প্রাক-লেকচার কুইজ](https://ff-quizzes.netlify.app/web/quiz/39)
|
|
|
|
একটি গেমে *শেষের শর্ত* প্রকাশ করার বিভিন্ন উপায় রয়েছে। গেমের নির্মাতা হিসেবে আপনাকে সিদ্ধান্ত নিতে হবে কেন গেমটি শেষ হয়েছে। এখানে কিছু কারণ উল্লেখ করা হলো, যদি আমরা ধরে নিই যে আপনি এখন পর্যন্ত যে মহাকাশ গেমটি তৈরি করেছেন তা নিয়ে আলোচনা করছি:
|
|
|
|
- **`N` শত্রু জাহাজ ধ্বংস হয়েছে**: এটি বেশ সাধারণ, যদি আপনি গেমটিকে বিভিন্ন স্তরে ভাগ করেন যেখানে একটি স্তর সম্পন্ন করতে `N` শত্রু জাহাজ ধ্বংস করতে হবে।
|
|
- **আপনার জাহাজ ধ্বংস হয়েছে**: এমন অনেক গেম রয়েছে যেখানে আপনার জাহাজ ধ্বংস হলে আপনি গেমটি হারান। আরেকটি সাধারণ পদ্ধতি হলো "জীবন" ধারণা যোগ করা। প্রতিবার আপনার জাহাজ ধ্বংস হলে একটি জীবন কমে যায়। যখন সব জীবন শেষ হয়ে যায় তখন আপনি গেমটি হারান।
|
|
- **আপনি `N` পয়েন্ট সংগ্রহ করেছেন**: আরেকটি সাধারণ শেষের শর্ত হলো পয়েন্ট সংগ্রহ করা। কীভাবে পয়েন্ট সংগ্রহ করবেন তা আপনার উপর নির্ভর করে, তবে শত্রু জাহাজ ধ্বংস করা বা ধ্বংস হওয়া আইটেম সংগ্রহ করার মতো বিভিন্ন কার্যকলাপে পয়েন্ট দেওয়া সাধারণ।
|
|
- **একটি স্তর সম্পন্ন করুন**: এটি একাধিক শর্ত অন্তর্ভুক্ত করতে পারে যেমন `X` শত্রু জাহাজ ধ্বংস, `Y` পয়েন্ট সংগ্রহ করা বা একটি নির্দিষ্ট আইটেম সংগ্রহ করা।
|
|
|
|
## পুনরায় শুরু করা
|
|
|
|
যদি মানুষ আপনার গেমটি উপভোগ করে, তারা সম্ভবত এটি আবার খেলতে চাইবে। গেমটি যেকোনো কারণে শেষ হলে আপনি পুনরায় শুরু করার একটি বিকল্প প্রদান করবেন।
|
|
|
|
✅ চিন্তা করুন, কোন শর্তে আপনি একটি গেম শেষ করেন এবং তারপর কীভাবে আপনাকে পুনরায় শুরু করতে বলা হয়।
|
|
|
|
## কী তৈরি করবেন
|
|
|
|
আপনার গেমে এই নিয়মগুলো যোগ করবেন:
|
|
|
|
1. **গেম জেতা**। যখন সব শত্রু জাহাজ ধ্বংস হয়ে যায়, আপনি গেমটি জিতবেন। এছাড়াও একটি বিজয়ের বার্তা প্রদর্শন করুন।
|
|
1. **পুনরায় শুরু**। যখন আপনার সব জীবন শেষ হয়ে যায় বা গেমটি জিতেন, তখন গেমটি পুনরায় শুরু করার একটি উপায় প্রদান করুন। মনে রাখবেন! আপনাকে গেমটি পুনরায় আরম্ভ করতে হবে এবং পূর্ববর্তী গেমের অবস্থা মুছে ফেলতে হবে।
|
|
|
|
## সুপারিশকৃত ধাপসমূহ
|
|
|
|
`your-work` সাব ফোল্ডারে আপনার জন্য তৈরি করা ফাইলগুলো খুঁজুন। এটি নিম্নলিখিতটি অন্তর্ভুক্ত করা উচিত:
|
|
|
|
```bash
|
|
-| assets
|
|
-| enemyShip.png
|
|
-| player.png
|
|
-| laserRed.png
|
|
-| life.png
|
|
-| index.html
|
|
-| app.js
|
|
-| package.json
|
|
```
|
|
|
|
আপনার প্রকল্পটি `your_work` ফোল্ডার থেকে শুরু করুন এই কমান্ডটি টাইপ করে:
|
|
|
|
```bash
|
|
cd your-work
|
|
npm start
|
|
```
|
|
|
|
উপরের কমান্ডটি `http://localhost:5000` ঠিকানায় একটি HTTP সার্ভার চালু করবে। একটি ব্রাউজার খুলুন এবং সেই ঠিকানা লিখুন। আপনার গেমটি খেলার উপযোগী অবস্থায় থাকা উচিত।
|
|
|
|
> টিপ: Visual Studio Code-এ সতর্কতা এড়াতে, `window.onload` ফাংশনটি সম্পাদনা করুন যাতে এটি `gameLoopId` কল করে (যেমন আছে, `let` ছাড়া), এবং ফাইলের শীর্ষে `gameLoopId` স্বাধীনভাবে ঘোষণা করুন: `let gameLoopId;`
|
|
|
|
### কোড যোগ করুন
|
|
|
|
1. **শেষের শর্ত ট্র্যাক করুন**। শত্রুদের সংখ্যা বা হিরো জাহাজ ধ্বংস হয়েছে কিনা তা ট্র্যাক করার জন্য এই দুটি ফাংশন যোগ করুন:
|
|
|
|
```javascript
|
|
function isHeroDead() {
|
|
return hero.life <= 0;
|
|
}
|
|
|
|
function isEnemiesDead() {
|
|
const enemies = gameObjects.filter((go) => go.type === "Enemy" && !go.dead);
|
|
return enemies.length === 0;
|
|
}
|
|
```
|
|
|
|
1. **বার্তা হ্যান্ডলারগুলিতে লজিক যোগ করুন**। `eventEmitter` সম্পাদনা করুন এই শর্তগুলো পরিচালনা করতে:
|
|
|
|
```javascript
|
|
eventEmitter.on(Messages.COLLISION_ENEMY_LASER, (_, { first, second }) => {
|
|
first.dead = true;
|
|
second.dead = true;
|
|
hero.incrementPoints();
|
|
|
|
if (isEnemiesDead()) {
|
|
eventEmitter.emit(Messages.GAME_END_WIN);
|
|
}
|
|
});
|
|
|
|
eventEmitter.on(Messages.COLLISION_ENEMY_HERO, (_, { enemy }) => {
|
|
enemy.dead = true;
|
|
hero.decrementLife();
|
|
if (isHeroDead()) {
|
|
eventEmitter.emit(Messages.GAME_END_LOSS);
|
|
return; // loss before victory
|
|
}
|
|
if (isEnemiesDead()) {
|
|
eventEmitter.emit(Messages.GAME_END_WIN);
|
|
}
|
|
});
|
|
|
|
eventEmitter.on(Messages.GAME_END_WIN, () => {
|
|
endGame(true);
|
|
});
|
|
|
|
eventEmitter.on(Messages.GAME_END_LOSS, () => {
|
|
endGame(false);
|
|
});
|
|
```
|
|
|
|
1. **নতুন বার্তার ধরন যোগ করুন**। এই বার্তাগুলো Constants অবজেক্টে যোগ করুন:
|
|
|
|
```javascript
|
|
GAME_END_LOSS: "GAME_END_LOSS",
|
|
GAME_END_WIN: "GAME_END_WIN",
|
|
```
|
|
|
|
2. **পুনরায় শুরু করার কোড যোগ করুন**। একটি নির্দিষ্ট বোতাম চাপলে গেমটি পুনরায় শুরু করার কোড যোগ করুন।
|
|
|
|
1. **কী প্রেস `Enter` শুনুন**। আপনার window-এর eventListener সম্পাদনা করুন এই প্রেসটি শুনতে:
|
|
|
|
```javascript
|
|
else if(evt.key === "Enter") {
|
|
eventEmitter.emit(Messages.KEY_EVENT_ENTER);
|
|
}
|
|
```
|
|
|
|
1. **পুনরায় শুরু বার্তা যোগ করুন**। এই বার্তাটি আপনার Messages constant-এ যোগ করুন:
|
|
|
|
```javascript
|
|
KEY_EVENT_ENTER: "KEY_EVENT_ENTER",
|
|
```
|
|
|
|
1. **গেমের নিয়ম বাস্তবায়ন করুন**। নিম্নলিখিত গেমের নিয়মগুলো বাস্তবায়ন করুন:
|
|
|
|
1. **প্লেয়ার জয়ের শর্ত**। যখন সব শত্রু জাহাজ ধ্বংস হয়ে যায়, একটি বিজয়ের বার্তা প্রদর্শন করুন।
|
|
|
|
1. প্রথমে একটি `displayMessage()` ফাংশন তৈরি করুন:
|
|
|
|
```javascript
|
|
function displayMessage(message, color = "red") {
|
|
ctx.font = "30px Arial";
|
|
ctx.fillStyle = color;
|
|
ctx.textAlign = "center";
|
|
ctx.fillText(message, canvas.width / 2, canvas.height / 2);
|
|
}
|
|
```
|
|
|
|
1. একটি `endGame()` ফাংশন তৈরি করুন:
|
|
|
|
```javascript
|
|
function endGame(win) {
|
|
clearInterval(gameLoopId);
|
|
|
|
// set a delay so we are sure any paints have finished
|
|
setTimeout(() => {
|
|
ctx.clearRect(0, 0, canvas.width, canvas.height);
|
|
ctx.fillStyle = "black";
|
|
ctx.fillRect(0, 0, canvas.width, canvas.height);
|
|
if (win) {
|
|
displayMessage(
|
|
"Victory!!! Pew Pew... - Press [Enter] to start a new game Captain Pew Pew",
|
|
"green"
|
|
);
|
|
} else {
|
|
displayMessage(
|
|
"You died !!! Press [Enter] to start a new game Captain Pew Pew"
|
|
);
|
|
}
|
|
}, 200)
|
|
}
|
|
```
|
|
|
|
1. **পুনরায় শুরু করার লজিক**। যখন সব জীবন শেষ হয়ে যায় বা প্লেয়ার গেমটি জিতেন, তখন দেখান যে গেমটি পুনরায় শুরু করা যেতে পারে। এছাড়াও, যখন *পুনরায় শুরু* কী চাপা হয় তখন গেমটি পুনরায় শুরু করুন (আপনি সিদ্ধান্ত নিতে পারেন কোন কী পুনরায় শুরুতে ম্যাপ করা হবে)।
|
|
|
|
1. একটি `resetGame()` ফাংশন তৈরি করুন:
|
|
|
|
```javascript
|
|
function resetGame() {
|
|
if (gameLoopId) {
|
|
clearInterval(gameLoopId);
|
|
eventEmitter.clear();
|
|
initGame();
|
|
gameLoopId = setInterval(() => {
|
|
ctx.clearRect(0, 0, canvas.width, canvas.height);
|
|
ctx.fillStyle = "black";
|
|
ctx.fillRect(0, 0, canvas.width, canvas.height);
|
|
drawPoints();
|
|
drawLife();
|
|
updateGameObjects();
|
|
drawGameObjects(ctx);
|
|
}, 100);
|
|
}
|
|
}
|
|
```
|
|
|
|
1. `initGame()`-এ গেমটি পুনরায় সেট করার জন্য `eventEmitter`-এ একটি কল যোগ করুন:
|
|
|
|
```javascript
|
|
eventEmitter.on(Messages.KEY_EVENT_ENTER, () => {
|
|
resetGame();
|
|
});
|
|
```
|
|
|
|
1. EventEmitter-এ একটি `clear()` ফাংশন যোগ করুন:
|
|
|
|
```javascript
|
|
clear() {
|
|
this.listeners = {};
|
|
}
|
|
```
|
|
|
|
👽 💥 🚀 অভিনন্দন, ক্যাপ্টেন! আপনার গেমটি সম্পূর্ণ হয়েছে! খুব ভালো কাজ করেছেন! 🚀 💥 👽
|
|
|
|
---
|
|
|
|
## 🚀 চ্যালেঞ্জ
|
|
|
|
একটি শব্দ যোগ করুন! আপনি কি শব্দ যোগ করতে পারেন যাতে আপনার গেমপ্লে আরও আকর্ষণীয় হয়, যেমন লেজার আঘাতের সময়, হিরো মারা গেলে বা জিতলে? এই [sandbox](https://www.w3schools.com/jsref/tryit.asp?filename=tryjsref_audio_play)-এ দেখুন কীভাবে JavaScript ব্যবহার করে শব্দ চালানো যায়।
|
|
|
|
## পোস্ট-লেকচার কুইজ
|
|
|
|
[পোস্ট-লেকচার কুইজ](https://ff-quizzes.netlify.app/web/quiz/40)
|
|
|
|
## পর্যালোচনা এবং স্ব-অধ্যয়ন
|
|
|
|
আপনার কাজ হলো একটি নতুন নমুনা গেম তৈরি করা, তাই কিছু আকর্ষণীয় গেম অন্বেষণ করুন এবং দেখুন আপনি কী ধরনের গেম তৈরি করতে পারেন।
|
|
|
|
## অ্যাসাইনমেন্ট
|
|
|
|
[একটি নমুনা গেম তৈরি করুন](assignment.md)
|
|
|
|
**অস্বীকৃতি**:
|
|
এই নথিটি AI অনুবাদ পরিষেবা [Co-op Translator](https://github.com/Azure/co-op-translator) ব্যবহার করে অনুবাদ করা হয়েছে। আমরা যথাসাধ্য সঠিকতা নিশ্চিত করার চেষ্টা করি, তবে অনুগ্রহ করে মনে রাখবেন যে স্বয়ংক্রিয় অনুবাদে ত্রুটি বা অসঙ্গতি থাকতে পারে। মূল ভাষায় থাকা নথিটিকে প্রামাণিক উৎস হিসেবে বিবেচনা করা উচিত। গুরুত্বপূর্ণ তথ্যের জন্য, পেশাদার মানব অনুবাদ সুপারিশ করা হয়। এই অনুবাদ ব্যবহারের ফলে কোনো ভুল বোঝাবুঝি বা ভুল ব্যাখ্যা হলে আমরা দায়বদ্ধ থাকব না। |