Skip to content

fight fire game #7

@lodhiibrahim006-pixel

Description

@lodhiibrahim006-pixel
<title>Mini 3D Battle Royale</title> <style> body { margin: 0; overflow: hidden; font-family: sans-serif; } #ui { position: absolute; top: 20px; left: 20px; color: white; text-shadow: 2px 2px 4px #000; pointer-events: none; } #crosshair { position: absolute; top: 50%; left: 50%; width: 20px; height: 20px; border: 2px solid white; border-radius: 50%; transform: translate(-50%, -50%); } #instructions { position: absolute; bottom: 20px; width: 100%; text-align: center; color: white; background: rgba(0,0,0,0.5); } </style>
<div id="ui">
    <h1>BATTLE ZONE</h1>
    <p>Enemies Down: <span id="score">0</span></p>
</div>
<div id="crosshair"></div>
<div id="instructions">WASD to Move | Mouse to Aim | Click to Shoot</div>

<script type="importmap">
    {
        "imports": {
            "three": "https://unpkg.com/three@0.160.0/build/three.module.js"
        }
    }
</script>

<script type="module">
    import * as THREE from 'three';

    // --- Scene Setup ---
    const scene = new THREE.Scene();
    scene.background = new THREE.Color(0x87ceeb); // Sky blue
    const camera = new THREE.PerspectiveCamera(75, window.innerWidth / window.innerHeight, 0.1, 1000);
    const renderer = new THREE.WebGLRenderer({ antialias: true });
    renderer.setSize(window.innerWidth, window.innerHeight);
    document.body.appendChild(renderer.domElement);

    // --- Lights ---
    const light = new THREE.DirectionalLight(0xffffff, 1);
    light.position.set(5, 10, 7.5);
    scene.add(light);
    scene.add(new THREE.AmbientLight(0x404040));

    // --- Ground (The Island) ---
    const groundGeo = new THREE.PlaneGeometry(100, 100);
    const groundMat = new THREE.MeshStandardMaterial({ color: 0x228b22 }); // Grass Green
    const ground = new THREE.Mesh(groundGeo, groundMat);
    ground.rotation.x = -Math.PI / 2;
    scene.add(ground);

    // --- Player Setup ---
    const playerGroup = new THREE.Group();
    scene.add(playerGroup);
    playerGroup.add(camera);
    camera.position.set(0, 1.6, 0); // Eye level

    // --- Enemies (Red Cubes) ---
    const enemies = [];
    function createEnemy() {
        const geo = new THREE.BoxGeometry(1, 2, 1);
        const mat = new THREE.MeshStandardMaterial({ color: 0xff0000 });
        const enemy = new THREE.Mesh(geo, mat);
        enemy.position.set(Math.random() * 40 - 20, 1, Math.random() * 40 - 20);
        scene.add(enemy);
        enemies.push(enemy);
    }
    for(let i=0; i<10; i++) createEnemy();

    // --- Movement Logic ---
    let moveForward = false, moveBackward = false, moveLeft = false, moveRight = false;
    let score = 0;

    document.addEventListener('keydown', (e) => {
        if(e.code === 'KeyW') moveForward = true;
        if(e.code === 'KeyS') moveBackward = true;
        if(e.code === 'KeyA') moveLeft = true;
        if(e.code === 'KeyD') moveRight = true;
    });
    document.addEventListener('keyup', (e) => {
        if(e.code === 'KeyW') moveForward = false;
        if(e.code === 'KeyS') moveBackward = false;
        if(e.code === 'KeyA') moveLeft = false;
        if(e.code === 'KeyD') moveRight = false;
    });

    // Mouse Lock & Look
    document.body.requestPointerLock = document.body.requestPointerLock || document.body.mozRequestPointerLock;
    document.addEventListener('click', () => {
        document.body.requestPointerLock();
        shoot();
    });

    document.addEventListener('mousemove', (e) => {
        if (document.pointerLockElement === document.body) {
            playerGroup.rotation.y -= e.movementX * 0.002;
            camera.rotation.x -= e.movementY * 0.002;
            camera.rotation.x = Math.max(-Math.PI/2, Math.min(Math.PI/2, camera.rotation.x));
        }
    });

    // --- Shooting Logic ---
    const raycaster = new THREE.Raycaster();
    function shoot() {
        raycaster.setFromCamera(new THREE.Vector2(0,0), camera);
        const intersects = raycaster.intersectObjects(enemies);
        if (intersects.length > 0) {
            const target = intersects[0].object;
            target.position.set(Math.random() * 40 - 20, 1, Math.random() * 40 - 20); // Respawn
            score++;
            document.getElementById('score').innerText = score;
        }
    }

    // --- Game Loop ---
    const velocity = new THREE.Vector3();
    function animate() {
        requestAnimationFrame(animate);

        if (document.pointerLockElement === document.body) {
            const speed = 0.1;
            if (moveForward) playerGroup.translateZ(-speed);
            if (moveBackward) playerGroup.translateZ(speed);
            if (moveLeft) playerGroup.translateX(-speed);
            if (moveRight) playerGroup.translateX(speed);
        }

        renderer.render(scene, camera);
    }
    animate();

    // Handle Resize
    window.addEventListener('resize', () => {
        camera.aspect = window.innerWidth / window.innerHeight;
        camera.updateProjectionMatrix();
        renderer.setSize(window.innerWidth, window.innerHeight);
    });
</script>

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    No type
    No fields configured for issues without a type.

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions