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/lt/6-space-game/6-end-condition
Lee Stott 2daab5271b
Update Quiz Link
3 weeks ago
..
solution 🌐 Update translations via Co-op Translator 3 weeks ago
your-work 🌐 Update translations via Co-op Translator 3 weeks ago
README.md Update Quiz Link 3 weeks ago
assignment.md 🌐 Update translations via Co-op Translator 3 weeks ago

README.md

Sukurkite kosminį žaidimą 6 dalis: Pabaiga ir paleidimas iš naujo

Klausimai prieš paskaitą

Klausimai prieš paskaitą

Yra įvairių būdų, kaip žaidime išreikšti pabaigos sąlygą. Jūs, kaip žaidimo kūrėjas, nusprendžiate, kodėl žaidimas baigiasi. Štai keletas priežasčių, jei kalbame apie kosminį žaidimą, kurį kūrėte iki šiol:

  • Sunaikinta N priešo laivų: Dažnai žaidimas yra padalintas į skirtingus lygius, kuriuose reikia sunaikinti N priešo laivų, kad užbaigtumėte lygį.
  • Jūsų laivas sunaikintas: Yra žaidimų, kuriuose pralaimite, jei jūsų laivas sunaikinamas. Kitas dažnas požiūris yra gyvybių koncepcija. Kiekvieną kartą, kai jūsų laivas sunaikinamas, prarandate gyvybę. Kai visos gyvybės prarandamos, pralaimite žaidimą.
  • Surinkta N taškų: Kita dažna pabaigos sąlyga yra taškų rinkimas. Kaip gaunate taškus, priklauso nuo jūsų, tačiau dažnai taškai priskiriami įvairioms veikloms, pavyzdžiui, priešo laivo sunaikinimui arba daiktų rinkimui, kurie atsiranda, kai jie sunaikinami.
  • Užbaigtas lygis: Tai gali apimti kelias sąlygas, tokias kaip X sunaikinti priešo laivai, Y surinkti taškai arba galbūt specifinio daikto surinkimas.

Paleidimas iš naujo

Jei žmonėms patinka jūsų žaidimas, jie greičiausiai norės jį žaisti dar kartą. Kai žaidimas baigiasi dėl bet kokios priežasties, turėtumėte pasiūlyti galimybę jį paleisti iš naujo.

Pagalvokite, kokiomis sąlygomis žaidimas baigiasi, ir kaip jums siūloma jį paleisti iš naujo.

Ką sukurti

Jūs pridėsite šias taisykles į savo žaidimą:

  1. Žaidimo laimėjimas. Kai visi priešo laivai sunaikinami, jūs laimite žaidimą. Be to, parodykite pergalės pranešimą.
  2. Paleidimas iš naujo. Kai visos gyvybės prarandamos arba žaidimas laimimas, turėtumėte pasiūlyti būdą paleisti žaidimą iš naujo. Nepamirškite! Jums reikės iš naujo inicializuoti žaidimą ir išvalyti ankstesnę žaidimo būseną.

Rekomenduojami žingsniai

Raskite failus, kurie buvo sukurti jums aplanke your-work. Jame turėtų būti:

-| assets
  -| enemyShip.png
  -| player.png
  -| laserRed.png
  -| life.png
-| index.html
-| app.js
-| package.json

Pradėkite savo projektą aplanke your_work, įvesdami:

cd your-work
npm start

Tai paleis HTTP serverį adresu http://localhost:5000. Atidarykite naršyklę ir įveskite šį adresą. Jūsų žaidimas turėtų būti paruoštas žaisti.

patarimas: kad išvengtumėte įspėjimų Visual Studio Code, redaguokite funkciją window.onload, kad ji kviestų gameLoopId kaip yra (be let), ir deklaruokite gameLoopId failo viršuje, nepriklausomai: let gameLoopId;

Pridėkite kodą

  1. Sekite pabaigos sąlygą. Pridėkite kodą, kuris seka priešų skaičių arba ar herojaus laivas buvo sunaikintas, pridėdami šias dvi funkcijas:

    function isHeroDead() {
      return hero.life <= 0;
    }
    
    function isEnemiesDead() {
      const enemies = gameObjects.filter((go) => go.type === "Enemy" && !go.dead);
      return enemies.length === 0;
    }
    
  2. Pridėkite logiką pranešimų tvarkytojams. Redaguokite eventEmitter, kad tvarkytų šias sąlygas:

    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);
    });
    
  3. Pridėkite naujų pranešimų tipus. Pridėkite šiuos pranešimus į constants objektą:

    GAME_END_LOSS: "GAME_END_LOSS",
    GAME_END_WIN: "GAME_END_WIN",
    
  4. Pridėkite paleidimo iš naujo kodą. Kodas, kuris paleidžia žaidimą iš naujo paspaudus pasirinktą mygtuką.

    1. Klausykite klavišo paspaudimo Enter. Redaguokite savo lango eventListener, kad klausytų šio paspaudimo:
     else if(evt.key === "Enter") {
        eventEmitter.emit(Messages.KEY_EVENT_ENTER);
      }
    
    1. Pridėkite paleidimo iš naujo pranešimą. Pridėkite šį pranešimą į Messages constant:

      KEY_EVENT_ENTER: "KEY_EVENT_ENTER",
      
  5. Įgyvendinkite žaidimo taisykles. Įgyvendinkite šias žaidimo taisykles:

    1. Žaidėjo laimėjimo sąlyga. Kai visi priešo laivai sunaikinami, parodykite pergalės pranešimą.

      1. Pirmiausia sukurkite funkciją displayMessage():
      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. Sukurkite funkciją endGame():
      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)  
      }
      
    2. Paleidimo iš naujo logika. Kai visos gyvybės prarandamos arba žaidėjas laimi žaidimą, parodykite, kad žaidimą galima paleisti iš naujo. Be to, paleiskite žaidimą iš naujo, kai paspaudžiamas paleidimo iš naujo klavišas (jūs galite nuspręsti, kuris klavišas bus priskirtas paleidimui iš naujo).

      1. Sukurkite funkciją resetGame():
      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);
        }
      }
      
    3. Pridėkite skambutį į eventEmitter, kad iš naujo inicializuotų žaidimą funkcijoje initGame():

      eventEmitter.on(Messages.KEY_EVENT_ENTER, () => {
        resetGame();
      });
      
    4. Pridėkite funkciją clear() į EventEmitter:

      clear() {
        this.listeners = {};
      }
      

👽 💥 🚀 Sveikiname, Kapitone! Jūsų žaidimas baigtas! Puikiai padirbėta! 🚀 💥 👽


🚀 Iššūkis

Pridėkite garsą! Ar galite pridėti garsą, kad pagerintumėte žaidimo patirtį, galbūt kai lazeris pataiko, arba kai herojus miršta ar laimi? Pažvelkite į šį sandbox, kad sužinotumėte, kaip groti garsą naudojant JavaScript.

Klausimai po paskaitos

Klausimai po paskaitos

Apžvalga ir savarankiškas mokymasis

Jūsų užduotis yra sukurti naują pavyzdinį žaidimą, todėl išnagrinėkite keletą įdomių žaidimų, kad pamatytumėte, kokio tipo žaidimą galėtumėte sukurti.

Užduotis

Sukurkite pavyzdinį žaidimą


Atsakomybės apribojimas:
Šis dokumentas buvo išverstas naudojant AI vertimo paslaugą Co-op Translator. Nors siekiame tikslumo, atkreipkite dėmesį, kad automatiniai vertimai gali turėti klaidų ar netikslumų. Originalus dokumentas jo gimtąja kalba turėtų būti laikomas autoritetingu šaltiniu. Kritinei informacijai rekomenduojama profesionali žmogaus vertimo paslauga. Mes neprisiimame atsakomybės už nesusipratimus ar klaidingus interpretavimus, atsiradusius naudojant šį vertimą.