first commit

This commit is contained in:
Frankie LAPERDRIX-RAJFURA 2026-02-18 16:09:19 +01:00
commit ff14931e22
6 changed files with 200 additions and 0 deletions

0
README.md Normal file
View File

BIN
images/galette.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 441 KiB

BIN
images/hbdbachir.gif Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.8 MiB

14
index.html Normal file
View File

@ -0,0 +1,14 @@
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>OOP</title>
<link rel="stylesheet" href="styles.css">
</head>
<body>
<!-- <h1>Salut</h1> -->
<canvas id="scene"></canvas>
<script src="script.js"></script>
</body>
</html>

167
script.js Normal file
View File

@ -0,0 +1,167 @@
let canvas = document.getElementById('scene');
let ctx = canvas.getContext("2d");
let resizeCanvas = () => {
canvas.width = window.innerWidth;
canvas.height = window.innerHeight;
}
resizeCanvas()
let onResize = (event) => {
resizeCanvas()
}
window.addEventListener('resize', onResize);
// ctx.fillStyle = "green";
// ctx.fillRect(300, 300, 100, 100);
class Boule {
constructor(x, y, s) {
// this.x = x;
// this.y = y;
this.pos = {
x: x,
y: y
}
this.size = s
this.vx = -2+Math.random()*6;
this.vy = -2+Math.random()*6;
// this.color = 'hsl(360, 50%, 50%)'
this.color = {
h:360,
s:50,
l:50
}
this.img = new Image();
this.img.src = "images/galette.png";
}
draw(){
// console.log('draw', this);
// ctx.beginPath();
// ctx.fillStyle = `hsl(${this.color.h},${this.color.s}%,${this.color.l}%)`;
// ctx.arc(this.pos.x, this.pos.y, this.size, 0, 2 * Math.PI);
// // ctx.fillRect(300, 300, 100, 100);
// ctx.fill();
// ctx.closePath();
// this.img.onload = () => {
// // console.log('img, x, y', this.img, this.pos.x, this.pos.y);
ctx.drawImage(this.img, this.pos.x, this.pos.y, 3*this.size, 5*this.size);
// }
}
move(){
this.pos.x += this.vx;
this.pos.y += this.vy;
if(this.pos.x >= canvas.width || this.pos.x <= 0){
this.vx *= -1;
}
if(this.pos.y >= canvas.height || this.pos.y <= 0){
this.vy *= -1;
}
this.draw();
}
}
let boules = [];
let maboule;
function createBoule(){
maboule = new Boule(
canvas.width / 2, // Math.random()*canvas.width,
canvas.height / 2, // Math.random()*canvas.height,
10+Math.random()*30
);
maboule.draw();
boules.push(maboule);
}
// for (let index = 0; index < 10000; index++) {
// createBoule();
// }
setInterval(()=>{
createBoule();
}, 1000)
let anime = () => {
ctx.clearRect(0,0, canvas.width, canvas.height)
// boules.forEach((boule_a) => {
for (let i = 0; i < boules.length; i++) {
let boule_a = boules[i];
for (let j = i+1; j < boules.length; j++) {
let boule_b = boules[j];
// distance entre les centre des boules
let dist = Math.sqrt(
Math.pow(boule_b.pos.x - boule_a.pos.x, 2) +
Math.pow(boule_b.pos.y - boule_a.pos.y, 2)
);
// console.log('dist', dist);
if(dist < boule_a.size+boule_b.size){
// console.log('ça touche');
// distance inferieure a la somme des deux rayons
// ça touche
// boule_a.vx *= -1;
// boule_a.vy *= -1;
// boule_b.vx *= -1;
// boule_b.vy *= -1;
nx = (boule_b.pos.x - boule_a.pos.x)/dist;
ny = (boule_b.pos.y - boule_a.pos.y)/dist;
vA_n = boule_a.vx*nx + boule_a.vy*ny
vB_n = boule_b.vx*nx + boule_b.vy*ny
boule_a.vx += (vB_n - vA_n) * nx
boule_a.vy += (vB_n - vA_n) * ny
boule_b.vx += (vA_n - vB_n) * nx
boule_b.vy += (vA_n - vB_n) * ny
boule_a.move();
boule_b.move();
}
}
boule_a.move();
}
window.requestAnimationFrame(anime);
}
window.requestAnimationFrame(anime);
let onMouseMove = (event) => {
// console.log('event', event);
// h 0 -> 360
// x 0 -> canvas.width
let h = 360 * (event.x / canvas.width);
// console.log('h', h);
let s = 100 * (event.y / canvas.height)
console.log('s', s);
boules.forEach(boule => {
boule.color.h = h;
boule.color.s = s;
});
}
window.addEventListener('mousemove', onMouseMove);

19
styles.css Normal file
View File

@ -0,0 +1,19 @@
body{
margin: 0;
background-image: url(images/hbdbachir.gif);
background-repeat:no-repeat;
background-position:50% -30%;
}
h1{
font-size: 18em;
}
canvas#scene{
position: absolute;
z-index: 10;
top:0;
left:0;
/* width: 100%;
height:100%; */
}