![]() |
Bienvenue invité ( Connexion | Inscription )
![]() |
![]()
Message
#1
|
|
![]() Macbidouilleur d'Or ! ![]() ![]() ![]() ![]() ![]() Groupe : Membres Messages : 2 013 Inscrit : 22 Dec 2011 Lieu : Paris Membre no 173 181 ![]() |
Je commence une animation pour enfant et elle marche en HTML-javascript sous Chrome et Firefox.
Mais pas sur Safari... ![]() Comme je suis sous Mojave et j'ai une version ancienne de Safari je voudrais savoir si quelqu'un peut simplement charger la page html ci-dessous sur safari -avec si possible le dernier OS et la version de Safari la plus récente!- et voir si ça fonctionne... ou pas Merci d'avance CODE <!DOCTYPE html> <html> <head> <style> #score-container { position: fixed; top: 0; left: 50%; transform: translateX(-50%); background-color: green; font-size: 24px; font-family: Comic Sans MS, sans-serif; text-align: center; padding: 10px; width: 150px; height: 50px; } .container { display: flex; justify-content: center; font-family: Comic Sans MS, sans-serif; align-items: center; height: 100vh; flex-direction: column; text-align: center; } h3 { margin-top: 0; font-size: 1.5em; border-top: 1px solid white; border-bottom: 1px solid white; border-left: 1px solid white; border-right: 1px solid white; } .counter { background-color: yellow; font-size: 36px; padding: 20px; border-radius: 20%; margin-top: 20px; } #bananes { position: absolute; height: 100vh; width: 100%; overflow: hidden; } /* Définir la taille du singe */ #singe { background-image: url("https://www.dropbox.com/s/g3ikhc6881f8q23/dessin_singe.png?dl=1"); background-repeat: no-repeat; background-size: contain; position: absolute; width: 100px; height: 100px; } body { cursor: none; background-image: url("https://i.gifer.com/Ort.gif"); background-repeat: no-repeat; background-size: cover; height: 100%; position: relative; margin: 0; padding: 0; overflow: hidden; } /* Animer l'image de banane */ @keyframes tomber { 0% { transform: translate(-50%, -100px) rotate(0deg); } 100% { transform: translate(-50%, 800px) rotate(360deg); } } /* Appliquer l'animation à l'image de banane */ .banane { position: absolute; width: 50px; height: 50px; top: 80px; animation: tomber 3s linear infinite; transform-origin: center center; background-image: url("https://www.dropbox.com/s/ktfl0wt7rlv7rul/banane_reduit.png?dl=0"); background-repeat: no-repeat; background-size: contain; } #singe { position: fixed; bottom: 0px; left: 50%; transform: translateX(-50%); } </style> </head> <body> <p>Cliquez sur le bouton Play ci-dessous pour écouter le fichier audio :</p> <audio controls> <source src="https://www.dropbox.com/s/4s7nm3vbf866s36/sf_ni.mp3?raw=1" type="audio/mpeg"> Votre navigateur ne supporte pas la lecture audio. </audio> <div id="score-container"> <h3>Score:</h3> <span class="counter" id="banana-counter">1</span> </div> <div id="banane"> <audio id="audio" src="https://www.dropbox.com/s/4s7nm3vbf866s36/sf_ni.mp3?raw=1"></audio> </div> <div id="singe"></div> <div class="banana" style="left: 10%; animation-delay: 0s; background-image: url('https://www.dropbox.com/s/ktfl0wt7rlv7rul/banane_reduit.png?dl=1');"> <audio src="https://www.dropbox.com/s/4s7nm3vbf866s36/sf_ni.mp3?raw=1"></audio> </div> <div class="banane" style="left: 25%; animation-delay: 3s; background-image: url('https://www.dropbox.com/s/ktfl0wt7rlv7rul/banane_reduit.png?dl=1');"> <audio src="https://www.dropbox.com/s/4s7nm3vbf866s36/sf_ni.mp3?raw=1"></audio> </div> <div class="banane" style="left: 35%; animation-delay: 4.5s; background-image: url('https://www.dropbox.com/s/ktfl0wt7rlv7rul/banane_reduit.png?dl=1');"> <audio src="https://www.dropbox.com/s/4s7nm3vbf866s36/sf_ni.mp3?raw=1"></audio> </div> <div class="banane" style="left: 45%; animation-delay: 6.5s; background-image: url('https://www.dropbox.com/s/ktfl0wt7rlv7rul/banane_reduit.png?dl=1');"> <audio src="https://www.dropbox.com/s/4s7nm3vbf866s36/sf_ni.mp3?raw=1"></audio> </div> <div class="banane" style="left: 65%; animation-delay: 8s; background-image: url('https://www.dropbox.com/s/ktfl0wt7rlv7rul/banane_reduit.png?dl=1');"> <audio src="https://www.dropbox.com/s/4s7nm3vbf866s36/sf_ni.mp3?raw=1"></audio> </div> <div class="banane" style="left: 75%; animation-delay: 2.5s; background-image: url('https://www.dropbox.com/s/ktfl0wt7rlv7rul/banane_reduit.png?dl=1');"> <audio src="https://www.dropbox.com/s/4s7nm3vbf866s36/sf_ni.mp3?raw=1"></audio> </div> <div class="banane" style="left: 85%; animation-delay: 10.5s; background-image: url('https://www.dropbox.com/s/ktfl0wt7rlv7rul/banane_reduit.png?dl=1');"> <audio src="https://www.dropbox.com/s/4s7nm3vbf866s36/sf_ni.mp3?raw=1"></audio> </div> <div class="banane" style="left: 95%; animation-delay: 5.5s; background-image: url('https://www.dropbox.com/s/ktfl0wt7rlv7rul/banane_reduit.png?dl=1');"> <audio src="https://www.dropbox.com/s/4s7nm3vbf866s36/sf_ni.mp3?raw=1"></audio> </div> </body> <script> // Créer un objet Audio pour charger et jouer le fichier audio var audio = new Audio('https://www.dropbox.com/s/4s7nm3vbf866s36/sf_ni.mp3?raw=1'); // Ajouter un événement de chargement pour l'objet Audio audio.addEventListener('loadeddata', function() { console.log('Audio chargé'); }); // Fonction pour jouer le fichier audio function jouerAudio() { if (audio.paused) { audio.currentTime = 0; audio.play(); } } // Appeler la fonction jouerAudio() lorsque le singe attrape une banane // Par exemple, vous pouvez ajouter un appel à la fonction jouerAudio() à la fin de la fonction tomber() qui anime la banane function tomber() { // ... jouerAudio(); // Appel à la fonction jouerAudio() pour jouer le fichier audio lorsque la banane est attrapée } // jouer le son const bananas = document.querySelectorAll('.banane'); bananas.forEach((banana) => { banana.addEventListener('animationend', () => { banana.querySelector('audio').play(); }); }); // Code JavaScript ici document.addEventListener("click", function(event) { if (event.target.classList.contains("banane")) { if (!audio.paused) { audio.pause(); } audio.currentTime = 0; audio.play(); } }); document.addEventListener("mousemove", function(e) { var x = e.clientX; var singe = document.getElementById("singe"); singe.style.left = x + "px"; singe.style.top = "830px"; detecterCollision(); }); function detecterCollision() { var singe = document.getElementById("singe"); var bananes = document.querySelectorAll(".banane"); bananes.forEach(function(banane) { var rect1 = singe.getBoundingClientRect(); var rect2 = banane.getBoundingClientRect(); if (rect1.x < rect2.x + rect2.width && rect1.x + rect1.width > rect2.x && rect1.y < rect2.y + rect2.height && rect1.y + rect1.height > rect2.y) { if (!audio.paused) { audio.pause(); } audio.currentTime = 0; audio.play(); } }); } </script> </html> Ce message a été modifié par frankie00 - 5 May 2023, 17:42. -------------------- ¶ Mon blog informatique est la Vague en Creux
¶ MacBook Pro de 2021 avec OS 14.4 Sonoma, 13 pouces, 16 Go de mémoire RAM, processeur M1, SSD de 500Go ¶ Autre MacBook Pro de 2015 avec OS 10.14.5 Mojave 15 pouces Retina, 16 Go de mémoire RAM, processeur quadri-core 2.5 GHz Intel Core , double carte graphique et SSD 512 Go ¶ Nous sommes 2 sur ce site: Jean Pass & Dem Eilleur qui vous saluons bien !“ |
|
|
![]() |
![]()
Message
#2
|
|
![]() Macbidouilleur d'Or ! ![]() ![]() ![]() ![]() ![]() Groupe : Membres Messages : 4 939 Inscrit : 1 Jul 2010 Membre no 156 073 ![]() |
Ton système de détection de collision a un problème, ton score s’incrémente à toute vitesse. C’est ce qui t’as aussi posé des problèmes de lecture de l’audio, semble-t-il.
Le plus simple : en cas de collision, supprimer la banane. Tu ne l’as sans doute pas fait parce que tu ne sais pas supprimer ou créer des éléments. Voici le code complet du scénario que j’ai présenté dans le post précédent. Il faut réunir toutes les images et l’audio dans un dossier « assets ». J’ai commenté pas mal le code. Les nouvelles notions pour toi au niveau du code : créer un élément et l’insérer dans un élément parent : Code // créer un élément div const truc = document.createElement('div'); // éventuellement lui ajouter un attribut truc.setAttribute('id', 'truc'); // éventuellement lui ajouter une classe CSS truc.classList.add('ma-classe'); // éventuellement des observateurs d’événement truc.addEventListener('evenement', fonction); // puis l’insérer dans un élément qui devient son parent unElement.appendChild(truc); supprimer un élément : Code // supprimer l’élément truc.parentNode.removeChild(truc); générer un nombre aléatoire avec Math.random() qui retourne un nombre compris entre 0 et 1 : Code //compris entre 0 * 8 et 1 * 8 let n = Math.random() * 8; HTML <!doctype html>
<html lang="fr"> <head> <meta charset="utf-8"> <title>Titre UNIQUE du document</title> <meta name="viewport" content="width=device-width, initial-scale=1.0"> <style> *, *:before, *:after { box-sizing: border-box; } body { margin: 0; line-height: 1.5; height: 100vh; overflow: hidden; font-family: 'Comic Sans MS', 'Comic Sans', 'Chalkboard SE', 'Comic Neue', sans-serif; } /* ----------------------------------------------------------- ÉCRAN D’ACCUEIL ----------------------------------------------------------- */ #ecran-accueil { display: flex; flex-direction: column; justify-content: center; align-items: center; height: 100%; background-repeat: no-repeat; background-size: cover; background-position: center; background-color: orange; } @keyframes animChargement { to { opacity: .2; } } #bloc-chargement-ou-bouton { opacity: 1; animation: animChargement 1s infinite alternate; } #bloc-chargement-ou-bouton p, #bouton-demarrer { margin: 0; padding: 1rem 3rem; } #bouton-demarrer { appearance: none; border: none; border-radius: .5rem; background-color: white; color: black; font-size: 100%; line-height: 1; cursor: pointer; } /* seulement pour les appareils dont le pointeur principal supporte le survol */ @media (hover: hover) { #bouton-demarrer:hover { background-color: black; color: white; } } /* on cache cet élément qui est là seulement pour précharger les ressources du jeu */ #ressources { position: absolute; top: -1px; left: -1px; width: 1px; height: 1px; overflow: hidden; } /* ----------------------------------------------------------- ÉCRAN DU JEU ----------------------------------------------------------- */ #ecran-jeu { position: relative; height: 100%; overflow: hidden; background-repeat: no-repeat; background-size: cover; background-position: center; background-image: url(assets/Ort.gif); /*cursor: none;*/ } #score-conteneur { position: relative; z-index: 2; padding-top: 1.5rem; display: flex; justify-content: center; gap: 1.5rem; align-items: center; font-size: 2rem; } .label-score { text-shadow: 1px 1px 0 white; } #banana-counter { display: inline-block; padding: 1rem; border-radius: .5rem; background-color: yellow; } #bouton-play-pause { position: absolute; z-index: 99; top: 1.5rem; right: 1.5rem; appearance: none; border: none; padding: 1rem; border-radius: .5rem; background-color: white; color: black; font-size: 100%; line-height: 1; cursor: pointer; } /* seulement pour les appareils dont le pointeur principal supporte le survol */ @media (hover: hover) { #bouton-play-pause:hover { background-color: black; color: white; } } #singe { position: absolute; bottom: 15vh; left: 50%; width: 100px; height: 100px; background-image: url(assets/dessin_singe.png); background-repeat: no-repeat; background-size: contain; cursor: pointer; } /* Animer l'image de banane */ @keyframes tomber { 0% { transform: translate(-50%, -10vh) rotate(0deg); } 100% { transform: translate(-50%, 100vh) rotate(360deg); } } .banane { position: absolute; z-index: 1; width: 50px; height: 50px; top: 80px; animation: tomber 3s linear infinite backwards; transform-origin: center center; background-image: url("assets/banane_reduit.png"); background-repeat: no-repeat; background-size: contain; } </style> </head> <body> <div id="ecran-accueil"> <h1>Titre du jeu</h1> <div id="bloc-chargement-ou-bouton"> <p>Merci de patienter…</p> </div> <div id="instructions"> <p>Instructions…</p> </div> </div> <!-- on cache en CSS cet élément qui est là seulement pour précharger les ressources du jeu --> <div id="ressources"> <img src="assets/dessin_singe.png" alt=""> <img src="assets/banane_reduit.png" alt=""> <img src="assets/Ort.gif" alt=""> <audio src="assets/sf_ni.mp3" preload></audio> </div> <script> /* ----------------------------------------------------------- VARIABLES GLOBALES ----------------------------------------------------------- */ // Compteur initial let bananaCounter = 0; let gamePaused = false; /* ----------------------------------------------------------- CHARGEMENT DES RESSOURCES ----------------------------------------------------------- */ // chargement de toutes les ressources window.addEventListener('load', function () { // code console.log('Ressources chargées'); // supprimer le message de chargement const messageChargement = document.querySelector('#bloc-chargement-ou-bouton p'); messageChargement.parentNode.removeChild(messageChargement); // créer et ajouter le bouton de démarrage const bouton = document.createElement('button'); bouton.id = 'bouton-demarrer'; bouton.textContent = 'Démarrer'; bouton.addEventListener('click', function () { // supprimer l’écran d’accueil const ecranAccueil = document.getElementById('ecran-accueil'); ecranAccueil.parentNode.removeChild(ecranAccueil); // créer l’écran du jeu… creerEcranJeu(); }); document.getElementById('bloc-chargement-ou-bouton').appendChild(bouton); });// fin de window load /* ----------------------------------------------------------- CRÉER L’ÉCRAN DU JEU ----------------------------------------------------------- */ function creerEcranJeu() { console.log('creerEcranJeu'); // créer le conteneur #ecran-jeu const ecranJeu = document.createElement('div'); ecranJeu.id = 'ecran-jeu'; // le score et son label const scoreConteneur = document.createElement('div'); scoreConteneur.id = 'score-conteneur'; scoreConteneur.innerHTML = '<span class="label-score">Score : </span><span class="counter" id="banana-counter">0</span>'; ecranJeu.appendChild(scoreConteneur); // le bouton play/pause const boutonPlayPause = document.createElement('button'); boutonPlayPause.id = 'bouton-play-pause'; boutonPlayPause.textContent = 'Pause'; boutonPlayPause.addEventListener('click', function () { playPauseJeu(); }); ecranJeu.appendChild(boutonPlayPause); // barre Espace play/pause window.addEventListener('keyup', function (e) { if (e.keyCode === 32) { playPauseJeu(); } }); // le singe const singe = document.createElement('div'); singe.id = 'singe'; ecranJeu.appendChild(singe); // insérer l’écran du jeu document.body.appendChild(ecranJeu); // les bananes const nombreBananes = 8; for (let i = 0; i < nombreBananes; i++) { creerBanane(); } // tout y est : mettre en place l’interactivité initialiserDeplacementDuSingeEtCollision(); }// fin de creerEcranJeu function creerBanane() { const delaiMax = 12; const largeurBanane = 50; const banane = document.createElement('div'); banane.classList.add('banane'); // délai d’animation aléatoire : entre 0 et 12 sec banane.style.animationDelay = Math.random() * delaiMax + 's'; // positionnement aléatoire const x = Math.random() * (window.innerWidth - largeurBanane); banane.style.left = Math.floor((x / window.innerWidth) * 100) + '%'; // position aléatoire à chaque répétition de l’animation banane.addEventListener('animationiteration', function () { const x = Math.random() * window.innerWidth; this.style.left = Math.floor((x / window.innerWidth) * 100) + '%'; }); document.getElementById('ecran-jeu').appendChild(banane); }// fin de creerBanane /* ----------------------------------------------------------- DÉPLACEMENT DU SINGE ET DÉTECTION DE COLLISION ----------------------------------------------------------- */ function initialiserDeplacementDuSingeEtCollision() { document.addEventListener('mousemove', deplacerSinge); document.addEventListener('touchmove', deplacerSinge); }// fin de initialiserDeplacementDuSingeEtCollision function deplacerSinge(e) { const singe = document.getElementById('singe'); // éviter le comportement par défaut (scroll sur mobile) e.stopImmediatePropagation(); let x = 0; // touch ou pas if (e.changedTouches === undefined) { x = e.clientX; } else { x = e.changedTouches[0].clientX; } // on soustrait la moitié de la largeur du singe pour le centrer sous le pointeur singe.style.left = x - 50 + 'px'; detecterCollision(); }// fin de deplacerSinge function detecterCollision() { const singe = document.getElementById('singe'); const bananes = [...document.querySelectorAll('.banane')]; // jeu en pause ? if (gamePaused) { return; // Sortir de la fonction si le jeu est en pause } bananes.forEach(function (banane) { const rect1 = singe.getBoundingClientRect(); const rect2 = banane.getBoundingClientRect(); if ( rect1.left < rect2.left + rect2.width && rect1.left + rect1.width > rect2.left && rect1.top < rect2.top + rect2.height && rect1.top + rect1.height > rect2.top ) { // le parent de la banane supprime son enfant banane banane.parentNode.removeChild(banane); // on en crée une nouvelle creerBanane(); // le fichier audio // on crée un élément audio const audio = document.createElement('audio'); audio.setAttribute('src', 'assets/sf_ni.mp3'); // à la fin de la lecture, il se supprime audio.addEventListener('ended', function (e) { // le parent de l’audio supprime son enfant audio // this est l’élément auquel on a ajouté l’observateur d’événement this.parentNode.removeChild(this); }); audio.play(); // on insère l’élément audio dans l’écran du jeu document.getElementById('ecran-jeu').appendChild(audio); console.log('collision'); // Incrémentation du compteur bananaCounter++; // Mise à jour de la valeur du compteur document.getElementById('banana-counter').textContent = bananaCounter.toString(); }// fin de if collision });// fin de bananes.forEach }// fin de detecterCollision /* ----------------------------------------------------------- PLAY / PAUSE DU JEU ----------------------------------------------------------- */ function playPauseJeu() { const boutonPlayPause = document.getElementById('bouton-play-pause'); const bananes = [...document.querySelectorAll('.banane')]; if (gamePaused) { gamePaused = false; boutonPlayPause.textContent = 'Pause'; bananes.forEach(function (banane) { banane.style.animationPlayState = 'running'; }); document.addEventListener('mousemove', deplacerSinge); document.addEventListener('touchmove', deplacerSinge); } else { gamePaused = true; boutonPlayPause.textContent = 'Play'; bananes.forEach(function (banane) { banane.style.animationPlayState = 'paused'; }); document.removeEventListener('mousemove', deplacerSinge); document.removeEventListener('touchmove', deplacerSinge); } }// fin de playPauseJeu </script> </body> </html>
Raison de l'édition : Balises BBCode [HTML] plutôt que [CODE]
-------------------- L'homme n'est que poussière... c'est dire l'importance du plumeau ! Alexandre Vialatte
|
|
|
![]() ![]() |
Nous sommes le : 1st August 2025 - 05:46 |