<!DOCTYPE html>
<html><head><meta name="viewport" content="width=device-width, initial-scale=1">
<script src="https://cdnjs.cloudflare.com/ajax/libs/three.js/r128/three.min.js"></script>
<style>body{margin:0;background:#000;color:white;font-family:sans-serif;text-align:center;overflow:hidden}button{padding:16px 22px;margin:4px;font-size:22px;border:none;border-radius:50%;background:#ff9800;color:white;box-shadow:0 4px 0 #e65100}button:active{transform:translateY(3px);box-shadow:none}#info{position:fixed;top:5px;left:0;right:0;z-index:10;background:rgba(0,0,0,.7);padding:5px}#ctrl{position:fixed;bottom:10px;left:0;right:0;z-index:10}</style></head>
<body>
<div id="info"><b>πΎ SAWAH 3D - BISA DIGERAKIN πΎ</b><br>β½ <span id="bensin">0</span>/3 | β€οΈ <span id="nyawa">3</span><br><span id="cerita">Pencet tombol oren buat jalan! Ambil bensin kuning!</span></div>
<div id="ctrl">
<button onclick="gerak(0,-1)">β¬</button><br>
<button onclick="gerak(-1,0)">β¬
</button>
<button onclick="gerak(1,0)">β‘</button><br>
<button onclick="gerak(0,1)">β¬</button>
</div>
<script>
let scene=new THREE.Scene(); scene.background=new THREE.Color(0x0a1a2a);
let camera=new THREE.PerspectiveCamera(60,window.innerWidth/window.innerHeight,0.1,100); camera.position.set(0,12,12); camera.lookAt(0,0,0);
let renderer=new THREE.WebGLRenderer(); renderer.setSize(window.innerWidth,window.innerHeight); document.body.appendChild(renderer.domElement);
scene.add(new THREE.AmbientLight(0xffffff,0.9));
let dir=new THREE.DirectionalLight(0xffffff,0.8); dir.position.set(5,10,5); scene.add(dir);
let ground=new THREE.Mesh(new THREE.PlaneGeometry(30,30), new THREE.MeshLambertMaterial({color:0x2e7d32})); ground.rotation.x=-Math.PI/2; scene.add(ground);
let player=new THREE.Mesh(new THREE.BoxGeometry(1,1.8,1), new THREE.MeshLambertMaterial({color:0xff9800})); player.position.set(0,0.9,0); scene.add(player);
let head=new THREE.Mesh(new THREE.SphereGeometry(0.55), new THREE.MeshLambertMaterial({color:0xffcc80})); head.position.set(0,2.2,0); scene.add(head);
let motor=new THREE.Mesh(new THREE.BoxGeometry(2,0.6,0.8), new THREE.MeshLambertMaterial({color:0x111111})); motor.position.set(2,0.4,2); scene.add(motor);
for(let p of [[-8,-8],[8,-8],[-8,8],[8,8],[0,-9]]){ let t=new THREE.Mesh(new THREE.CylinderGeometry(0.4,0.4,2), new THREE.MeshLambertMaterial({color:0x5d4037})); t.position.set(p[0],1,p[1]); scene.add(t); let l=new THREE.Mesh(new THREE.SphereGeometry(1.5), new THREE.MeshLambertMaterial({color:0x1b5e20})); l.position.set(p[0],3,p[1]); scene.add(l); }
let bensinPos=[[-6,0],[0,-6],[6,6]]; let bensinObjs=[]; let bensin=0, nyawa=3;
for(let b of bensinPos){ let m=new THREE.Mesh(new THREE.CylinderGeometry(0.5,0.5,1), new THREE.MeshLambertMaterial({color:0xffeb3b})); m.position.set(b[0],0.5,b[1]); scene.add(m); bensinObjs.push(m); }
let pocong=new THREE.Mesh(new THREE.CapsuleGeometry(0.5,1.5,4,8), new THREE.MeshLambertMaterial({color:0xffffff})); pocong.position.set(-6,1.2,6); scene.add(pocong);
let rumah=new THREE.Mesh(new THREE.BoxGeometry(3,2,3), new THREE.MeshLambertMaterial({color:0xffcc80})); rumah.position.set(9,1,-9); scene.add(rumah);
let atap=new THREE.Mesh(new THREE.ConeGeometry(2.5,1.5,4), new THREE.MeshLambertMaterial({color:0xd32f2f})); atap.position.set(9,2.7,-9); scene.add(atap);
function gerak(dx,dz){ player.position.x+=dx*1.8; player.position.z+=dz*1.8; head.position.x=player.position.x; head.position.z=player.position.z; camera.position.set(player.position.x,12,player.position.z+12); camera.lookAt(player.position.x,0,player.position.z);
for(let i=bensinObjs.length-1;i>=0;i--){ let m=bensinObjs[i]; if(Math.abs(player.position.x-m.position.x)<1.2 && Math.abs(player.position.z-m.position.z)<1.2){ scene.remove(m); bensinObjs.splice(i,1); bensin++; document.getElementById("bensin").innerText=bensin; document.getElementById("cerita").innerText="DAPET BENSIN! "+bensin+"/3"; if(bensin>=3) document.getElementById("cerita").innerText="π MENANG! Lu dapet 3 bensin!"; } }
if(Math.abs(player.position.x-pocong.position.x)<1.5 && Math.abs(player.position.z-pocong.position.z)<1.5){ nyawa--; document.getElementById("nyawa").innerText=nyawa; document.getElementById("cerita").innerText="π» POCONG! Nyawa -1! Sisa "+nyawa; player.position.set(0,0.9,0); head.position.set(0,2.2,0); if(nyawa<=0) document.getElementById("cerita").innerText="π GAME OVER!"; }
}
// BISA PAKE KEYBOARD JUGA
document.addEventListener("keydown",e=>{ if(e.key=="ArrowUp"||e.key=="w") gerak(0,-1); if(e.key=="ArrowDown"||e.key=="s") gerak(0,1); if(e.key=="ArrowLeft"||e.key=="a") gerak(-1,0); if(e.key=="ArrowRight"||e.key=="d") gerak(1,0); });
function animate(){ requestAnimationFrame(animate); pocong.rotation.y+=0.02; bensinObjs.forEach(m=>m.rotation.y+=0.05); renderer.render(scene,camera); } animate();
</script>
</body></html>2
2
124KB
594KB
360.0ms
388.0ms
360.0ms