Maison interface Web Questions et réponses frontales Comment écrire un mini-jeu en javascript

Comment écrire un mini-jeu en javascript

May 15, 2023 pm 09:31 PM

De nos jours, JavaScript est devenu une compétence indispensable dans le développement front-end. Il peut non seulement développer des effets interactifs sur des pages Web, mais également implémenter des mini-jeux simples. Cet article explique comment écrire des mini-jeux en JavaScript.

1. Préparation

Créez un nouveau dossier sur votre ordinateur local et donnez-lui un nom approprié. Créez un nouveau fichier HTML dans le dossier et ajoutez le code suivant en tête du fichier :

<!DOCTYPE html>
<html>
<head>
    <meta charset="UTF-8">
    <title>JavaScript Game</title>
</head>
<body>
    
</body>
<script src="main.js"></script>
</html>
Copier après la connexion

Le main.js voici le fichier script JavaScript à écrire. Ce qui est cité ici est que le fichier a été créé. Créez le fichier main.js et placez-le dans le même dossier que le fichier HTML. À ce stade, nous pouvons commencer à écrire du code JavaScript. main.js就是将要编写的JavaScript脚本文件,这里引用的是已创建完成的文件。创建main.js文件,和HTML文件放在同一个文件夹下,此时我们就可以开始编写JavaScript代码了。

二、编写游戏

  1. 创建画布

首先,在 HTML 文件中创建一个canvas元素,用来渲染游戏画面。

<body>
    <canvas id="myCanvas"></canvas>
</body>
Copier après la connexion

在 JavaScript 文件中,获取该元素的上下文(context),并将其保存在变量中。

var canvas = document.getElementById("myCanvas");
var ctx = canvas.getContext("2d");
Copier après la connexion

现在,我们已经可以在canvas画布上绘制图形了。

  1. 绘制游戏背景和其他物体

接下来,我们需要绘制游戏的背景和其他物体。在这里,我们可以分别定义不同的函数来绘制不同的物体,比如背景、球和挡板等。在这里,我们先定义一个函数,来绘制游戏的背景。

function drawBackground() {
    ctx.fillStyle = "#3c3c3c";
    ctx.fillRect(0, 0, canvas.width, canvas.height);
}
Copier après la connexion

在这个函数里,我们首先定义了一个颜色值用来填充画布背景,然后使用fillRect()方法来填充整个画布。

  1. 动态更新游戏

现在,我们已经拥有了用来绘制画布上各种物体的函数,该开始让游戏开始“动起来”了。

在这里,我们可以使用函数的递归调用方式来实现不断刷新游戏画面。这里我们定义一个函数update(),然后用window.requestAnimationFrame()来调用它,开始刷新游戏。

function update() {
    drawBackground();

    requestAnimationFrame(update);
}

update(); // 调用 update() 函数以开始刷新游戏
Copier après la connexion

在这个函数里,我们首先调用了drawBackground()函数来绘制游戏的背景。然后,我们使用requestAnimationFrame()函数调用了update()函数本身,来实现不断重复更新游戏画面的效果。

  1. 控制球移动方向

现在,我们已经可以在画布上绘制物体了,接下来我们需要加入控制球移动方向的操作。首先,我们定义一个小球保存用来记录它的位置信息,和方向信息。

var ball = {
    x: canvas.width/2,
    y: canvas.height-30,
    dx: 2,
    dy: -2,
    radius: 10
};
Copier après la connexion

在这个对象中,我们定义了球的起始位置(即画布的中心位置),dx和dy表示球的初始移动方向,radius为球的半径。

update()函数中,我们可以添加对球移动、碰撞检测等操作的代码。

function update() {
    drawBackground();

    // 移动球
    ball.x += ball.dx;
    ball.y += ball.dy;

    // 碰撞检测
    if(ball.x + ball.dx > canvas.width-ball.radius || ball.x + ball.dx < ball.radius) {
        ball.dx = -ball.dx;
    }
    if(ball.y + ball.dy > canvas.height-ball.radius || ball.y + ball.dy < ball.radius) {
        ball.dy = -ball.dy;
    }

    requestAnimationFrame(update);
}

update();
Copier après la connexion

在这个函数中,我们首先计算了球的移动,然后通过碰撞检测来检测球是否触碰了画布边缘。若是,则将球的运动方向反转,然后继续移动。

  1. 控制挡板移动

现在我们已经控制好了球的方向和行动,接下来需要加入控制挡板移动的操作。

var paddleHeight = 10;
var paddleWidth = 75;
var paddleX = (canvas.width-paddleWidth) / 2;

function drawPaddle() {
    ctx.beginPath();
    ctx.rect(paddleX, canvas.height-paddleHeight, paddleWidth, paddleHeight);
    ctx.fillStyle = "#0095DD";
    ctx.fill();
    ctx.closePath();
}

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

var rightPressed = false;
var leftPressed = false;

function keyDownHandler(e) {
    if(e.keyCode == 39) {
        rightPressed = true;
    }
    else if(e.keyCode == 37) {
        leftPressed = true;
    }
}

function keyUpHandler(e) {
    if(e.keyCode == 39) {
        rightPressed = false;
    }
    else if(e.keyCode == 37) {
        leftPressed = false;
    }
}

function update() {
    drawBackground();
    drawPaddle();

    // 移动球
    ball.x += ball.dx;
    ball.y += ball.dy;

    // 控制挡板移动
    if(rightPressed && paddleX < canvas.width-paddleWidth) {
        paddleX += 7;
    }
    else if(leftPressed && paddleX > 0) {
        paddleX -= 7;
    }

    // 碰撞检测
    if(ball.x + ball.dx > canvas.width-ball.radius || ball.x + ball.dx < ball.radius) {
        ball.dx = -ball.dx;
    }
    if(ball.y + ball.dy < ball.radius) {
        ball.dy = -ball.dy;
    }
    else if(ball.y + ball.dy > canvas.height-ball.radius) {
        if(ball.x > paddleX && ball.x < paddleX + paddleWidth) {
            ball.dy = -ball.dy;
        }
        else {
            alert("游戏结束");
            document.location.reload();
            clearInterval(interval);
        }
    }

    requestAnimationFrame(update);
}

update();
Copier après la connexion

在这里,我们首先定义了一个挡板的位置,和其长度、高度。然后我们通过drawPaddle()函数来绘制挡板,接下来监听keydownkeyup

2. Écrire le jeu

  1. Créer un canevas
Tout d'abord, créez un canevas dans le HTML élément code de fichier>, utilisé pour restituer l’écran de jeu. <p>rrreee</p>Dans le fichier JavaScript, récupérez le contexte de l'élément et enregistrez-le dans une variable. <p>rrreee</p>Maintenant, nous pouvons dessiner des graphiques sur le canevas <code>canvas.

  1. Dessinez l'arrière-plan du jeu et d'autres objets
Ensuite, nous devons dessiner l'arrière-plan du jeu et d'autres objets. Ici, nous pouvons définir différentes fonctions pour dessiner différents objets, tels que des arrière-plans, des boules et des déflecteurs. Ici, nous définissons d’abord une fonction pour dessiner l’arrière-plan du jeu.

rrreee

Dans cette fonction, nous définissons d'abord une valeur de couleur pour remplir l'arrière-plan du canevas, puis utilisons la méthode fillRect() pour remplir tout le canevas. #🎜🎜#
  1. Mise à jour dynamique du jeu
#🎜🎜#Maintenant que nous avons les fonctions pour dessiner divers objets sur la toile, il est temps de commencer Le jeu commence à « bouger ». #🎜🎜##🎜🎜#Ici, nous pouvons utiliser la méthode d'appel récursive de la fonction pour actualiser continuellement l'écran de jeu. Ici, nous définissons une fonction update(), puis utilisons window.requestAnimationFrame() pour l'appeler et commencer à actualiser le jeu. #🎜🎜#rrreee#🎜🎜#Dans cette fonction, on appelle d'abord la fonction drawBackground() pour dessiner l'arrière-plan du jeu. Ensuite, nous utilisons la fonction requestAnimationFrame() pour appeler la fonction update() elle-même afin d'obtenir l'effet de mise à jour répétée de l'écran de jeu. #🎜🎜#
  1. Contrôler la direction de déplacement de la balle
#🎜🎜#Maintenant que nous pouvons dessiner des objets sur la toile, nous devons ajouter le contrôle de les opérations de direction du mouvement du ballon. Tout d’abord, nous définissons une petite boule à sauvegarder pour enregistrer ses informations de position et ses informations de direction. #🎜🎜#rrreee#🎜🎜#Dans cet objet, nous définissons la position de départ de la balle (c'est-à-dire la position centrale de la toile), dx et dy représentent la direction initiale du mouvement de la balle, et radius est le rayon du ballon. #🎜🎜##🎜🎜#Dans la fonction update(), nous pouvons ajouter du code pour le mouvement de la balle, la détection de collision et d'autres opérations. #🎜🎜#rrreee#🎜🎜#Dans cette fonction, nous calculons d'abord le mouvement de la balle, puis utilisons la détection de collision pour détecter si la balle touche le bord de la toile. Si tel est le cas, inversez la direction du mouvement de la balle et continuez à vous déplacer. #🎜🎜#
  1. Contrôler le mouvement du déflecteur
#🎜🎜#Maintenant que nous avons contrôlé la direction et le mouvement de la balle, nous devons ajouter le contrôle du déflecteur Mobile opérations. #🎜🎜#rrreee#🎜🎜#Ici, on définit d'abord la position d'un baffle, sa longueur et sa hauteur. Ensuite, nous dessinons le cadre via la fonction drawPaddle(), puis écoutons les événements keydown et keyup pour détecter si l'utilisateur appuie sur la touche correspondante. touche. Déplacez la lunette. #🎜🎜##🎜🎜#En même temps, dans cette fonction, vous devez également ajouter du code pour détecter la collision entre la balle et le déflecteur. Si la balle touche le déflecteur, la direction y de la balle sera directement inversée. Par défaut, la balle continuera à bouger et ne pourra pas s'arrêter. Le jeu se termine lorsque le ballon touche complètement le bas de la toile. #🎜🎜##🎜🎜#3. Résumé#🎜🎜##🎜🎜#Jusqu'à présent, nous avons terminé l'écriture d'un petit jeu JavaScript. Il s'agit d'un simple petit exemple de jeu. Nous venons de terminer un jeu de base utilisant un canevas HTML5 et un script JavaScript. #🎜🎜##🎜🎜#Bien sûr, ces codes ne sont qu'un exemple fourni dans cet article et peuvent servir de base à l'écriture de jeux. Si nous voulons écrire des jeux à grande échelle avec un gameplay plus complexe, nous devons apprendre les bases de JavaScript et les compétences en développement de jeux plus en profondeur. #🎜🎜##🎜🎜#Si vous n'avez pas encore été exposé à ce domaine, alors essayez de suivre l'introduction de cet article et écrivez votre propre petit jeu ! #🎜🎜#

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Déclaration de ce site Web
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn

Outils d'IA chauds

Undresser.AI Undress

Undresser.AI Undress

Application basée sur l'IA pour créer des photos de nu réalistes

AI Clothes Remover

AI Clothes Remover

Outil d'IA en ligne pour supprimer les vêtements des photos.

Undress AI Tool

Undress AI Tool

Images de déshabillage gratuites

Clothoff.io

Clothoff.io

Dissolvant de vêtements AI

AI Hentai Generator

AI Hentai Generator

Générez AI Hentai gratuitement.

Article chaud

R.E.P.O. Crystals d'énergie expliqués et ce qu'ils font (cristal jaune)
3 Il y a quelques semaines By 尊渡假赌尊渡假赌尊渡假赌
R.E.P.O. Meilleurs paramètres graphiques
3 Il y a quelques semaines By 尊渡假赌尊渡假赌尊渡假赌
R.E.P.O. Comment réparer l'audio si vous n'entendez personne
3 Il y a quelques semaines By 尊渡假赌尊渡假赌尊渡假赌
WWE 2K25: Comment déverrouiller tout dans Myrise
4 Il y a quelques semaines By 尊渡假赌尊渡假赌尊渡假赌

Outils chauds

Bloc-notes++7.3.1

Bloc-notes++7.3.1

Éditeur de code facile à utiliser et gratuit

SublimeText3 version chinoise

SublimeText3 version chinoise

Version chinoise, très simple à utiliser

Envoyer Studio 13.0.1

Envoyer Studio 13.0.1

Puissant environnement de développement intégré PHP

Dreamweaver CS6

Dreamweaver CS6

Outils de développement Web visuel

SublimeText3 version Mac

SublimeText3 version Mac

Logiciel d'édition de code au niveau de Dieu (SublimeText3)

Qu'est-ce que l'utilisation Effecte? Comment l'utilisez-vous pour effectuer des effets secondaires? Qu'est-ce que l'utilisation Effecte? Comment l'utilisez-vous pour effectuer des effets secondaires? Mar 19, 2025 pm 03:58 PM

L'article traite de l'utilisation Effecte dans React, un crochet pour gérer les effets secondaires comme la récupération des données et la manipulation DOM dans les composants fonctionnels. Il explique l'utilisation, les effets secondaires courants et le nettoyage pour éviter des problèmes comme les fuites de mémoire.

Expliquez le concept de chargement paresseux. Expliquez le concept de chargement paresseux. Mar 13, 2025 pm 07:47 PM

Le chargement paresseux retarde le chargement du contenu jusqu'à ce qu'il soit nécessaire, améliorant les performances du Web et l'expérience utilisateur en réduisant les temps de chargement initiaux et la charge du serveur.

Comment fonctionne l'algorithme de réconciliation React? Comment fonctionne l'algorithme de réconciliation React? Mar 18, 2025 pm 01:58 PM

L'article explique l'algorithme de réconciliation de React, qui met à jour efficacement le DOM en comparant les arbres DOM virtuels. Il traite des avantages de la performance, des techniques d'optimisation et des impacts sur l'expérience utilisateur. Compte de charge: 159

Comment fonctionne le currying en JavaScript et quels sont ses avantages? Comment fonctionne le currying en JavaScript et quels sont ses avantages? Mar 18, 2025 pm 01:45 PM

L'article traite du curry dans JavaScript, une technique transformant les fonctions mulguments en séquences de fonctions à argument unique. Il explore la mise en œuvre du currying, des avantages tels que des applications partielles et des utilisations pratiques, améliorant le code

Quelles sont les fonctions d'ordre supérieur en JavaScript, et comment peuvent-ils être utilisés pour écrire du code plus concis et réutilisable? Quelles sont les fonctions d'ordre supérieur en JavaScript, et comment peuvent-ils être utilisés pour écrire du code plus concis et réutilisable? Mar 18, 2025 pm 01:44 PM

Les fonctions d'ordre supérieur dans JavaScript améliorent la concision du code, la réutilisabilité, la modularité et les performances par abstraction, modèles communs et techniques d'optimisation.

Qu'est-ce que UseContext? Comment l'utilisez-vous pour partager l'état entre les composants? Qu'est-ce que UseContext? Comment l'utilisez-vous pour partager l'état entre les composants? Mar 19, 2025 pm 03:59 PM

L'article explique UseContext dans React, qui simplifie la gestion de l'État en évitant le forage des accessoires. Il traite des avantages tels que les améliorations centralisées de l'État et des performances grâce à des redevances réduites.

Comment connectez-vous les composants React au magasin Redux à l'aide de Connect ()? Comment connectez-vous les composants React au magasin Redux à l'aide de Connect ()? Mar 21, 2025 pm 06:23 PM

L'article discute de la connexion des composants React à Redux Store à l'aide de Connect (), expliquant MapStateToproprop, MapDispatchToprops et des impacts de performances.

Comment empêchez-vous le comportement par défaut dans les gestionnaires d'événements? Comment empêchez-vous le comportement par défaut dans les gestionnaires d'événements? Mar 19, 2025 pm 04:10 PM

L'article discute de la prévention des comportements par défaut dans les gestionnaires d'événements à l'aide de la méthode empêchée dedEfault (), de ses avantages tels que une expérience utilisateur améliorée et des problèmes potentiels tels que les problèmes d'accessibilité.

See all articles