• Najnowsze pytania
  • Bez odpowiedzi
  • Zadaj pytanie
  • Kategorie
  • Tagi
  • Zdobyte punkty
  • Ekipa ninja
  • IRC
  • FAQ
  • Regulamin
  • Książki warte uwagi

Powtarzanie funkcji setInterval

Object Storage Arubacloud
0 głosów
338 wizyt
pytanie zadane 26 lipca 2017 w JavaScript przez czujek22 Dyskutant (7,670 p.)

Witam. Robię w javascript w canvas grę typu chicken invaders, galaxian itp. Mam problem bo nie wiem w jaki sposób zabrać się za automatyczne wystrzeliwanie pocisków przez statek. Zrobiłem już wystrzelenie jednego pocisku i wykonanie jego ruchu w góre lecz chciałbym aby pojawiały sie kolejne pociski np. co pół sekundy. 

<!DOCTYPE html>
<html>
  <head>
    <meta charset="utf-8">
    <title>Gra SpaceWar</title>
    <style media="screen">
      body {
        margin: 0;
        padding: 0;
        display: flex;
        align-items: center;
        justify-content: center;
        background: lightgray;
        height: 100vh;
      }
      canvas {
        border: 3px solid darkgray;
      }
    </style>
  </head>
  <body>
    <canvas></canvas>

    <script type="text/javascript">
      const canvas = document.querySelector('canvas');
      const ctx = canvas.getContext('2d');

      const boardWidth = canvas.width = 600;
      const boardHeight = canvas.height = 800;

      const spacecraftSize = 40;
      let spacecraftX = boardWidth / 2 - spacecraftSize / 2;
      let spacecraftY = boardHeight / 1.2;              // const w wypadku braku ruchu pionowo

      const bulletWidth = 5;
      const bulletHeight = 10;
      let bulletX = spacecraftX + spacecraftSize / 2;
      let bulletY = spacecraftY;
      let bulletSpeedX = 0;
      let bulletSpeedY = -3;

      function board() {
        ctx.fillStyle = "black";
        ctx. fillRect(0, 0, boardWidth, boardHeight);
      }

      function spacecraft() {
        ctx.fillStyle = 'white';
        ctx.fillRect(spacecraftX, spacecraftY, spacecraftSize, spacecraftSize);
      }

      function bullet() {
        ctx.fillStyle = 'white';
        ctx.fillRect(bulletX, bulletY, bulletWidth, bulletHeight);

        bulletX += bulletSpeedX;
        bulletY += bulletSpeedY;
      }

      function game() {
        board();
        spacecraft();
        bullet();
      }

      setInterval(game, 1000/60);

    </script>
  </body>
</html>

Byc może taki sposób by wypalił setInterval(setInterval(game, 1000/60), 1000); Jednak gdzieś trzeba resetować położenie nowej kuli aby leciała znowu od statku. Próbowałem różnych sposób, też pętlami ale nie wiem gdzie dać ten reset ustawień położenia kuli aby on dotyczył nowej kuli a nie tej co leci do góry

1 odpowiedź

0 głosów
odpowiedź 26 lipca 2017 przez Jedras Maniak (54,860 p.)

 Próbowałem różnych sposób, też pętlami ale nie wiem gdzie dać ten reset ustawień położenia kuli aby on dotyczył nowej kuli a nie tej co leci do góry

Najlepiej pociski przechowywać jako obiekty w jakiejś tablicy i później je rysować na planszy. Jak pocisk "przekroczy" ekran / uderzy w cel to go usuwasz z tablicy. Podobnie możesz zrobić z przeciwnikami. 

komentarz 26 lipca 2017 przez czujek22 Dyskutant (7,670 p.)
Ale wtedy liczba kul będzie skończona, tzn będę musiał włożyć do tablicy sporo pocisków a tak w jakiejś pętli dałbym warunek skończenia sie ich / przerwania strzelania
komentarz 26 lipca 2017 przez elwood Gaduła (4,180 p.)

Bez obiektów się nie obejdzie.  Jedras dobrze pisze i wcale nie musisz deklarować tablicy obiektów na samym początku mimo, iż jest to rozwiązanie bardziej zalecane w grach (wydajność)

Po prostu twórz nowy obiekt w momencie naciśnięcia klawisza (strzał) i zapisuj go do tablicy.

Podobne pytania

+1 głos
3 odpowiedzi 529 wizyt
pytanie zadane 26 kwietnia 2021 w JavaScript przez molik Użytkownik (950 p.)
0 głosów
1 odpowiedź 3,019 wizyt
pytanie zadane 20 lutego 2018 w JavaScript przez sosick Nowicjusz (160 p.)
0 głosów
1 odpowiedź 395 wizyt

92,555 zapytań

141,403 odpowiedzi

319,554 komentarzy

61,940 pasjonatów

Motyw:

Akcja Pajacyk

Pajacyk od wielu lat dożywia dzieci. Pomóż klikając w zielony brzuszek na stronie. Dziękujemy! ♡

Oto polecana książka warta uwagi.
Pełną listę książek znajdziesz tutaj.

Akademia Sekuraka

Kolejna edycja największej imprezy hakerskiej w Polsce, czyli Mega Sekurak Hacking Party odbędzie się już 20 maja 2024r. Z tej okazji mamy dla Was kod: pasjamshp - jeżeli wpiszecie go w koszyku, to wówczas otrzymacie 40% zniżki na bilet w wersji standard!

Więcej informacji na temat imprezy znajdziecie tutaj. Dziękujemy ekipie Sekuraka za taką fajną zniżkę dla wszystkich Pasjonatów!

Akademia Sekuraka

Niedawno wystartował dodruk tej świetnej, rozchwytywanej książki (około 940 stron). Mamy dla Was kod: pasja (wpiszcie go w koszyku), dzięki któremu otrzymujemy 10% zniżki - dziękujemy zaprzyjaźnionej ekipie Sekuraka za taki bonus dla Pasjonatów! Książka to pierwszy tom z serii o ITsec, który łagodnie wprowadzi w świat bezpieczeństwa IT każdą osobę - warto, polecamy!

...