SOURCE

console 命令行工具 X clear

                    
>
console
var camera, scene, renderer;

var isUserInteracting = false,
onMouseDownMouseX = 0,
onMouseDownMouseY = 0,
lon = 0,
onMouseDownLon = 0,
lat = 0,
onMouseDownLat = 0,
phi = 0,
theta = 0,
startDistance = 0;

var raycaster = new THREE.Raycaster();
var mouse = new THREE.Vector2();

var scores = {
  '4': false,
  '5': false,
  '6': false,
  '7': false,
  '8': false
};
var foundAll = function() {
  var r = true;
  for (var i = 4; i < 9; i++) {
    r = r && scores[i];
  }
  return r;
};
init();
animate();

function init() {

  var container, mesh;

  container = document.getElementById('container');

  camera = new THREE.PerspectiveCamera(75, window.innerWidth / window.innerHeight, 1, 1100);
  camera.target = new THREE.Vector3(0, 0, 0);

  scene = new THREE.Scene();

  var geometry = new THREE.SphereGeometry(500, 60, 40);
  geometry.scale( - 1, 1, 1);

  var material = new THREE.MeshBasicMaterial({
    map: new THREE.TextureLoader().load('http://oe9g187nt.bkt.clouddn.com/img/2294472375_24a3b8ef46_o.jpg')
  });

  mesh = new THREE.Mesh(geometry, material);

  scene.add(mesh);
  /* add the spirits here */
  var spriteMaterial = new THREE.SpriteMaterial({
    map: new THREE.TextureLoader().load('http://oe9g187nt.bkt.clouddn.com/img/sprite1.png'),
    color: 0xffffff,
    fog: true
  });

  var sprite = new THREE.Sprite(spriteMaterial);
  sprite.scale.set(5, 5, 1);
  sprite.position.x = 225;
  sprite.position.y = 105;
  sprite.position.z = 400;

  scene.add(sprite);

  var spriteMaterial_1 = new THREE.SpriteMaterial({
    map: new THREE.TextureLoader().load('http://oe9g187nt.bkt.clouddn.com/img/sprite1.png'),
    color: 0xffffff,
    fog: true
  });

  var sprite_1 = new THREE.Sprite(spriteMaterial_1);
  sprite_1.scale.set(7, 7, 1);
  sprite_1.position.x = 400;
  sprite_1.position.y = -250;
  sprite_1.position.z = 50;

  scene.add(sprite_1);

  var spriteMaterial_2 = new THREE.SpriteMaterial({
    map: new THREE.TextureLoader().load('http://oe9g187nt.bkt.clouddn.com/img/sprite1.png'),
    color: 0xffffff,
    fog: true
  });

  var sprite_2 = new THREE.Sprite(spriteMaterial_2);
  sprite_2.scale.set(10, 10, 1);
  sprite_2.position.x = 380;
  sprite_2.position.y = 280;
  sprite_2.position.z = 10;

  scene.add(sprite_2);

  var spriteMaterial_3 = new THREE.SpriteMaterial({
    map: new THREE.TextureLoader().load('http://oe9g187nt.bkt.clouddn.com/img/sprite1.png'),
    color: 0xffffff,
    fog: true
  });

  var sprite_3 = new THREE.Sprite(spriteMaterial_3);
  sprite_3.scale.set(10, 10, 1);
  sprite_3.position.x = -300;
  sprite_3.position.y = -250;
  sprite_3.position.z = 10;

  scene.add(sprite_3);

  var spriteMaterial_4 = new THREE.SpriteMaterial({
    map: new THREE.TextureLoader().load('http://oe9g187nt.bkt.clouddn.com/img/sprite1.png'),
    color: 0xffffff,
    fog: true
  });

  var sprite_4 = new THREE.Sprite(spriteMaterial_4);
  sprite_4.scale.set(6, 6, 1);
  sprite_4.position.x = -300;
  sprite_4.position.y = -230;
  sprite_4.position.z = -300;

  scene.add(sprite_4);

  /* The End */

  renderer = new THREE.WebGLRenderer();
  renderer.setPixelRatio(window.devicePixelRatio);
  renderer.setSize(window.innerWidth, window.innerHeight);
  container.appendChild(renderer.domElement);

  document.addEventListener('mousedown', onDocumentMouseDown, false);
  document.addEventListener('mousemove', onDocumentMouseMove, false);
  document.addEventListener('mouseup', onDocumentMouseUp, false);
  document.addEventListener('wheel', onDocumentMouseWheel, false);

  //
  document.addEventListener('dragover',
  function(event) {

    event.preventDefault();
    event.dataTransfer.dropEffect = 'copy';

  },
  false);

  document.addEventListener('dragenter',
  function(event) {

    document.body.style.opacity = 0.5;

  },
  false);

  document.addEventListener('dragleave',
  function(event) {

    document.body.style.opacity = 1;

  },
  false);

  document.addEventListener('drop',
  function(event) {

    event.preventDefault();

    var reader = new FileReader();
    reader.addEventListener('load',
    function(event) {

      material.map.image.src = event.target.result;
      material.map.needsUpdate = true;

    },
    false);
    reader.readAsDataURL(event.dataTransfer.files[0]);

    document.body.style.opacity = 1;

  },
  false);

  //
  window.addEventListener('resize', onWindowResize, false);
  /* bind touch events */
  window.addEventListener('touchstart', onTouchstart, false);
  window.addEventListener('touchmove', onTouchmove, false);
  window.addEventListener('touchend', onTouchend, false);
  /* The End */
}
/* touch event handlers */
function onTouchstart(event) {

  event.preventDefault();

  isUserInteracting = true;

  onPointerDownPointerX = event.changedTouches[0].pageX;
  onPointerDownPointerY = event.changedTouches[0].pageY;

  onPointerDownLon = lon;
  onPointerDownLat = lat;

  /* click events */
  mouse.x = (event.changedTouches[0].pageX / window.innerWidth) * 2 - 1;
  mouse.y = -(event.changedTouches[0].pageY / window.innerHeight) * 2 + 1;
  raycaster.setFromCamera(mouse, camera);
  var intersects = raycaster.intersectObjects(scene.children);
  if (intersects.length > 0) {
    if (intersects[0].object.id > 3) {
      intersects[0].object.material.map = new THREE.TextureLoader().load('http://oe9g187nt.bkt.clouddn.com/img/sprite0.png');
      intersects[0].object.scale.set(50, 50, 1);
      scores[intersects[0].object.id] = true;
      if (foundAll()) {
        console.log('恭喜你,所有小黄豆已被全部找出!!');
        alert('恭喜你,所有小黄豆已被全部找出!!');
      }
    }
  }
  /* The End */
}

function onTouchmove(event) {
  if (event.changedTouches[1] == undefined) { // 单点触控
    if (isUserInteracting === true) {
      lon = (onPointerDownPointerX - event.changedTouches[0].pageX) * 0.1 + onPointerDownLon;
      lat = (event.changedTouches[0].pageY - onPointerDownPointerY) * 0.1 + onPointerDownLat;
    }
  } else { // 双点触控
    var deltaX = 15,
    currentDistance = Math.pow(event.changedTouches[1].pageX - event.changedTouches[0].pageX, 2) + Math.pow(event.changedTouches[1].pageY - event.changedTouches[0].pageY, 2);
    if (currentDistance < startDistance) {
      camera.fov += deltaX * 0.05;
    } else {
      camera.fov -= deltaX * 0.05;
    }
    startDistance = currentDistance;
    camera.updateProjectionMatrix();
  }

}

function onTouchend(event) {

  isUserInteracting = false;

}
/* The End */

function onWindowResize() {

  camera.aspect = window.innerWidth / window.innerHeight;
  camera.updateProjectionMatrix();

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

}

function onDocumentMouseDown(event) {

  event.preventDefault();

  isUserInteracting = true;

  onPointerDownPointerX = event.clientX;
  onPointerDownPointerY = event.clientY;

  onPointerDownLon = lon;
  onPointerDownLat = lat;

  /* click events */
  mouse.x = (event.clientX / window.innerWidth) * 2 - 1;
  mouse.y = -(event.clientY / window.innerHeight) * 2 + 1;
  raycaster.setFromCamera(mouse, camera);
  var intersects = raycaster.intersectObjects(scene.children);
  if (intersects.length > 0) {
    if (intersects[0].object.id > 3) {
      intersects[0].object.material.map = new THREE.TextureLoader().load('http://oe9g187nt.bkt.clouddn.com/img/sprite0.png');
      intersects[0].object.scale.set(50, 50, 1);
      scores[intersects[0].object.id] = true;
      if (foundAll()) {
        console.log('恭喜你,所有小黄豆已被全部找出!!');
        alert('恭喜你,所有小黄豆已被全部找出!!');
      }
    }
  }
  /* The End */
}

function onDocumentMouseMove(event) {

  if (isUserInteracting === true) {

    lon = (onPointerDownPointerX - event.clientX) * 0.1 + onPointerDownLon;
    lat = (event.clientY - onPointerDownPointerY) * 0.1 + onPointerDownLat;

  }

}

function onDocumentMouseUp(event) {

  isUserInteracting = false;

}

function onDocumentMouseWheel(event) {

  camera.fov += event.deltaY * 0.05;
  camera.updateProjectionMatrix();

}

function animate() {

  requestAnimationFrame(animate);
  update();

}

function update() {

  if (isUserInteracting === false) {

    lon += 0.1;

  }

  lat = Math.max( - 85, Math.min(85, lat));
  phi = THREE.Math.degToRad(90 - lat);
  theta = THREE.Math.degToRad(lon);

  camera.target.x = 500 * Math.sin(phi) * Math.cos(theta);
  camera.target.y = 500 * Math.cos(phi);
  camera.target.z = 500 * Math.sin(phi) * Math.sin(theta);

  camera.lookAt(camera.target);

  /*
				// distortion
				camera.position.copy( camera.target ).negate();
				*/

  renderer.render(scene, camera);

}
<div id="container">
</div>
<div class="desc">
  这是用Three.js做的非常简单的小游戏,可以扩展成相对复杂的游戏
  <br>
  请在手机上面打开
  <br>
  如有疑问,欢迎到Github上与我交流!! 我是Nelson Kuang
  <br>
  Github 源码地址:
  <a href="https://github.com/nelsonkuang/find-the-beans">
    https://github.com/nelsonkuang/find-the-beans
  </a>
</div>
body {
  background-color: #000000;
  margin: 0px;
  overflow: hidden;
}

#info {
  position: absolute;
  top: 0px;
  width: 100%;
  color: #ffffff;
  padding: 5px;
  font-family: Monospace;
  font-size: 13px;
  font-weight: bold;
  text-align: center;
}

a {
  color: #ffffff;
}

本项目引用的自定义外部资源