🎮ArcadeLab

Mini FPS 3D

by MagicDolphin95
170 lines3.2 KB🛠️ Three.js (3D graphics)
▶ Play
<!DOCTYPE html>
<html lang="es">
<head>
<meta charset="UTF-8">
<title>Mini FPS 3D</title>

<style>
body{
    margin:0;
    overflow:hidden;
    background:black;
    font-family:Arial;
}

#crosshair{
    position:absolute;
    top:50%;
    left:50%;
    transform:translate(-50%,-50%);
    color:white;
    font-size:30px;
}

#ui{
    position:absolute;
    top:10px;
    left:10px;
    color:white;
    background:rgba(0,0,0,0.5);
    padding:10px;
    border-radius:10px;
}
</style>
</head>

<body>

<div id="crosshair">+</div>

<div id="ui">
WASD = mover<br>
Mouse = mirar<br>
Click = bloquear mouse
</div>

<script src="https://cdn.jsdelivr.net/npm/three@0.128.0/build/three.min.js"></script>
<script src="https://cdn.jsdelivr.net/npm/three@0.128.0/examples/js/controls/PointerLockControls.js"></script>

<script>

let scene = new THREE.Scene();
scene.background = new THREE.Color(0x87ceeb);

let camera = new THREE.PerspectiveCamera(
75,
window.innerWidth/window.innerHeight,
0.1,
1000
);

let renderer = new THREE.WebGLRenderer();
renderer.setSize(window.innerWidth,window.innerHeight);
document.body.appendChild(renderer.domElement);

let light = new THREE.HemisphereLight(0xffffff,0x444444,1.5);
scene.add(light);

let floorGeo = new THREE.PlaneGeometry(200,200);
let floorMat = new THREE.MeshLambertMaterial({
    color:0x228822
});

let floor = new THREE.Mesh(floorGeo,floorMat);
floor.rotation.x = -Math.PI/2;
scene.add(floor);

for(let i=0;i<30;i++){

    let boxGeo = new THREE.BoxGeometry(5,5,5);

    let boxMat = new THREE.MeshLambertMaterial({
        color:0x888888
    });

    let box = new THREE.Mesh(boxGeo,boxMat);

    box.position.x = Math.random()*100-50;
    box.position.y = 2.5;
    box.position.z = Math.random()*100-50;

    scene.add(box);
}

let enemyGeo = new THREE.BoxGeometry(2,2,2);
let enemyMat = new THREE.MeshLambertMaterial({
    color:0xff0000
});

let enemy = new THREE.Mesh(enemyGeo,enemyMat);

enemy.position.set(0,1,-20);

scene.add(enemy);

camera.position.y = 2;

let controls = new THREE.PointerLockControls(camera,document.body);

document.body.addEventListener("click",()=>{
    controls.lock();
});

scene.add(controls.getObject());

let moveForward=false;
let moveBackward=false;
let moveLeft=false;
let moveRight=false;

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;

});

function animate(){

    requestAnimationFrame(animate);

    let speed=0.15;

    if(moveForward) controls.moveForward(speed);
    if(moveBackward) controls.moveForward(-speed);

    if(moveLeft) controls.moveRight(-speed);
    if(moveRight) controls.moveRight(speed);

    enemy.rotation.y += 0.02;

    renderer.render(scene,camera);
}

animate();

window.addEventListener("resize",()=>{

    camera.aspect=window.innerWidth/window.innerHeight;

    camera.updateProjectionMatrix();

    renderer.setSize(window.innerWidth,window.innerHeight);

});

</script>

</body>
</html>

Game Source: Mini FPS 3D

Creator: MagicDolphin95

Libraries: three

Complexity: moderate (170 lines, 3.2 KB)

The full source code is displayed above on this page.

Remix Instructions

To remix this game, copy the source code above and modify it. Add a ARCADELAB header at the top with "remix_of: mini-fps-3d-magicdolphin95" to link back to the original. Then publish at arcadelab.ai/publish.