xxxxxxxxxx
308
// Variable globale pour les éléments de fond
let dayNightSystem; // Cycle Jour | Nuit
let dayImage; // Pour stocker l'image de fond Jour
let nightImage; // Pour stocker l'image de fond Nuit
// Variable globale pour les éléments d'UI
let interfaceElements;
let helpMenu;
let mobileControls;
// Variable globale pour les images
let backgroundP; // Fond Parallax
let paragliderImg; // Pour stocker l'image du parapentiste
let paraglider; // Objet Parapentiste
// Variables globale pour les effets
let atmosphericEffects;
// Variable globale pour le son
let ambientSound;
let cloudGroups = [];
let windParticles = [];
// Variables globales pour le contrôle de direction
let windDirection = "right"; // Direction textuelle pour la compatibilité avec l'ancien système
let windSpeed = 1; // Nouvelle variable pour la vitesse du vent
const WIND_DIRECTIONS = {
right: 0,
left: 180,
upRight: 45,
upLeft: 135,
downRight: 315,
downLeft: 225,
};
let currentDirection = 45; // Direction en degrés pour le nouveau système
const ratio = 400 / 200; // Ratio de l'affiche
const formatL = 500; // Largeur
const formatH = formatL * ratio; // Hauteur
//* ====================================================== *//
// Fonction preload qui s'exécute avant setup()
function preload() {
interfaceElements = new InterfaceElements();
// Chargement des images
dayImage = loadImage("./assets/images/backgroundDay.png");
nightImage = loadImage("./assets/images/backgroundNight.png");
// Chargez votre image de parapente ici
paragliderImg = loadImage("./assets/images/parapentiste.png");
// Initialisation du son d'ambiance
ambientSound = new AmbientSound();
// Chargez votre fichier audio ici (format mp3 recommandé)
ambientSound.load("./assets/sounds/en_suspension_sae.aac");
}
//* ====================================================== *//
// Fonction modifiée pour gérer les deux systèmes de direction
function changeWindDirection(direction) {
windDirection = direction;
// Conversion de la direction textuelle en degrés
currentDirection = WIND_DIRECTIONS[direction];
// Mise à jour des particules
windParticles.forEach((particle) => {
particle.direction = direction; // Pour l'ancien système
particle.setMovementDirection(currentDirection); // Pour le nouveau système
});
}
// Fonction pour changer la direction du vent et des nuages
function changeDirection(newDirection) {
currentDirection = newDirection;
// La vitesse du vent peut varier légèrement lors des changements de direction
windSpeed = random(0.8, 1.2);
// Mise à jour de la direction des nuages
cloudGroups.forEach((group) => {
group.clouds.forEach((cloud) => {
// Ajout d'une légère variation pour chaque nuage
let cloudDirection = currentDirection + random(-15, 15);
cloud.setMovementDirection(cloudDirection);
});
});
// Mise à jour de la direction des particules de vent
windParticles.forEach((particle) => {
particle.setMovementDirection(currentDirection);
});
}
// Fonction modifiée pour gérer les deux systèmes de direction
function changeWindDirection(direction) {
windDirection = direction;
// Conversion de la direction textuelle en degrés
currentDirection = WIND_DIRECTIONS[direction];
// Mise à jour des particules
windParticles.forEach((particle) => {
particle.direction = direction; // Pour l'ancien système
particle.setMovementDirection(currentDirection); // Pour le nouveau système
});
}
//* ====================================================== *//
function setup() {
createCanvas(formatL, formatH);
dayNightSystem = new DayNightSystem(dayImage, nightImage);
atmosphericEffects = new AtmosphericEffects();
backgroundP = new Background(dayImage); // Fond Parallax
paraglider = new Paraglider(); // Parapentiste
// Création de quelques groupes de nuages
for (let i = 0; i < 3; i++) {
let x = random(width * 0.2, width * 0.8);
let y = map(i, 0, 2, height * 0.2, height * 0.4);
cloudGroups.push(new CloudGroup(x, y));
}
// Création d'un nombre limité de particules
// Création des particules de vent
for (let i = 0; i < WindParticle.maxParticles; i++) {
let particle = new WindParticle();
particle.setMovementDirection(currentDirection);
windParticles.push(particle);
}
// Démarrage progressif du son d'ambiance
ambientSound.fadeIn();
helpMenu = new HelpMenu();
mobileControls = new MobileControls();
// Ajout des écouteurs d'événements tactiles
canvas.addEventListener("touchstart", (e) =>
mobileControls.handleTouchStart(e)
);
canvas.addEventListener("touchmove", (e) =>
mobileControls.handleTouchMove(e)
);
canvas.addEventListener("touchend", (e) => mobileControls.handleTouchEnd(e));
}
//* ====================================================== *//
function draw() {
// Fond bleu ciel
background("#2488dc");
// Dessin de l'image de fond des montagnes
push();
// L'image doit être positionnée en bas du canvas
imageMode(CORNER);
// Calculons la taille appropriée pour maintenir les proportions
let imgRatio = dayImage.height / dayImage.width;
let desiredWidth = width;
let desiredHeight = desiredWidth * imgRatio;
// Positionnement de l'image au bas du canvas
let yPosition = height - desiredHeight;
image(dayImage, 0, yPosition, desiredWidth, desiredHeight);
pop();
// Dessiner le paysage montagneux
image(dayImage, 0, yPosition, desiredWidth, desiredHeight);
// Calculer la vitesse du vent basée sur la direction actuelle
let calculatedWindSpeed = 1 + sin(frameCount * 0.01) * 0.2; // Variation légère
// Mettre à jour les effets atmosphériques
atmosphericEffects.setWind(currentDirection, calculatedWindSpeed);
// Mise à jour des effets atmosphériques
atmosphericEffects.update();
// Affichage des effets atmosphériques
atmosphericEffects.display();
backgroundP.display(mouseX);
// Mise à jour et affichage des groupes de nuages
cloudGroups.forEach((group) => {
group.update(); // Ajout de l'appel à update()
group.display();
});
// Mise à jour et affichage des particules de vent
for (let particle of windParticles) {
particle.update();
particle.display();
}
// Ajuster l'intensité de la brume selon l'altitude du parapentiste
atmosphericEffects.adjustMistByHeight(paraglider.y);
// Changer le curseur si on survole le QR code
if (interfaceElements.isOverQRCode()) {
cursor(HAND);
} else {
cursor(ARROW);
}
// Appliquer l'effet jour/nuit en dernier
dayNightSystem.display();
// Afficher les éléments d'interface en dernier pour qu'ils soient au-dessus
interfaceElements.display();
// Mise à jour et affichage du parapentiste
paraglider.update();
paraglider.display();
// ------------------------------------Debug------------------------------
if (keyIsDown(66)) {
// Touche 'B' pour Debug
push();
stroke(255, 0, 0);
noFill();
circle(mouseX, mouseY, 600); // Visualisation du rayon d'influence
fill(0);
text(`Mouse position: ${mouseX}, ${mouseY}`, 10, 20);
text(
`Nombre de nuages: ${cloudGroups.reduce(
(acc, group) => acc + group.clouds.length,
0
)}`,
10,
40
);
pop();
}
// Mise à jour du son selon la hauteur du parapentiste
ambientSound.adjustVolumeByHeight(paraglider.y, height);
// Mise à jour et affichage du contrôle du son
ambientSound.update();
ambientSound.display();
// Affichage du menu d'aide en dernier pour qu'il soit toujours visible
helpMenu.display();
// Mise à jour et affichage des contrôles mobiles
if (MobileControls.isMobileDevice()) {
mobileControls.update();
mobileControls.displayControls();
}
}
//* ====================================================== *//
// Ajouter une interaction au clic sur le QR code
function mouseClicked() {
if (interfaceElements.isOverQRCode()) {
// Ouvrir l'URL liée au QR code
window.open(
"https://lexers.itch.io/parapente-dans-les-hautes-pyrnes",
"_blank"
);
}
}
//* ====================================================== *//
// Ajout des contrôles clavier pour les deux systèmes
function keyPressed() {
switch (key) {
case "d":
case "D":
changeWindDirection(windDirection === "right" ? "left" : "right");
break;
case "1": // Diagonale haut-droite
changeDirection(45);
break;
case "2": // Diagonale bas-droite
changeDirection(135);
break;
case "3": // Diagonale bas-gauche
changeDirection(225);
break;
case "4": // Diagonale haut-gauche
changeDirection(315);
break;
}
}
function mousePressed() {
// Gestion du clic sur le bouton mute
if (ambientSound.handleClick()) {
// Empêcher d'autres actions si le clic était sur le bouton mute
return false;
}
helpMenu.handleClick();
}