🤖 Robot Question / Réponse (IA)

  • Auteur de la discussion ZZZ
  • Date de début
ZZZ
Passionné
Messages
1 400
Fofocoins
7 662
Personnalisation du groupe
Personnalisation pseudo
JavaScript:
var canvas = document.getElementById("canvas");
var ctx = canvas.getContext("2d");

document.getElementById("bullets").innerHTML = "ammo: 30/30";

function resizeCanvas() {
    canvas.width = window.innerWidth;
    canvas.height = window.innerHeight;
    canvas.width = document.body.clientWidth;
    canvas.height = document.body.clientHeight;
}

window.addEventListener('resize', resizeCanvas);
resizeCanvas();

var keys = {};
var mouse = {
    x: 0,
    y: 0
};
var angle = 0;

function menu() {
    player.heal = 100;
}

window.addEventListener("mousemove", function (event) {
    mouse.x = event.clientX;
    mouse.y = event.clientY;
});

window.addEventListener("keydown", function (event) {
    keys[event.keyCode] = true;
});

window.addEventListener("keyup", function (event) {
    delete keys[event.keyCode];
});

function createImage(path) {
    newImage = new Image();
    newImage.src = path;
    newImage.onload = function () {
        loop();
    };
    return newImage;
}

var player = {
    x: canvas.width / 2,
    y: canvas.height / 2,
    positionX: 0,
    positionY: 0,
    width: 41,
    height: 97,
    headWidth: 41,
    headHeight: 41,
    speed: -0.8,
    speedDiag: -(0.8 / Math.sqrt(2)),
    heal: 100,
    reloading: false,
    damages: 10,
    image: createImage("./img/sprite.png"),
    reloadingImage: createImage("./img/sprite reloading.png"),
    shotLightImage: createImage("./img/shotLight Img.png"),
    bulletImg: createImage("./img/bullet Img.png"),
    loader: createImage("./img/loader.gif")
};

block = {
    create(x, y, w, h, blockMargin = 8) {
        if (keys[37]) {
            if (player.x - (player.headWidth / 2) - blockMargin <= x + w &&
                player.x + player.headWidth >= x + w &&
                player.y >= y - blockMargin &&
                player.y <= y + h + blockMargin) {
                player.positionX -= player.speed;
            }
        }
        if (keys[38]) {
            if (player.y - (player.headHeight / 2) - blockMargin <= y + h &&
                player.y + player.headHeight >= y + h &&
                player.x >= x - blockMargin &&
                player.x <= x + w + blockMargin) {
                player.positionY -= player.speed;
            }
        }
        if (keys[39]) {
            if (player.x + (player.headWidth / 2) + blockMargin >= x &&
                player.x + player.headWidth <= x + w &&
                player.y >= y - blockMargin &&
                player.y <= y + h + blockMargin) {
                player.positionX += player.speed;
            }
        }
        if (keys[40]) {
            if (player.y + (player.headHeight / 2) + blockMargin >= y &&
                player.y + player.headHeight <= y + h &&
                player.x >= x - blockMargin &&
                player.x <= x + w + blockMargin) {
                player.positionY += player.speed;
            }
        }
    }
}

class baril {
    positionX;
    positionY;
    constructor(positionX, positionY) {
        this.positionX = positionX;
        this.positionY = positionY;
        this.width = 66;
        this.height = 66;
        this.image = createImage("./img/explosive baril.png");
        this.heal = 100;
        this.currentStat = 1;
    }
}

var explosive = [
    new baril(500, 500), new baril(800, 100), new baril(1000, 400), new baril(1500, 1000)
]

console.log(explosive[0]);
console.log(explosive[1]);

var bullets = [];
var shotLightVisible = false;
var lastFireTime = 0;
var fireRate = 1000 / 10;
var shootIntervalId;
var barilExplosion = {
    currentStat: false
};
var opacity;
var particlesNumber;
var particles;
var radiusMax;
var explosionFramesNumber = 30;
var explosionFramesInterval = 50;
var explosionFrames;
var explosionSound = new Audio("./sounds/barils explosion.mp3");

function updateAngle() {
    var dx = mouse.x - player.x;
    var dy = mouse.y - player.y;
    angle = Math.atan2(dy, dx);
    angle += Math.PI / 2;
}

function update() {
    if (keys[38] && !keys[37] && !keys[39]) {
        player.positionY += player.speed;
    }
    if (keys[40] && !keys[37] && !keys[39]) {
        player.positionY -= player.speed;
    }
    if (keys[37] && !keys[38] && !keys[40]) {
        player.positionX += player.speed;
    }
    if (keys[39] && !keys[38] && !keys[40]) {
        player.positionX -= player.speed;
    }
    if (keys[38] && keys[37]) {
        player.positionY += player.speedDiag;
        player.positionX += player.speedDiag;
    }
    if (keys[38] && keys[39]) {
        player.positionY += player.speedDiag;
        player.positionX -= player.speedDiag;
    }
    if (keys[40] && keys[37]) {
        player.positionY -= player.speedDiag;
        player.positionX += player.speedDiag;
    }
    if (keys[40] && keys[39]) {
        player.positionY -= player.speedDiag;
        player.positionX -= player.speedDiag;
    }
    if (keys[82]) {
        reload();
    }
    updateAngle();
}

player.heal = 100

function detectCollision() {
    function barilsSetups() {
        for (var baril in explosive) {
            if (explosive[baril].currentStat != 3) {
                if (!explosive.hasOwnProperty(baril)) continue;
                for (var i = 0; i < bullets.length; i++) {
                    var bullet = bullets[i];
                    if (explosive[baril].currentStat == 1 && !barilExplosion.currentStat) {
                        if (bullet.x >= explosive[baril].positionX - player.positionX &&
                            bullet.x < explosive[baril].positionX + explosive[baril].width - player.positionX &&
                            bullet.y >= explosive[baril].positionY - player.positionY &&
                            bullet.y < explosive[baril].positionY + explosive[baril].height - player.positionY) {
                            explosive[baril].heal -= player.damages;
                            explosive[baril].width -= 1;
                            explosive[baril].height -= 1;
                            explosive[baril].positionX += 0.5;
                            explosive[baril].positionY += 0.5;
                            bullets.splice(i, 1);
                            i--;
                        }
                    }
                    if (explosive[baril].heal <= 0) {
                        let barilBackup = baril
                        explosive[barilBackup].currentStat = 2;

                        img = new Image();
                        img.onload = function () {
                            loop();
                        }
                        img.src = "";
                        explosive[barilBackup].image = img;

                        barilExplosion = {
                            positionX: explosive[barilBackup].positionX,
                            positionY: explosive[barilBackup].positionY,
                        }

                        explosionSound.play();

                        let maxDistance = 180;

                        let px = barilExplosion.positionX + explosive[0].width / 2 - player.positionX
                        let py = barilExplosion.positionY + explosive[0].height / 2 - player.positionY

                        if (
                            player.x >= (px - maxDistance) &&
                            player.x + player.width < (px + explosive[0].width + maxDistance) &&
                            player.y >= (py - maxDistance) &&
                            player.y + player.height < (py + explosive[0].height + maxDistance)
                        ) {
                            player.heal -= 80;
                        }


                        explosionFrames = setInterval(() => {
                            particlesNumber = 360;
                            particles = [];
                            for (let i = 0; i < particlesNumber; i++) {
                                radiusMax = 1000 / i
                                particles.push({
                                    radius: Math.random() * radiusMax,
                                })

                                particles[i].positionX = particles[i].radius * Math.cos(i);
                                particles[i].positionY = particles[i].radius * Math.sin(i);
                                particles[i].red = (Math.random() * 100) + 155
                                particles[i].green = (Math.random() * 100)
                                particles[i].color = "rgba(" + particles[i].red + ", " + particles[i].green + ", 0, " + particles[i].radius / radiusMax; + ")"
                            }
                        }, explosionFramesInterval);

                        setTimeout(() => {
                            clearInterval(explosionFrames);
                        }, 10 * explosionFramesNumber);

                        explosive[barilBackup].currentStat = 3;
                    }
                }
            }
        }
    }

    barilsSetups();
}

function draw() {
    if (player.heal < 100) {
        player.heal += 0.007;
    }
    ctx.clearRect(0, 0, canvas.width, canvas.height);
    ctx.fillStyle = "black";
    ctx.fillRect(0, 0, canvas.width, canvas.height);
    ctx.save();
    ctx.translate(player.x, player.y);
    ctx.rotate(angle);
    if (player.reloading == false) {
        ctx.drawImage(player.image, -player.width / 2, -player.height + 45 / 2, player.width, player.height);
    } else {
        ctx.drawImage(player.reloadingImage, -player.width / 2, -player.height + 45 / 2, player.width, player.height);
    }


    if (shotLightVisible) {
        ctx.drawImage(player.shotLightImage, -player.width + 65 / 2, -player.height / 2 - 42, 20, 20);
    }

    ctx.restore();

    barils = []
    for (let i = 0; i < explosive.length; i++) {
        ctx.drawImage(explosive[i].image, explosive[i].positionX - player.positionX, explosive[i].positionY - player.positionY, explosive[i].width, explosive[i].height);
        barils[i] = block;
        barils[i].create(explosive[i].positionX - player.positionX, explosive[i].positionY - player.positionY, explosive[i].width, explosive[i].height);
    }

    ctx.fillStyle = "rgba(" + String(255 - 2.55 * player.heal) + ", " + String(255 - (255 - 2.55 * player.heal)) + ", 0)";
    ctx.fillRect((player.x - (player.width / 2) - 19) + ((40) - 0.52 * (player.heal / 1.3)), player.y + 40, player.heal / 1.3, 4);
    document.getElementById("heal").style.width = String(20 + 3 * (player.heal)) + "px";
    document.getElementById("heal").style.backgroundColor = ctx.fillStyle;
    document.getElementById("healText").innerHTML = "hp: " + Math.round(player.heal);

    if (player.heal <= 0) {
        menu();
    }


    for (let i = 0; i < particlesNumber; i++) {
        ctx.fillStyle = particles[i].color;
        ctx.fillRect(barilExplosion.positionX + explosive[0].width / 2 + particles[i].positionX - player.positionX, barilExplosion.positionY + explosive[0].height / 2 + particles[i].positionY - player.positionY, 8, 8);
        setTimeout(() => {
            particlesNumber = 0;
            particles = [];
        }, explosionFramesInterval);
    }

    for (var i = 0; i < bullets.length; i++) {
        var bullet = bullets[i];
        ctx.save();
        ctx.translate(bullet.x, bullet.y);
        ctx.rotate(Math.atan2(bullet.vy, bullet.vx) + Math.PI / 2);
        ctx.drawImage(player.bulletImg, -1, 0, 2, 34);
        ctx.restore();
        bullet.x += bullet.vx;
        bullet.y += bullet.vy;
        if (Math.sqrt(Math.pow(bullet.x - player.x, 2) + Math.pow(bullet.y - player.y, 2)) >= 1000) {
            bullets.splice(i, 1);
            i--;
        }
    }
}

var bulletsNumber = 30;
var AK47Reloadsound = new Audio("./sounds/AK-47 reloading.mp3");

function reload() {
    player.reloading = true;
    document.getElementById("bullets").innerHTML = "ammo: reloading...";
    AK47Reloadsound.play();
    setTimeout(function () {
        bulletsNumber = 30;
        player.reloading = false;
        document.getElementById("bullets").innerHTML = "ammo: " + bulletsNumber + "/30";
    }, 3000)
}

document.addEventListener("mousedown", function () {
    var currentTime = Date.now();
    var timeSinceLastFire = currentTime - lastFireTime;
    if (timeSinceLastFire >= fireRate) {
        if (bulletsNumber > 0 && player.reloading == false) {
            var AK47sound = new Audio("./sounds/AK-47.mp3");
            AK47sound.play();
            shotLightVisible = true;
            setTimeout(function () {
                shotLightVisible = false;
            }, 50);
            lastFireTime = currentTime;
            var bulletSpeed = 14;
            var dx = mouse.x - player.x;
            var dy = mouse.y - player.y;
            var bulletVX = bulletSpeed * Math.cos(Math.atan2(dy, dx));
            var bulletVY = bulletSpeed * Math.sin(Math.atan2(dy, dx));
            var bullet = {
                x: player.x,
                y: player.y,
                vx: bulletVX,
                vy: bulletVY
            };
            bullet.x += bullet.vx * 5;
            bullet.y += bullet.vy * 5;
            bullets.push(bullet);
            lastFireTime = currentTime;
            bulletsNumber -= 1
            document.getElementById("bullets").innerHTML = "ammo: " + bulletsNumber + "/30";
        } else if (bulletsNumber <= 0) {
            if (player.reloading == false) {
                reload();
            }
        }
    }
    clearInterval(shootIntervalId);
    shootIntervalId = setInterval(function () {
        var currentTime = Date.now();
        var timeSinceLastFire = currentTime - lastFireTime;
        if (timeSinceLastFire >= fireRate) {
            if (bulletsNumber > 0 && player.reloading == false) {
                var AK47sound = new Audio("./sounds/AK-47.mp3");
                AK47sound.play();
                shotLightVisible = true;
                setTimeout(function () {
                    shotLightVisible = false;
                }, 50);
                lastFireTime = currentTime;
                var bulletSpeed = 14;
                var dx = mouse.x - player.x;
                var dy = mouse.y - player.y;
                var bulletVX = bulletSpeed * Math.cos(Math.atan2(dy, dx));
                var bulletVY = bulletSpeed * Math.sin(Math.atan2(dy, dx));
                var bullet = {
                    x: player.x,
                    y: player.y,
                    vx: bulletVX,
                    vy: bulletVY
                };
                bullet.x += bullet.vx * 5;
                bullet.y += bullet.vy * 5;
                bullets.push(bullet);
                bulletsNumber -= 1
                document.getElementById("bullets").innerHTML = "ammo: " + bulletsNumber + "/30";
            } else if (bulletsNumber <= 0) {
                if (player.reloading == false) {
                    reload();
                }
            }
        }
    }, fireRate);
});

document.addEventListener("mouseup", function () {
    clearInterval(shootIntervalId);
});

function loop() {
    update();
    detectCollision();
    draw();
    requestAnimationFrame(loop);
}

loop();

Comment faire pour que dans ce jeu, quand un baril explose, la fonction "block.create" ne s'exécute plus uniquement pour ce baril ?
 
Fofobot 🤖
Assistant virtuel
Donateur 🤲
Messages
3 016
Fofocoins
70 789
JavaScript:
var canvas = document.getElementById("canvas");
var ctx = canvas.getContext("2d");

document.getElementById("bullets").innerHTML = "ammo: 30/30";

function resizeCanvas() {
    canvas.width = window.innerWidth;
    canvas.height = window.innerHeight;
    canvas.width = document.body.clientWidth;
    canvas.height = document.body.clientHeight;
}

window.addEventListener('resize', resizeCanvas);
resizeCanvas();

var keys = {};
var mouse = {
    x: 0,
    y: 0
};
var angle = 0;

function menu() {
    player.heal = 100;
}

window.addEventListener("mousemove", function (event) {
    mouse.x = event.clientX;
    mouse.y = event.clientY;
});

window.addEventListener("keydown", function (event) {
    keys[event.keyCode] = true;
});

window.addEventListener("keyup", function (event) {
    delete keys[event.keyCode];
});

function createImage(path) {
    newImage = new Image();
    newImage.src = path;
    newImage.onload = function () {
        loop();
    };
    return newImage;
}

var player = {
    x: canvas.width / 2,
    y: canvas.height / 2,
    positionX: 0,
    positionY: 0,
    width: 41,
    height: 97,
    headWidth: 41,
    headHeight: 41,
    speed: -0.8,
    speedDiag: -(0.8 / Math.sqrt(2)),
    heal: 100,
    reloading: false,
    damages: 10,
    image: createImage("./img/sprite.png"),
    reloadingImage: createImage("./img/sprite reloading.png"),
    shotLightImage: createImage("./img/shotLight Img.png"),
    bulletImg: createImage("./img/bullet Img.png"),
    loader: createImage("./img/loader.gif")
};

block = {
    create(x, y, w, h, blockMargin = 8) {
        if (keys[37]) {
            if (player.x - (player.headWidth / 2) - blockMargin <= x + w &&
                player.x + player.headWidth >= x + w &&
                player.y >= y - blockMargin &&
                player.y <= y + h + blockMargin) {
                player.positionX -= player.speed;
            }
        }
        if (keys[38]) {
            if (player.y - (player.headHeight / 2) - blockMargin <= y + h &&
                player.y + player.headHeight >= y + h &&
                player.x >= x - blockMargin &&
                player.x <= x + w + blockMargin) {
                player.positionY -= player.speed;
            }
        }
        if (keys[39]) {
            if (player.x + (player.headWidth / 2) + blockMargin >= x &&
                player.x + player.headWidth <= x + w &&
                player.y >= y - blockMargin &&
                player.y <= y + h + blockMargin) {
                player.positionX += player.speed;
            }
        }
        if (keys[40]) {
            if (player.y + (player.headHeight / 2) + blockMargin >= y &&
                player.y + player.headHeight <= y + h &&
                player.x >= x - blockMargin &&
                player.x <= x + w + blockMargin) {
                player.positionY += player.speed;
            }
        }
    }
}

class baril {
    positionX;
    positionY;
    constructor(positionX, positionY) {
        this.positionX = positionX;
        this.positionY = positionY;
        this.width = 66;
        this.height = 66;
        this.image = createImage("./img/explosive baril.png");
        this.heal = 100;
        this.currentStat = 1;
    }
}

var explosive = [
    new baril(500, 500), new baril(800, 100), new baril(1000, 400), new baril(1500, 1000)
]

console.log(explosive[0]);
console.log(explosive[1]);

var bullets = [];
var shotLightVisible = false;
var lastFireTime = 0;
var fireRate = 1000 / 10;
var shootIntervalId;
var barilExplosion = {
    currentStat: false
};
var opacity;
var particlesNumber;
var particles;
var radiusMax;
var explosionFramesNumber = 30;
var explosionFramesInterval = 50;
var explosionFrames;
var explosionSound = new Audio("./sounds/barils explosion.mp3");

function updateAngle() {
    var dx = mouse.x - player.x;
    var dy = mouse.y - player.y;
    angle = Math.atan2(dy, dx);
    angle += Math.PI / 2;
}

function update() {
    if (keys[38] && !keys[37] && !keys[39]) {
        player.positionY += player.speed;
    }
    if (keys[40] && !keys[37] && !keys[39]) {
        player.positionY -= player.speed;
    }
    if (keys[37] && !keys[38] && !keys[40]) {
        player.positionX += player.speed;
    }
    if (keys[39] && !keys[38] && !keys[40]) {
        player.positionX -= player.speed;
    }
    if (keys[38] && keys[37]) {
        player.positionY += player.speedDiag;
        player.positionX += player.speedDiag;
    }
    if (keys[38] && keys[39]) {
        player.positionY += player.speedDiag;
        player.positionX -= player.speedDiag;
    }
    if (keys[40] && keys[37]) {
        player.positionY -= player.speedDiag;
        player.positionX += player.speedDiag;
    }
    if (keys[40] && keys[39]) {
        player.positionY -= player.speedDiag;
        player.positionX -= player.speedDiag;
    }
    if (keys[82]) {
        reload();
    }
    updateAngle();
}

player.heal = 100

function detectCollision() {
    function barilsSetups() {
        for (var baril in explosive) {
            if (explosive[baril].currentStat != 3) {
                if (!explosive.hasOwnProperty(baril)) continue;
                for (var i = 0; i < bullets.length; i++) {
                    var bullet = bullets[i];
                    if (explosive[baril].currentStat == 1 && !barilExplosion.currentStat) {
                        if (bullet.x >= explosive[baril].positionX - player.positionX &&
                            bullet.x < explosive[baril].positionX + explosive[baril].width - player.positionX &&
                            bullet.y >= explosive[baril].positionY - player.positionY &&
                            bullet.y < explosive[baril].positionY + explosive[baril].height - player.positionY) {
                            explosive[baril].heal -= player.damages;
                            explosive[baril].width -= 1;
                            explosive[baril].height -= 1;
                            explosive[baril].positionX += 0.5;
                            explosive[baril].positionY += 0.5;
                            bullets.splice(i, 1);
                            i--;
                        }
                    }
                    if (explosive[baril].heal <= 0) {
                        let barilBackup = baril
                        explosive[barilBackup].currentStat = 2;

                        img = new Image();
                        img.onload = function () {
                            loop();
                        }
                        img.src = "";
                        explosive[barilBackup].image = img;

                        barilExplosion = {
                            positionX: explosive[barilBackup].positionX,
                            positionY: explosive[barilBackup].positionY,
                        }

                        explosionSound.play();

                        let maxDistance = 180;

                        let px = barilExplosion.positionX + explosive[0].width / 2 - player.positionX
                        let py = barilExplosion.positionY + explosive[0].height / 2 - player.positionY

                        if (
                            player.x >= (px - maxDistance) &&
                            player.x + player.width < (px + explosive[0].width + maxDistance) &&
                            player.y >= (py - maxDistance) &&
                            player.y + player.height < (py + explosive[0].height + maxDistance)
                        ) {
                            player.heal -= 80;
                        }


                        explosionFrames = setInterval(() => {
                            particlesNumber = 360;
                            particles = [];
                            for (let i = 0; i < particlesNumber; i++) {
                                radiusMax = 1000 / i
                                particles.push({
                                    radius: Math.random() * radiusMax,
                                })

                                particles[i].positionX = particles[i].radius * Math.cos(i);
                                particles[i].positionY = particles[i].radius * Math.sin(i);
                                particles[i].red = (Math.random() * 100) + 155
                                particles[i].green = (Math.random() * 100)
                                particles[i].color = "rgba(" + particles[i].red + ", " + particles[i].green + ", 0, " + particles[i].radius / radiusMax; + ")"
                            }
                        }, explosionFramesInterval);

                        setTimeout(() => {
                            clearInterval(explosionFrames);
                        }, 10 * explosionFramesNumber);

                        explosive[barilBackup].currentStat = 3;
                    }
                }
            }
        }
    }

    barilsSetups();
}

function draw() {
    if (player.heal < 100) {
        player.heal += 0.007;
    }
    ctx.clearRect(0, 0, canvas.width, canvas.height);
    ctx.fillStyle = "black";
    ctx.fillRect(0, 0, canvas.width, canvas.height);
    ctx.save();
    ctx.translate(player.x, player.y);
    ctx.rotate(angle);
    if (player.reloading == false) {
        ctx.drawImage(player.image, -player.width / 2, -player.height + 45 / 2, player.width, player.height);
    } else {
        ctx.drawImage(player.reloadingImage, -player.width / 2, -player.height + 45 / 2, player.width, player.height);
    }


    if (shotLightVisible) {
        ctx.drawImage(player.shotLightImage, -player.width + 65 / 2, -player.height / 2 - 42, 20, 20);
    }

    ctx.restore();

    barils = []
    for (let i = 0; i < explosive.length; i++) {
        ctx.drawImage(explosive[i].image, explosive[i].positionX - player.positionX, explosive[i].positionY - player.positionY, explosive[i].width, explosive[i].height);
        barils[i] = block;
        barils[i].create(explosive[i].positionX - player.positionX, explosive[i].positionY - player.positionY, explosive[i].width, explosive[i].height);
    }

    ctx.fillStyle = "rgba(" + String(255 - 2.55 * player.heal) + ", " + String(255 - (255 - 2.55 * player.heal)) + ", 0)";
    ctx.fillRect((player.x - (player.width / 2) - 19) + ((40) - 0.52 * (player.heal / 1.3)), player.y + 40, player.heal / 1.3, 4);
    document.getElementById("heal").style.width = String(20 + 3 * (player.heal)) + "px";
    document.getElementById("heal").style.backgroundColor = ctx.fillStyle;
    document.getElementById("healText").innerHTML = "hp: " + Math.round(player.heal);

    if (player.heal <= 0) {
        menu();
    }


    for (let i = 0; i < particlesNumber; i++) {
        ctx.fillStyle = particles[i].color;
        ctx.fillRect(barilExplosion.positionX + explosive[0].width / 2 + particles[i].positionX - player.positionX, barilExplosion.positionY + explosive[0].height / 2 + particles[i].positionY - player.positionY, 8, 8);
        setTimeout(() => {
            particlesNumber = 0;
            particles = [];
        }, explosionFramesInterval);
    }

    for (var i = 0; i < bullets.length; i++) {
        var bullet = bullets[i];
        ctx.save();
        ctx.translate(bullet.x, bullet.y);
        ctx.rotate(Math.atan2(bullet.vy, bullet.vx) + Math.PI / 2);
        ctx.drawImage(player.bulletImg, -1, 0, 2, 34);
        ctx.restore();
        bullet.x += bullet.vx;
        bullet.y += bullet.vy;
        if (Math.sqrt(Math.pow(bullet.x - player.x, 2) + Math.pow(bullet.y - player.y, 2)) >= 1000) {
            bullets.splice(i, 1);
            i--;
        }
    }
}

var bulletsNumber = 30;
var AK47Reloadsound = new Audio("./sounds/AK-47 reloading.mp3");

function reload() {
    player.reloading = true;
    document.getElementById("bullets").innerHTML = "ammo: reloading...";
    AK47Reloadsound.play();
    setTimeout(function () {
        bulletsNumber = 30;
        player.reloading = false;
        document.getElementById("bullets").innerHTML = "ammo: " + bulletsNumber + "/30";
    }, 3000)
}

document.addEventListener("mousedown", function () {
    var currentTime = Date.now();
    var timeSinceLastFire = currentTime - lastFireTime;
    if (timeSinceLastFire >= fireRate) {
        if (bulletsNumber > 0 && player.reloading == false) {
            var AK47sound = new Audio("./sounds/AK-47.mp3");
            AK47sound.play();
            shotLightVisible = true;
            setTimeout(function () {
                shotLightVisible = false;
            }, 50);
            lastFireTime = currentTime;
            var bulletSpeed = 14;
            var dx = mouse.x - player.x;
            var dy = mouse.y - player.y;
            var bulletVX = bulletSpeed * Math.cos(Math.atan2(dy, dx));
            var bulletVY = bulletSpeed * Math.sin(Math.atan2(dy, dx));
            var bullet = {
                x: player.x,
                y: player.y,
                vx: bulletVX,
                vy: bulletVY
            };
            bullet.x += bullet.vx * 5;
            bullet.y += bullet.vy * 5;
            bullets.push(bullet);
            lastFireTime = currentTime;
            bulletsNumber -= 1
            document.getElementById("bullets").innerHTML = "ammo: " + bulletsNumber + "/30";
        } else if (bulletsNumber <= 0) {
            if (player.reloading == false) {
                reload();
            }
        }
    }
    clearInterval(shootIntervalId);
    shootIntervalId = setInterval(function () {
        var currentTime = Date.now();
        var timeSinceLastFire = currentTime - lastFireTime;
        if (timeSinceLastFire >= fireRate) {
            if (bulletsNumber > 0 && player.reloading == false) {
                var AK47sound = new Audio("./sounds/AK-47.mp3");
                AK47sound.play();
                shotLightVisible = true;
                setTimeout(function () {
                    shotLightVisible = false;
                }, 50);
                lastFireTime = currentTime;
                var bulletSpeed = 14;
                var dx = mouse.x - player.x;
                var dy = mouse.y - player.y;
                var bulletVX = bulletSpeed * Math.cos(Math.atan2(dy, dx));
                var bulletVY = bulletSpeed * Math.sin(Math.atan2(dy, dx));
                var bullet = {
                    x: player.x,
                    y: player.y,
                    vx: bulletVX,
                    vy: bulletVY
                };
                bullet.x += bullet.vx * 5;
                bullet.y += bullet.vy * 5;
                bullets.push(bullet);
                bulletsNumber -= 1
                document.getElementById("bullets").innerHTML = "ammo: " + bulletsNumber + "/30";
            } else if (bulletsNumber <= 0) {
                if (player.reloading == false) {
                    reload();
                }
            }
        }
    }, fireRate);
});

document.addEventListener("mouseup", function () {
    clearInterval(shootIntervalId);
});

function loop() {
    update();
    detectCollision();
    draw();
    requestAnimationFrame(loop);
}

loop();

Comment faire pour que dans ce jeu, quand un baril explose, la fonction "block.create" ne s'exécute plus uniquement pour ce baril ?
Pour empêcher la fonction `block.create` de s'exécuter uniquement pour le baril qui vient d'exploser, vous pouvez ajouter une propriété `active` à chaque baril dans la classe `baril`. Par défaut, cette propriété sera initialisée à `true`. Lorsqu'un baril explose, vous pouvez définir cette propriété à `false`. Ensuite, dans la fonction `detectCollision()`, vous pouvez ajouter une condition pour vérifier si le baril est actif avant d'appeler `block.create`.

Voici les modifications à apporter au code :

1. Ajouter la propriété `active` à la classe `baril` :
```
class baril {
positionX;
positionY;
constructor(positionX, positionY) {
this.positionX = positionX;
this.positionY = positionY;
this.width = 66;
this.height = 66;
this.image = createImage("./img/explosive baril.png");
this.heal = 100;
this.currentStat = 1;
this.active = true; // ajout de la propriété 'active'
}
}
```

2. Définir `active` à `false` lorsque le baril explose :
```
if (explosive[baril].heal <= 0) {
// ...
explosive[barilBackup].currentStat = 3;
explosive[barilBackup].active = false; // définir 'active' à false
}
```

3. Modifier la fonction `block.create` pour inclure la vérification de l'attribut `active` :
```
barils = []
for (let i = 0; i < explosive.length; i++) {
if (explosive.active) { // vérifier si le baril est actif
ctx.drawImage(explosive.image, explosive.positionX - player.positionX, explosive.positionY - player.positionY, explosive.width, explosive.height);
barils = block;
barils.create(explosive.positionX - player.positionX, explosive.positionY - player.positionY, explosive.width, explosive.height);
}
}
```
 
ZZZ
Passionné
Messages
1 400
Fofocoins
7 662
Personnalisation du groupe
Personnalisation pseudo
Pour empêcher la fonction `block.create` de s'exécuter uniquement pour le baril qui vient d'exploser, vous pouvez ajouter une propriété `active` à chaque baril dans la classe `baril`. Par défaut, cette propriété sera initialisée à `true`. Lorsqu'un baril explose, vous pouvez définir cette propriété à `false`. Ensuite, dans la fonction `detectCollision()`, vous pouvez ajouter une condition pour vérifier si le baril est actif avant d'appeler `block.create`.

Voici les modifications à apporter au code :

1. Ajouter la propriété `active` à la classe `baril` :
```
class baril {
positionX;
positionY;
constructor(positionX, positionY) {
this.positionX = positionX;
this.positionY = positionY;
this.width = 66;
this.height = 66;
this.image = createImage("./img/explosive baril.png");
this.heal = 100;
this.currentStat = 1;
this.active = true; // ajout de la propriété 'active'
}
}
```

2. Définir `active` à `false` lorsque le baril explose :
```
if (explosive[baril].heal <= 0) {
// ...
explosive[barilBackup].currentStat = 3;
explosive[barilBackup].active = false; // définir 'active' à false
}
```

3. Modifier la fonction `block.create` pour inclure la vérification de l'attribut `active` :
```
barils = []
for (let i = 0; i < explosive.length; i++) {
if (explosive.active) { // vérifier si le baril est actif
ctx.drawImage(explosive.image, explosive.positionX - player.positionX, explosive.positionY - player.positionY, explosive.width, explosive.height);
barils = block;
barils.create(explosive.positionX - player.positionX, explosive.positionY - player.positionY, explosive.width, explosive.height);
}
}
```
JavaScript:
var canvas = document.getElementById("canvas");
var ctx = canvas.getContext("2d");

var gameIsRunning = false

function play() {
    if (!gameIsRunning) {
        gameIsRunning = true;
    } else {
        gameIsRunning = false;
    }
}

document.getElementById("bullets").innerHTML = "ammo: 30/30";

function resizeCanvas() {
    canvas.width = window.innerWidth;
    canvas.height = window.innerHeight;
    canvas.width = document.body.clientWidth;
    canvas.height = document.body.clientHeight;
}

window.addEventListener('resize', resizeCanvas);
resizeCanvas();

var keys = {};
var mouse = {
    x: 0,
    y: 0
};
var angle = 0;

function menu() {
    player.heal = 100;
}

window.addEventListener("mousemove", function (event) {
    mouse.x = event.clientX;
    mouse.y = event.clientY;
});

window.addEventListener("keydown", function (event) {
    keys[event.keyCode] = true;
});

window.addEventListener("keyup", function (event) {
    delete keys[event.keyCode];
});

function createImage(path) {
    newImage = new Image();
    newImage.src = path;
    newImage.onload = function () {
        loop();
    };
    return newImage;
}

var player = {
    x: canvas.width / 2,
    y: canvas.height / 2,
    positionX: 0,
    positionY: 0,
    width: 41,
    height: 97,
    headWidth: 41,
    headHeight: 41,
    speed: -0.8,
    speedDiag: -(0.8 / Math.sqrt(2)),
    heal: 100,
    reloading: false,
    damages: 10,
    image: createImage("./img/sprite.png"),
    reloadingImage: createImage("./img/sprite reloading.png"),
    shotLightImage: createImage("./img/shotLight Img.png"),
    bulletImg: createImage("./img/bullet Img.png"),
    loader: createImage("./img/loader.gif")
};

block = {
    create(x, y, w, h, blockMargin = 8) {
        if (keys[37]) {
            if (player.x - (player.headWidth / 2) - blockMargin <= x + w &&
                player.x + player.headWidth >= x + w &&
                player.y >= y - blockMargin &&
                player.y <= y + h + blockMargin) {
                player.positionX -= player.speed;
            }
        }
        if (keys[38]) {
            if (player.y - (player.headHeight / 2) - blockMargin <= y + h &&
                player.y + player.headHeight >= y + h &&
                player.x >= x - blockMargin &&
                player.x <= x + w + blockMargin) {
                player.positionY -= player.speed;
            }
        }
        if (keys[39]) {
            if (player.x + (player.headWidth / 2) + blockMargin >= x &&
                player.x + player.headWidth <= x + w &&
                player.y >= y - blockMargin &&
                player.y <= y + h + blockMargin) {
                player.positionX += player.speed;
            }
        }
        if (keys[40]) {
            if (player.y + (player.headHeight / 2) + blockMargin >= y &&
                player.y + player.headHeight <= y + h &&
                player.x >= x - blockMargin &&
                player.x <= x + w + blockMargin) {
                player.positionY += player.speed;
            }
        }
    }
}

class baril {
    positionX;
    positionY;
    constructor(positionX, positionY) {
        this.positionX = positionX;
        this.positionY = positionY;
        this.width = 66;
        this.height = 66;
        this.image = createImage("./img/explosive baril.png");
        this.heal = 100;
        this.currentStat = 1;
    }
}

var explosive = [
    new baril(500, 500), new baril(800, 100), new baril(1000, 400), new baril(1500, 1000)
]

console.log(explosive[0]);
console.log(explosive[1]);

var bullets = [];
var shotLightVisible = false;
var lastFireTime = 0;
var fireRate = 1000 / 10;
var shootIntervalId;
var barilExplosion = {
    currentStat: false
};
var opacity;
var particlesNumber;
var particles;
var radiusMax;
var explosionFramesNumber = 30;
var explosionFramesInterval = 50;
var explosionFrames;
var explosionSound = new Audio("./sounds/barils explosion.mp3");

function updateAngle() {
    var dx = mouse.x - player.x;
    var dy = mouse.y - player.y;
    angle = Math.atan2(dy, dx);
    angle += Math.PI / 2;
}

function update() {
    if (keys[38] && !keys[37] && !keys[39]) {
        player.positionY += player.speed;
    }
    if (keys[40] && !keys[37] && !keys[39]) {
        player.positionY -= player.speed;
    }
    if (keys[37] && !keys[38] && !keys[40]) {
        player.positionX += player.speed;
    }
    if (keys[39] && !keys[38] && !keys[40]) {
        player.positionX -= player.speed;
    }
    if (keys[38] && keys[37]) {
        player.positionY += player.speedDiag;
        player.positionX += player.speedDiag;
    }
    if (keys[38] && keys[39]) {
        player.positionY += player.speedDiag;
        player.positionX -= player.speedDiag;
    }
    if (keys[40] && keys[37]) {
        player.positionY -= player.speedDiag;
        player.positionX += player.speedDiag;
    }
    if (keys[40] && keys[39]) {
        player.positionY -= player.speedDiag;
        player.positionX -= player.speedDiag;
    }
    if (keys[82]) {
        reload();
    }
    updateAngle();
}
player.heal = 100

function detectCollision() {
    function barilsSetups() {
        for (var baril in explosive) {
            if (explosive[baril].currentStat != 3) {
                if (!explosive.hasOwnProperty(baril)) continue;
                for (var i = 0; i < bullets.length; i++) {
                    var bullet = bullets[i];
                    if (explosive[baril].currentStat == 1 && !barilExplosion.currentStat) {
                        if (bullet.x >= explosive[baril].positionX - player.positionX &&
                            bullet.x < explosive[baril].positionX + explosive[baril].width - player.positionX &&
                            bullet.y >= explosive[baril].positionY - player.positionY &&
                            bullet.y < explosive[baril].positionY + explosive[baril].height - player.positionY) {
                            explosive[baril].heal -= player.damages;
                            explosive[baril].width -= 1;
                            explosive[baril].height -= 1;
                            explosive[baril].positionX += 0.5;
                            explosive[baril].positionY += 0.5;
                            bullets.splice(i, 1);
                            i--;
                        }
                    }
                    if (explosive[baril].heal <= 0) {
                        let barilBackup = baril
                        explosive[barilBackup].currentStat = 2;

                        img = new Image();
                        img.onload = function () {
                            loop();
                        }
                        img.src = "";
                        explosive[barilBackup].image = img;

                        barilExplosion = {
                            positionX: explosive[barilBackup].positionX,
                            positionY: explosive[barilBackup].positionY,
                        }

                        explosionSound.play();

                        let maxDistance = 180;

                        let px = barilExplosion.positionX + explosive[0].width / 2 - player.positionX
                        let py = barilExplosion.positionY + explosive[0].height / 2 - player.positionY

                        if (
                            player.x >= (px - maxDistance) &&
                            player.x + player.width < (px + explosive[0].width + maxDistance) &&
                            player.y >= (py - maxDistance) &&
                            player.y + player.height < (py + explosive[0].height + maxDistance)
                        ) {
                            player.heal -= 80;
                        }


                        explosionFrames = setInterval(() => {
                            particlesNumber = 360;
                            particles = [];
                            for (let i = 0; i < particlesNumber; i++) {
                                radiusMax = 1000 / i
                                particles.push({
                                    radius: Math.random() * radiusMax,
                                })

                                particles[i].positionX = particles[i].radius * Math.cos(i);
                                particles[i].positionY = particles[i].radius * Math.sin(i);
                                particles[i].red = (Math.random() * 100) + 155
                                particles[i].green = (Math.random() * 100)
                                particles[i].color = "rgba(" + particles[i].red + ", " + particles[i].green + ", 0, " + particles[i].radius / radiusMax; + ")"
                            }
                        }, explosionFramesInterval);

                        setTimeout(() => {
                            clearInterval(explosionFrames);
                        }, 10 * explosionFramesNumber);

                        explosive[barilBackup].currentStat = 3;
                    }
                }
            }
        }
    }

    barilsSetups();
}

function draw() {
    if (player.heal < 100) {
        player.heal += 0.007;
    }
    ctx.clearRect(0, 0, canvas.width, canvas.height);
    ctx.fillStyle = "black";
    ctx.fillRect(0, 0, canvas.width, canvas.height);
    ctx.save();
    ctx.translate(player.x, player.y);
    ctx.rotate(angle);
    if (player.reloading == false) {
        ctx.drawImage(player.image, -player.width / 2, -player.height + 45 / 2, player.width, player.height);
    } else {
        ctx.drawImage(player.reloadingImage, -player.width / 2, -player.height + 45 / 2, player.width, player.height);
    }


    if (shotLightVisible) {
        ctx.drawImage(player.shotLightImage, -player.width + 65 / 2, -player.height / 2 - 42, 20, 20);
    }

    ctx.restore();

    for (let i = 0; i < explosive.length; i++) {
        ctx.drawImage(explosive[i].image, explosive[i].positionX - player.positionX, explosive[i].positionY - player.positionY, explosive[i].width, explosive[i].height);
        if (explosive[i].currentStat == 1) block.create(explosive[i].positionX - player.positionX, explosive[i].positionY - player.positionY, explosive[i].width, explosive[i].height);
    }

    ctx.fillStyle = "rgba(" + String(255 - 2.55 * player.heal) + ", " + String(255 - (255 - 2.55 * player.heal)) + ", 0)";
    ctx.fillRect((player.x - (player.width / 2) - 19) + ((40) - 0.52 * (player.heal / 1.3)), player.y + 40, player.heal / 1.3, 4);
    document.getElementById("heal").style.width = String(20 + 3 * (player.heal)) + "px";
    document.getElementById("heal").style.backgroundColor = ctx.fillStyle;
    document.getElementById("healText").innerHTML = "hp: " + Math.round(player.heal);

    if (player.heal <= 0) {
        menu();
    }


    for (let i = 0; i < particlesNumber; i++) {
        ctx.fillStyle = particles[i].color;
        ctx.fillRect(barilExplosion.positionX + explosive[0].width / 2 + particles[i].positionX - player.positionX, barilExplosion.positionY + explosive[0].height / 2 + particles[i].positionY - player.positionY, 8, 8);
        setTimeout(() => {
            particlesNumber = 0;
            particles = [];
        }, explosionFramesInterval);
    }

    for (var i = 0; i < bullets.length; i++) {
        var bullet = bullets[i];
        ctx.save();
        ctx.translate(bullet.x, bullet.y);
        ctx.rotate(Math.atan2(bullet.vy, bullet.vx) + Math.PI / 2);
        ctx.drawImage(player.bulletImg, -1, 0, 2, 34);
        ctx.restore();
        bullet.x += bullet.vx;
        bullet.y += bullet.vy;
        if (Math.sqrt(Math.pow(bullet.x - player.x, 2) + Math.pow(bullet.y - player.y, 2)) >= 1000) {
            bullets.splice(i, 1);
            i--;
        }
    }
}

var bulletsNumber = 30;
var AK47Reloadsound = new Audio("./sounds/AK-47 reloading.mp3");

function reload() {
    player.reloading = true;
    document.getElementById("bullets").innerHTML = "ammo: reloading...";
    AK47Reloadsound.play();
    setTimeout(function () {
        bulletsNumber = 30;
        player.reloading = false;
        document.getElementById("bullets").innerHTML = "ammo: " + bulletsNumber + "/30";
    }, 3000)
}

document.addEventListener("mousedown", function () {
    var currentTime = Date.now();
    var timeSinceLastFire = currentTime - lastFireTime;
    if (timeSinceLastFire >= fireRate) {
        if (bulletsNumber > 0 && player.reloading == false) {
            var AK47sound = new Audio("./sounds/AK-47.mp3");
            AK47sound.play();
            shotLightVisible = true;
            setTimeout(function () {
                shotLightVisible = false;
            }, 50);
            lastFireTime = currentTime;
            var bulletSpeed = 14;
            var dx = mouse.x - player.x;
            var dy = mouse.y - player.y;
            var bulletVX = bulletSpeed * Math.cos(Math.atan2(dy, dx));
            var bulletVY = bulletSpeed * Math.sin(Math.atan2(dy, dx));
            var bullet = {
                x: player.x,
                y: player.y,
                vx: bulletVX,
                vy: bulletVY
            };
            bullet.x += bullet.vx * 5;
            bullet.y += bullet.vy * 5;
            bullets.push(bullet);
            lastFireTime = currentTime;
            bulletsNumber -= 1
            document.getElementById("bullets").innerHTML = "ammo: " + bulletsNumber + "/30";
        } else if (bulletsNumber <= 0) {
            if (player.reloading == false) {
                reload();
            }
        }
    }
    clearInterval(shootIntervalId);
    shootIntervalId = setInterval(function () {
        var currentTime = Date.now();
        var timeSinceLastFire = currentTime - lastFireTime;
        if (timeSinceLastFire >= fireRate) {
            if (bulletsNumber > 0 && player.reloading == false) {
                var AK47sound = new Audio("./sounds/AK-47.mp3");
                AK47sound.play();
                shotLightVisible = true;
                setTimeout(function () {
                    shotLightVisible = false;
                }, 50);
                lastFireTime = currentTime;
                var bulletSpeed = 14;
                var dx = mouse.x - player.x;
                var dy = mouse.y - player.y;
                var bulletVX = bulletSpeed * Math.cos(Math.atan2(dy, dx));
                var bulletVY = bulletSpeed * Math.sin(Math.atan2(dy, dx));
                var bullet = {
                    x: player.x,
                    y: player.y,
                    vx: bulletVX,
                    vy: bulletVY
                };
                bullet.x += bullet.vx * 5;
                bullet.y += bullet.vy * 5;
                bullets.push(bullet);
                bulletsNumber -= 1
                document.getElementById("bullets").innerHTML = "ammo: " + bulletsNumber + "/30";
            } else if (bulletsNumber <= 0) {
                if (player.reloading == false) {
                    reload();
                }
            }
        }
    }, fireRate);
});

document.addEventListener("mouseup", function () {
    clearInterval(shootIntervalId);
});

function loop() {
    update();
    detectCollision();
    draw();
    requestAnimationFrame(loop);
}

loop();

Fais-en sorte que quand gameIsRunning == true, alors le jeu fonctionne, sinon, qu'il s'arrête, que les graphismes ne s'affichent plus et que les sons ne marchent plus.
 

🚫 Alerte AdBlock !

Vous avez activé le mode Ninja, et il cache toutes les pubs ! 😆 Un petit coup de pouce pour notre site serait super apprécié si vous pouvez le désactiver. 🙏

🦸‍♂️ J'ai Désactivé AdBlock !