Transférer les fichiers vers ''

This commit is contained in:
Adrien MALINGREY 2020-09-04 19:42:37 +02:00
parent 704b9719cb
commit b0e4719bce
5 changed files with 238 additions and 0 deletions

BIN
favicon.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 370 B

BIN
fromage.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 444 B

29
index.html Normal file
View File

@ -0,0 +1,29 @@
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8" />
<title>Labyrinthe</title>
<script type="text/javascript" src="labyrinthe.js"></script>
<link rel="shortcut icon" type="image/png" href="mur.png"/>
<link rel="stylesheet" type="text/css" href="style.css" />
<link rel=”image_src” href="thumbnail.png" />
<meta property="og:title" content="Labyrinthe" />
<meta property="og:type" content="game" />
<meta property="og:url" content="https://malingrey.fr/laby" />
<meta property="og:image" content="https://malingrey.fr/laby/thumbnail.png" />
<meta property="og:image:width" content="250" />
<meta property="og:image:height" content="250" />
<meta property="og:description" content="Trouveras-tu le fromage ?" />
<meta property="og:locale" content="fr_FR" />
</head>
<body>
<div style="display:none;">
<img id="mur" src="mur.png">
<img id="sol" src="sol.png">
<img id="pas" src="pas.png">
<img id="fromage" src="fromage.png">
<img id="souris" src="souris.png">
</div>
<canvas id="canvas" width="795" height="585">Votre navigateur ne supporte pas HTML5, veuillez le mettre à jour pour jouer.</canvas>
</body>
</html>

209
labyrinthe.js Normal file
View File

@ -0,0 +1,209 @@
// Customize Array to be use as coordinates
Object.defineProperty(Array.prototype, "x", {
get: function () { return this[0] },
set: function (x) { this[0] = x}
})
Object.defineProperty(Array.prototype, "y", {
get: function () { return this[1] },
set: function (y) { this[1] = y}
})
Array.prototype.plus = function(other) { return this.map((x, i) => x + other[i]) }
const DIRECTION = {
"BAS": 0,
"GAUCHE": 1,
"DROITE": 2,
"HAUT": 3
}
const MOUVEMENT = {
"ARRET": [0, 0],
"BAS": [0, 1],
"HAUT": [0, -1],
"GAUCHE": [-1, 0],
"DROITE": [1, 0]
}
const ACTIONS = {
"ArrowUp": {"direction": DIRECTION.HAUT, "mouvement": MOUVEMENT.HAUT},
"ArrowDown": {"direction": DIRECTION.BAS, "mouvement": MOUVEMENT.BAS},
"ArrowLeft": {"direction": DIRECTION.GAUCHE, "mouvement": MOUVEMENT.GAUCHE},
"ArrowRight": {"direction": DIRECTION.DROITE, "mouvement": MOUVEMENT.DROITE},
}
const TYPE = {
"MUR": 1,
"SOL": 2,
"PAS": 3
}
const DIRECTIONS_LABYRINTHE = [MOUVEMENT.BAS, MOUVEMENT.HAUT, MOUVEMENT.GAUCHE, MOUVEMENT.DROITE]
const TAILLE_TUILE = 15
function dessinerTuile(context, image, x, y) {
context.drawImage(image, TAILLE_TUILE*x, TAILLE_TUILE*y);
}
class Labyrinthe extends Array {
constructor(largeur, hauteur, context, tuiles) {
super()
this.hauteur = hauteur
this.largeur = largeur
this.context = context
this.tuiles = tuiles
for (var ligne=0; ligne < hauteur; ligne++) {
this.push(Array(largeur).fill(TYPE.MUR))
}
this.positionInitiale = [1, 1]
this.positionFinale = [largeur - 2, hauteur - 2]
this.creuse(this.positionFinale)
this.construit(this.positionFinale)
}
construit(position) {
for (var direction of Array.from(DIRECTIONS_LABYRINTHE).sort(x => .5 - Math.random())) {
var pas1 = position.plus(direction)
var pas2 = pas1.plus(direction)
if (this.type(pas2) == TYPE.MUR) {
this.creuse(pas1)
this.creuse(pas2)
this.construit(pas2)
}
}
}
creuse(position) {
this[position.y][position.x] = TYPE.SOL
}
type(position) {
if (0 <= position.x && position.x < this.largeur && 0 <= position.y && position.y < this.hauteur) {
return this[position.y][position.x]
} else {
return -1
}
}
dessiner() {
this.forEach((ligne, y) => {
ligne.forEach((type, x) => {
dessinerTuile(this.context, this.tuiles[type], x, y)
})
})
}
}
class Souris {
constructor(position, context, sprites) {
this.position = position
this.context = context
this.sprites = sprites
this.futurePosition = this.position
this.direction = DIRECTION.DROITE
this.mouvement = MOUVEMENT.ARRET
this.tailleSprite = 48
this.animationSprite = 0
this.animation = 0
}
bouger(touche, labyrinthe) {
if (touche in ACTIONS) {
this.direction = ACTIONS[touche].direction
this.mouvement = ACTIONS[touche].mouvement
var futurePosition = this.position.plus(this.mouvement)
if ([TYPE.SOL, TYPE.PAS].includes(labyrinthe.type(futurePosition))) {
labyrinthe[this.position.y][this.position.x] = TYPE.PAS
this.futurePosition = futurePosition
return true
} else {
this.mouvement = MOUVEMENT.ARRET
this.animation = 0
return false
}
} else {
return False
}
}
dessiner() {
this.context.drawImage(
this.sprites,
this.tailleSprite * this.animationSprite,
this.tailleSprite * this.direction,
this.tailleSprite,
this.tailleSprite,
TAILLE_TUILE * this.position.x - 17 + this.mouvement.x * this.animation,
TAILLE_TUILE * this.position.y - 12 + this.mouvement.y * this.animation,
this.tailleSprite,
this.tailleSprite
);
}
}
window.onload = function() {
var canvas = document.getElementById('canvas')
var ctx = canvas.getContext('2d')
var fromage = document.getElementById("fromage");
var sourisSprites = document.getElementById("souris");
var tuiles = {}
tuiles[TYPE.MUR] = document.getElementById("mur")
tuiles[TYPE.SOL] = document.getElementById("sol")
tuiles[TYPE.PAS] = document.getElementById("pas")
var touchesPressees = new this.Set()
var largeur = Math.floor(window.innerWidth / TAILLE_TUILE)
largeur = largeur - ((largeur+1) % 2)
var hauteur = Math.floor(window.innerHeight / TAILLE_TUILE)
hauteur = hauteur - ((hauteur+1) % 2)
canvas.width = largeur * TAILLE_TUILE;
canvas.height = hauteur * TAILLE_TUILE;
var labyrinthe = new Labyrinthe(largeur, hauteur, ctx, tuiles)
var souris = new Souris(labyrinthe.positionInitiale, ctx, sourisSprites)
window.onkeydown = function(event) {
if (event.key in ACTIONS) {
touchesPressees.add(event.key)
return false
} else {
return true
}
}
window.onkeyup = function(event) {
if (event.key in ACTIONS) {
touchesPressees.delete(event.key)
return false
} else {
return true
}
}
var timerID
timerID = setInterval(function() {
if (touchesPressees.size > 0) souris.animationSprite = (souris.animationSprite + 1) % 3
if (souris.mouvement != MOUVEMENT.ARRET) {
souris.animation += 5
if (souris.animation >= TAILLE_TUILE) {
souris.animation = 0
souris.position = souris.futurePosition
if (souris.position.x == labyrinthe.positionFinale.x && souris.position.y == labyrinthe.positionFinale.y) {
window.alert("Miam miam !")
clearInterval(timerID)
}
}
}
if (souris.animation == 0) {
souris.mouvement = MOUVEMENT.ARRET
for (touche of Array.from(touchesPressees).reverse()) {
if (souris.bouger(touche, labyrinthe)) break
}
}
labyrinthe.dessiner()
dessinerTuile(ctx, fromage, labyrinthe.positionFinale.x, labyrinthe.positionFinale.y)
souris.dessiner()
}, 40);
}

BIN
mur.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 581 B