Implementierung eines einfachen Weihnachtsspiels mit JavaScript

Implementierung eines einfachen Weihnachtsspiels mit JavaScript

Vorwort

Weihnachten steht vor der Tür und die Hotlists sind mit einem Haufen Weihnachtsbäumen belegt. Wie könnte ich ein solches Verkehrskennwort übersehen? Jeder postet Weihnachtsbäume, also werde ich keinen posten. Ich werde einfach ein Weihnachtsspiel mit allen teilen, die es spielen können. Der Code ist zu lang, also liken und sammeln Sie ihn bitte zuerst.

Ergebnisse erzielen

Der Produktionsprozess eines einfachen 2D-Web-Spiels hat seine eigenen Regeln. Jeder Teil davon hat eine bestimmte Routine. Wir sollten

Fassen Sie die regulären Teile zu einer Vorlage zusammen. Sobald die entsprechende Vorlage geschrieben ist, kann sie verwendet werden, wenn ein bestimmtes Objekt hergestellt werden soll.

Die Vorlage sowie jede Funktion des gesamten Spielprozesses und jede JS-Datei haben eine klare Arbeitsteilung. Wir müssen sie vor dem Schreiben zusammenfassen.

Schreiben Sie nicht, was Ihnen in den Sinn kommt. Obwohl das Ergebnis das gleiche ist, ist der Code möglicherweise nicht sehr lesbar und wartbar, und die Idee ist nicht sehr

Klar.

Code

Zum Code gibt es nicht viel zu sagen. Ich füge den Code einfach für Sie ein. Er ist einfach und direkt. Solange er ausgeführt und gespielt werden kann, können Sie ihn mit Ihren Freunden teilen oder selbst damit spielen, einfach zum Spaß. Ich habe die Dateien gepackt, bei Bedarf schickt sie mir bitte zu.

CSS Code

Körper { Hintergrund: RGB (8,8,58);
  Rand: 0;
}

#Wrapper {
  Breite: 500px;
  Rand links: automatisch;
  Rand rechts: automatisch;
  Rand oben: 20px;
}

JS-Code

​var canvas = document.getElementById("canvas"),
    ctx = canvas.getContext("2d"),
    elfImage = document.getElementById("elf");
grünesGeschenkImage = document.getElementById("grünes_Geschenk");
rotesGeschenkImage = document.getElementById("rotes_Geschenk");
blauesGeschenkImage = document.getElementById("blaues_Geschenk");
bombImage = document.getElementById("bombe");
bangImage = document.getElementById("bang");

var x = Leinwand.Breite/2;
var y = Leinwand.Höhe-30;
var dx = 2;
var dy = -2;
const elfHeight = 70;
const elfWidth = 55;
var elfX = (canvas.width-elfWidth)/2;
const elfSpeed ​​​​= 10;
var rechtsGedrückt = false;
var leftPressed = false;
var spacePressed = false;
var SpawnInterval;
var spawnTimer = 50;
var Geschenke = [];
var maxGeschenk = 0;
const Geschenkbreite = 40;
const Geschenkhöhe = 40;
var Timer = 0;
var GeschenkRotation = 0;
const TO_RADIANS = Math.PI/180; 
Var-Punktzahl = 0;
var Gesundheit = 3;
const bombChance = 5;
var elfRotation = 0;
var bangX;
var bangZeit;
var Schneehöhe = 6;
var spawnTimeChangeInterval = 3000;
var Titelfarben = [];

// Schneeflockenkram
var Schneeflocken = [];
const maxSnowflakes = 80;
const Schneeflockengröße = 3;
const snowflakeMinSpeed ​​​​= 1;
const snowflakeMaxSpeed ​​​​= 4;
const snowflakeColours = ["rgba(255,255,255,0.95)", "rgba(255,255,255,0.65)","rgba(255,255,255,0.4)"];

const Spielmodi = {
  TITEL: 'Titel',
  SPIELEN: 'spielen',
  SPIELENDE: 'Spielende'
};

var gameMode = gameModes.TITEL;

document.addEventListener("keydown", keyDownHandler, false);
document.addEventListener("keyup", keyUpHandler, false);

Funktion keyDownHandler(e) {
  if(e.key == "Rechts" || e.key == "PfeilRechts") {
    rechtsgedrückt = wahr;
  }
  sonst wenn(e.key == "Links" || e.key == "PfeilLinks") {
    linksgedrückt = wahr;
  } sonst wenn(e.code == "Leerzeichen") {
    Leertaste gedrückt = wahr;
  }
}

Funktion keyUpHandler(e) {
  if(e.key == "Rechts" || e.key == "PfeilRechts") {
    rechtsgedrückt = falsch;
  }
  sonst wenn(e.key == "Links" || e.key == "PfeilLinks") {
    linksgedrückt = falsch;
  } sonst wenn(e.code == "Leerzeichen") {
    Leertaste gedrückt = falsch;
  }
}

Funktion zeichnen() {
  ctx.clearRect(0, 0, Leinwandbreite, Leinwandhöhe);
  zeichneSchnee();

  Zeitgeber++;

  Schalter (Spielmodus) {
    Fall gameModes.TITLE:
      TitelBildschirm(); 
      brechen;
    Fall gameModes.GAMEOVER:
      Spiel vorbei();
      brechen;
    Fall gameModes.PLAYING:
      SpielLoop();
      brechen;
  }
}

Funktion Titelbildschirm() {
  wenn (Timer > Titelfarben.Länge) Timer=0;

  ctx.font = "50px Arial";
  ctx.fillStyle = Titelfarben[Timer]; 
  ctx.fillText(`Schnapp dir Weihnachtsgeschenke!`, 0, 50);
  ctx.fillStyle = "gelb"; 

  ctx.font = "30px Arial";
  ctx.fillText(`Drücken Sie die Leertaste, um zu starten!`, 65, 140);

  var highScore = getHighScore();
  if (highScore != -1) ctx.fillText(`Höchster Score: ${highScore}`, 90, 220);

  drawRotatedImage(elfImage, canvas.width/2 - elfWidth/2, 330, elfRotation, 200);
  elfRotation+=2;
  wenn (elfRotation > 359) elfRotation = 0;

  if (Leertaste gedrückt && Timer > 5) {
    setGameMode(spielmodi.SPIELEN);
  }
}

Funktion gameLoop() {
  zeichneSchneePerson();
  spawnGifts();
  Geschenke verarbeiten();
  zeichneFloor();
  zeichneHUD();
  zeichneElf();
  zeichneBang();

  if(rechtsGedrückt) {
    elfX += elfGeschwindigkeit;
    wenn (elfX + elfWidth > canvas.width){
      elfX = Leinwand.Breite - (elfBreite + 5);
    }
  }
  sonst wenn(linksgedrückt) {
    elfX -= elfGeschwindigkeit;
    wenn (elfX < -15){
      elfX = -15;
    }
  }
}

Funktion gameOver() {
  ctx.font = "50px Arial";
  ctx.fillStyle = "gelb";
  ctx.fillText(`SPIEL VORBEI!`, 80, 200);
  ctx.font = "30px Arial";
  ctx.fillText(`Endergebnis: ${score}`,130, 240);
  ctx.fillText('Zum Fortfahren die Leertaste drücken',80, 280);

  if (Leertaste gedrückt && Timer > 5) {
    initialisiereSpiel();
    setGameMode(Spielmodi.TITEL);
  }
}

Funktion verarbeiteGeschenke() {
  Geschenke.fürJeden((g) => {
    wenn (g und g.alive) { 
      // Geschenk verlosen
      Geschenk ziehen(g);
      wenn (gy > Leinwand.Höhe) {
        g.alive = falsch;
        wenn (!g.bomb) Punktzahl--;
      }

      //Geschenk verschieben
      g.y+=g.Geschwindigkeit;

      // Geschenk drehen
      g.rotation+=5;
      wenn (g.rotation > 359) g.rotation = 0;

      // auf Kollision prüfen
      wenn ((gy + (Geschenkhöhe/2)) >= ((Leinwandhöhe - Elfenhöhe - Schneehöhe) + 20)
          && (gy<canvas.height-snowHeight+20)) {
        wenn ((elfX + 25) <= (gx + (Geschenkbreite/2)) und ((elfX+20) + (elfBreite)) >= gx)
        {
          g.alive = falsch;
          wenn (!g.bomb) { 
            Punktzahl+=5;
          } anders {
            doBombCollision();
          }
        }
      }
    }
  });
}

Funktion zeichneGeschenk(g) {
  Schalter (g.Farbe) {
    Fall 1:
      zeichneFarbigesGeschenk(grünesGeschenkbild, g);
      brechen;
    Fall 2:
      zeichneFarbigesGeschenk(rotesGeschenkbild, g);
      brechen;
    Fall 3:
      zeichneFarbigesGeschenk(blauesGeschenkbild, g);
      brechen;
    Fall 4:
      zeichneRotatedImage(bombImage, gx, gy, 180, 45);
      brechen;
  }
}

Funktion zeichneFarbigesGeschenk(Farbbild, g) {
  zeichneRotatedImage(Farbbild, gx, gy, g.rotation, 35);
}

Funktion doBombCollision() {
  Gesundheit--;
  bangX=elfX;
  Bang-Zeit = 5;
  wenn (Gesundheit == 0) {
    setzeHighScore();
    setGameMode(gameModes.GAMEOVER);
  }
}

Funktion drawBang() {
  wenn (bangTime > 0) {
    Knallzeit--;
    ctx.drawImage(bangImage, bangX, (canvas.height-75)-snowHeight, 75,75);
  }
}


Funktion zeichneElf() {
  ctx.drawImage(elfImage, elfX,(Leinwandhöhe - elfHeight) - (Schneehöhe - 2),80,80);
}

Funktion spawn() {
  var newX = 5 + (Math.random() * (canvas.width - 5));

  var Farbe;
  var Bombe = falsch;

  wenn (Zufallszahl(1,Bombenchance) == Bombenchance) {
    Farbe = 4;
    Bombe = wahr;
  } anders {
    Farbe = Zufallszahl(1,3);
  }

  var neuesGeschenk = {
    x: neuesX,
    y: 0,
    Geschwindigkeit: Zufallszahl(2,6),
    lebendig: wahr,
    Drehung: 0,
    Farbe: Farbe,
    Bombe: Bombe,
  };

  Geschenke[max.Geschenk] = neuesGeschenk;
  maxGeschenk++;
  wenn (maxGeschenk > 75) {
    maxGeschenk = 0;
  }
}

Funktion spawnGifts() {
  wenn (Timer > SpawnTimer) {
    laichen();
    Zeitgeber = 0;
  }
}

Funktion drawRotatedImage(Bild, x, y, Winkel, Maßstab)
{ 
  ctx.speichern(); 
  ctx.translate(x, y);
  ctx.rotate(Winkel * TO_RADIANS);
  ctx.drawImage(Bild, -(Bildbreite/2), -(Bildhöhe/2), Maßstab, Maßstab);
  ctx.wiederherstellen(); 
}

Funktion drawHUD() {
  ctx.font = "20px Arial";
  ctx.fillStyle = "gelb";
  ctx.fillText(`Punktzahl: ${score}`, 0, 25);

  var Herz = "❤";
  var Herzen = Gesundheit > 0? Herz.Wiederholung(Gesundheit): " ";
  ctx.fillText("Hilfe:", canvas.width - 120, 25);
  ctx.fillStyle = "rot";
  ctx.fillText(`${hearts}`, Leinwand.Breite - 60, 26);
}

Funktion initialiseGame() {
  Gesundheit = 3;
  elfX = (Leinwand.Breite-elfWidth)/2;
  Bang-Zeit = 0;
  Punktzahl = 0;
  Schneehöhe = 6;
  Zeitgeber = 0;
  SpawnTimer = 50;
  Geschenke = [];
}

Funktion initialisiereSchnee() {
  für (i=0; i<maxSnowflakes; i++) {
    var startY = -randomNumber(0, canvas.height);
    Schneeflocken[i] = {
      x: Zufallszahl(0, Leinwandbreite-Schneeflockengröße),
      y: startY,
      startY: startY,
      Farbe: Schneeflockenfarben[Zufallszahl(0,3)],
      Radius: (Math.random() * 3 + 1),
      Geschwindigkeit: Zufallszahl(Mindestgeschwindigkeit der Schneeflocke, Höchstgeschwindigkeit der Schneeflocke)
    };
  }
}

Funktion zeichneSchnee() {
  für (i=0; i<maxSnowflakes; i++) {
    Schneeflocken[i].y+=Schneeflocken[i].Geschwindigkeit;
    wenn (Schneeflocken[i].y>Leinwandhöhe) Schneeflocken[i].y = Schneeflocken[i].startY;
    ctx.beginPath();
    ctx.arc(Schneeflocken[i].x, Schneeflocken[i].y, Schneeflocken[i].radius, 0, 2 * Math.PI, false);
    ctx.fillStyle = Schneeflocken[i].Farbe;
    ctx.fill();
  }
}

Funktion drawFloor() {
  var snowTopY = canvas.height - Schneehöhe;

  ctx.fillStyle = "#fff";
  ctx.beginPath();
  ctx.moveTo(0, snowTopY);
  ctx.lineTo(canvas.width, snowTopY);
  ctx.lineTo(Leinwand.Breite, Leinwand.Höhe);
  ctx.lineTo(0, Leinwand.Höhe);
  ctx.closePath();
  ctx.fill();
}

Funktion zeichneSchneePerson() {
  var snowTopY = canvas.height - Schneehöhe;

  zeichneKreis("#fff", 100, snowTopY-20, 40);
  zeichneKreis("#fff", 100, snowTopY-70, 20);
  zeichneRechteck("#835C3B", 85, snowTopY-105, 30, 20);
  zeichneRechteck("#835C3B", 75, snowTopY-90, 50, 6);
  zeichneTriangle("#ffa500", 100, snowTopY-64, 7);
  zeichneKreis("#000", 93, snowTopY-76, 3);
  zeichneKreis("#000", 108, snowTopY-76, 3);
  zeichneKreis("#000", 100, snowTopY-40, 2);
  zeichneKreis("#000", 100, snowTopY-30, 2);
  zeichneKreis("#000", 100, snowTopY-20, 2);
}

Funktion drawTriangle(Farbe, x, y, Höhe) {
  ctx.strokeStyle = ctx.fillStyle = Farbe;
  ctx.beginPath();
  ctx.moveTo(x, y);
  ctx.lineTo(x – Höhe, y – Höhe);
  ctx.lineTo(x + Höhe, y - Höhe);
  ctx.fill();
}

Funktion drawCircle(Farbe, x, y, Radius) {
  ctx.strokeStyle = ctx.fillStyle = Farbe;
  ctx.beginPath();
  ctx.arc(x, y, Radius, 0, Math.PI * 2, true);
  ctx.closePath();
  ctx.stroke();
  ctx.fill();
}

Funktion drawRectangle(Farbe, x, y, Breite, Höhe) {
  ctx.strokeStyle = ctx.fillStyle = Farbe;
  ctx.fillRect(x, y, Breite, Höhe);
}

Funktion Zufallszahl(niedrig, hoch) {
  gibt Math.floor(Math.random() * hoch) + niedrig zurück; 
}

Funktion makeColorGradient(Frequenz1, Frequenz2, Frequenz3,
                            phase1, phase2, phase3,
                            Mitte, Breite, Länge) {
  var Farben = [];

  für (var i = 0; i < len; ++i)
  {
    var r = Math.sin(Frequenz1*i + Phase1) * Breite + Mitte;
    var g = Math.sin(Frequenz2*i + Phase2) * Breite + Mitte;
    var b = Math.sin(Frequenz3*i + Phase3) * Breite + Mitte;
    Farben.push(RGB2Color(r,g,b));
  }
  Farben zurückgeben;
}

Funktion RGB2Farbe(r,g,b) {
  gibt '#' + byte2Hex(r) + byte2Hex(g) + byte2Hex(b) zurück;
}

Funktion byte2Hex(n) {
  var nybHexString = "0123456789ABCDEF";
  gibt String zurück (nybHexString.substr((n >> 4) & 0x0F,1)) + nybHexString.substr(n & 0x0F,1);
}

Funktion setzeFarbverlauf() {
  Mitte = 128;
  Breite = 127;
  Schritte = 6;
  Frequenz = 2*Math.PI/Schritte;
  returniere makeColorGradient(Frequenz,Frequenz,Frequenz,0,2,4,Mitte,Breite,50);
}

Funktion initialiseSpawnInterval() {
  wenn (Spielmodus === Spielmodi.SPIELEN && spawnTimer>2) {
    spawnTimer--;
    spawnTimeChangeInterval -= 50;
  }
}

Funktion setGameMode(Modus) {
  gameMode = Modus;
  Zeitgeber=0;
}

Funktion raiseSnow() {
  wenn (Spielmodus === Spielmodi.SPIELEN && Schneehöhe < Leinwandhöhe) {
    Schneehöhe++;
  }
}

Funktion setzeHighScore() {
  var currentHighScore = getHighScore();
  wenn (aktuellerHöchststand != -1 && Punktzahl > aktuellerHöchststand) {
    localStorage.setItem("highScore", Punktzahl);
  }
}

Funktion getHighScore() {
  wenn (!localStorage) return -1;
  var highScore = localStorage.getItem("highScore");
  gib Highscore zurück || 0;
}

Titelfarben = Farbverlauf festlegen();
initialisiereSchnee();
setzeInterval(zeichnen, 30);
setInterval(initialisierenSpawnInterval, spawnTimeChangeInterval);
setInterval(erhöhenSnow, 666);

HTML Quelltext

<!DOCTYPE html>
<html lang="de" >
<Kopf>
<meta charset="UTF-8">
<title>Elfengeschenke fangen</title>

<link rel="stylesheet" href="css/style.css" rel="external nofollow" >#Der Code ist zu lang, wenn N Zeichen weggelassen werden</head>
<Text>

<div id="Wrapper">

	<Leinwand-ID = "Leinwand" Breite = "450" ​​Höhe = "540"></Leinwand>
	
</div>


  
</div>

<script src="js/script.js"></script>

</body>
</html>

Demonstrationsprozess

Es gibt drei gepackte Dateien, einen CSS-Code, einen JS-Code und eine HTML-Datei. Nach dem Packen können Sie es direkt ausführen, indem Sie auf die HTML-Datei klicken.

Oben finden Sie Einzelheiten zur Verwendung von JavaScript zur Implementierung eines einfachen Weihnachtsspiels. Weitere Informationen zu JavaScript-Weihnachtsspielen finden Sie in den anderen verwandten Artikeln auf 123WORDPRESS.COM!

Das könnte Sie auch interessieren:
  • Mit JS einen rotierenden Weihnachtsbaum in HTML implementieren
  • Detaillierte Erklärung des dynamischen Weihnachtsbaums durch JavaScript
  • JavaScript-Implementierungscode für blinkende Weihnachtsbäume
  • JS praktisches objektorientiertes Schlangenspielbeispiel
  • HTML+CSS+JavaScript zum Erstellen eines einfachen Tic-Tac-Toe-Spiels
  • Implementierung des Whack-a-Mole-Spiels in JavaScript

<<:  Umfassendes Verständnis der HTML-Grundstruktur

>>:  Reines CSS und Flutter realisieren jeweils einen atmenden Lichteffekt (Beispielcode)

Artikel empfehlen

Drei Möglichkeiten zur Implementierung von Animationen in CSS3

Hiermit werden die Grundkenntnisse des Interviewt...

MySQL-Abfrage redundanter Indizes und ungenutzter Indexoperationen

MySQL 5.7 und höhere Versionen ermöglichen die di...

Detaillierte Erklärung der Vue-Anmeldung und -Abmeldung

Inhaltsverzeichnis Login-Geschäftsprozess Impleme...

Lassen Sie uns ausführlich über die gemeinsame MySQL-Abfrage sprechen

Inhaltsverzeichnis Union-Abfrage 1. Fragen Sie di...

Detaillierte Erklärung der Docker-Nutzung unter CentOS8

1. Installation von Docker unter CentOS8 curl htt...

Zusammenfassung häufig verwendeter Leistungstestskripte für VPS-Server

Hier ist ein allgemeines Ein-Klick-Leistungstests...

So fragen Sie Datum und Uhrzeit in MySQL ab

Vorwort: Bei der Projektentwicklung werden in ein...

MySQL-Dienst und Datenbankverwaltung

Inhaltsverzeichnis 1. Anweisungen zum Starten und...

Docker stellt über einen Port eine Verbindung zu einem Container her

Docker-Container-Verbindung 1. Netzwerk-Port-Mapp...

Das neueste Installations-Tutorial für virtuelle Maschinen VMware 14

Zuerst gebe ich Ihnen den Aktivierungscode für VM...

Vue implementiert eine kleine Formularvalidierungsfunktion

In diesem Artikelbeispiel wird der spezifische Co...

So implementieren Sie Element-Floating und Clear-Floating mit CSS

Grundlegende Einführung in das Floating Im Standa...

Webpack lädt CSS-Dateien und ihre Konfigurationsmethode

webpack lädt CSS-Dateien und deren Konfiguration ...