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

So erhalten Sie den Maximal- oder Minimalwert einer Zeile in SQL

Originaldaten und Zieldaten SQL-Anweisungen imple...

Singleton-Entwurfsmuster in JavaScript

Inhaltsverzeichnis 1. Was ist ein Entwurfsmuster?...

Zusammenfassung zum Erstellen und Verwenden von Array-Methoden in Bash-Skripten

Definieren eines Arrays in Bash Es gibt zwei Mögl...

Beispiele für die Verwendung von HTML-Metadaten

Beispielverwendung Code kopieren Der Code lautet w...

Analyse der Fallstricke beim Rundungsvorgang der ROUND-Funktion in MySQL

Dieser Artikel veranschaulicht anhand von Beispie...

Einführung in die Überwachung des MySQL MHA-Betriebsstatus

Inhaltsverzeichnis 1. Projektbeschreibung 1.1 Hin...

So betreiben Sie eine MySql-Datenbank mit Gorm

1. Festlegen der Groß-/Kleinschreibung von Felder...

Beitrag zur Übermittlung von HTML-Daten_PowerNode Java Academy

Zu den vom HTTP/1.1-Protokoll angegebenen HTTP-An...

Blog-Design Webdesign-Debüt

Die erste Webseite, die ich entworfen habe, sieht...