document.write('
Data hosted with ♥ by Pastebin.com - Download Raw - See Original
  1. var camera, scene, renderer,
  2. material, materials, mesh, stats, plane;
  3. //width
  4. var w = 520;
  5. //height
  6. var h = 390;
  7. //cubeサイズ
  8. var cubeSize = 40;
  9. //カメラ位置角度
  10. var cameraPos3 = new THREE.Vector3;
  11. //カメラ移動先の位置角度
  12. var cameraTarget3 = new THREE.Vector3;
  13. //カメラ距離初期値
  14. var distance = 750;
  15. //カメラ移動ターゲット
  16. var distanceTarget = 500;
  17. var zoomCycle = 150;
  18. var zoomMin = 300;
  19. var zoomMax = 1500;
  20. //カメラ移動角度
  21. var angleCycle = 90;
  22. var angleYCycle = 5;
  23. var angleYMin = 20;
  24. var angleYMax = 70;
  25. //y軸カメラ回転初期値
  26. cameraPos3.y = cameraTarget3.y = 50;
  27.  
  28. function init() {
  29.     camera = new THREE.Camera( 50, w / h, 1, 10000 );
  30.     camera.position.z = distance;
  31.     scene = new THREE.Scene();
  32.     //Cubeの各面のマテリアル
  33.     materials = [
  34.         new THREE.MeshBasicMaterial({map: THREE.ImageUtils.loadTexture(\'images/texture001.png\')}), // right
  35.         new THREE.MeshBasicMaterial({map: THREE.ImageUtils.loadTexture(\'images/texture001.png\')}), // left
  36.         new THREE.MeshBasicMaterial({map: THREE.ImageUtils.loadTexture(\'images/texture001.png\')}), //top
  37.         new THREE.MeshBasicMaterial({map: THREE.ImageUtils.loadTexture(\'images/texture001.png\')}), // bottom
  38.         new THREE.MeshBasicMaterial({map: THREE.ImageUtils.loadTexture(\'images/texture001.png\')}), // back
  39.         new THREE.MeshBasicMaterial({map: THREE.ImageUtils.loadTexture(\'images/texture001.png\')}) // front
  40.     ];
  41.     material = new THREE.MeshFaceMaterial();
  42.     mesh = [];
  43.     renderer = new THREE.CanvasRenderer();
  44.     renderer.setSize( w, h );
  45.     $(\'#three-stage\').append( renderer.domElement );
  46.  
  47.     //Stats SetUp
  48.     stats = new Stats();
  49.     stats.domElement.style.position = \'absolute\';
  50.     stats.domElement.style.top = \'0px\';
  51.     stats.domElement.style.zIndex = 100;
  52.     $(\'#three-stage\').append( stats.domElement );
  53.  
  54.     //Event
  55.     $(document).bind(\'keydown\', keyDownHandler);
  56. };
  57.  
  58. function keyDownHandler(e){
  59.     e.preventDefault();
  60.     switch(e.keyCode){
  61.         case 37:
  62.             cameraTarget3.x += angleCycle;
  63.             cameraTarget3.z += angleCycle;
  64.             break;
  65.         case 38:
  66.             cameraTarget3.y += angleYCycle;
  67.             break;
  68.         case 39:
  69.             cameraTarget3.x -= angleCycle;
  70.             cameraTarget3.z -= angleCycle;
  71.             break;
  72.         case 40:
  73.             cameraTarget3.y -= angleYCycle;
  74.             break;
  75.         case 88:
  76.             distanceTarget += zoomCycle;
  77.             break;
  78.         case 90:
  79.             distanceTarget -= zoomCycle;
  80.             break;
  81.         default:
  82.             break;
  83.     }
  84.     cameraTarget3.y = Math.max(Math.min(cameraTarget3.y, angleYMax), angleYMin);
  85.     distanceTarget = Math.max(Math.min(distanceTarget, zoomMax), zoomMin);
  86. };
  87.  
  88. /**
  89.  * Cubeをシーンに追加
  90.  */
  91. function makeCubes(mtx){
  92.     var i,imax,j,jmax,k,sides,cube;
  93.     for (i = 0, imax = mtx.length; i < imax; i++) {
  94.         for (j = 0, jmax = mtx[i].length; j < jmax; j++) {
  95.             for (k = 0; k < mtx[i][j]; k++) {
  96.                 sides = {
  97.                     px: true,
  98.                     nx: true,
  99.                     py: true,
  100.                     ny: true,
  101.                     pz: true,
  102.                     nz: true
  103.                 };
  104.                 sides.ny = false;
  105.                 if (i > 0 && k < mtx[i - 1][j]) {
  106.                     sides.nz = false;
  107.                 }
  108.                 if (j < (jmax - 1) && k < mtx[i][j + 1]) {
  109.                     sides.nx = false;
  110.                 }
  111.                 if (i < (imax - 1) && k < mtx[i + 1][j]) {
  112.                     sides.pz = false;
  113.                 }
  114.                 if (j > 0 && k < mtx[i][j - 1]) {
  115.                     sides.px = false;
  116.                 }
  117.                 cube = new THREE.Mesh( new THREE.Cube(cubeSize, cubeSize, cubeSize, 1, 1, 1, materials, false, sides), material);
  118.                 cube.position.x = cubeSize * j - (jmax*cubeSize/2) + cubeSize / 2;
  119.                 cube.position.y = cubeSize * k + cubeSize / 2;
  120.                 cube.position.z = cubeSize * i - (imax*cubeSize/2) + cubeSize / 2;
  121.                 cube.overdraw = false;
  122.                 cube.doubleSided = false;
  123.                 scene.addObject(cube);
  124.                 mesh.push(cube);
  125.             }
  126.         }
  127.     }
  128.     plane = new THREE.Mesh(
  129.         new THREE.Plane(cubeSize * jmax, cubeSize * imax, jmax, imax),
  130.         new THREE.MeshBasicMaterial({color: 0x504237})
  131.     );
  132.     plane.rotation.x = -90 * Math.PI / 180;
  133.     scene.addObject(plane);
  134. };
  135.  
  136. /**
  137.  * シーンオブジェクトを全てクリア
  138.  */
  139. function clearCube(){
  140.     if(plane){
  141.         scene.removeObject(plane);
  142.     }
  143.     for(var i in mesh){
  144.         scene.removeObject(mesh[i]);
  145.     }
  146.     mesh = [];
  147. };
  148.  
  149. function animate() {
  150.     requestAnimationFrame( animate );
  151.     render();
  152. };
  153. function render() {
  154.     //移動計算
  155.     cameraPos3.x += (cameraTarget3.x - cameraPos3.x) * 0.2;
  156.     cameraPos3.y += (cameraTarget3.y - cameraPos3.y) * 0.2;
  157.     cameraPos3.z += (cameraTarget3.z - cameraPos3.z) * 0.2;
  158.     distance += (distanceTarget - distance) * 0.2;
  159.  
  160.     //カメラを動かす
  161.     camera.position.x = distance * Math.sin( cameraPos3.x * Math.PI / 180 );
  162.     camera.position.y = distance * Math.tan( cameraPos3.y * Math.PI / 180 );
  163.     camera.position.z = distance * Math.cos( cameraPos3.z * Math.PI / 180 );
  164.  
  165.     renderer.render( scene, camera );
  166.  
  167.     //Stats update
  168.     stats.update();
  169. };
  170. /**
  171.  * 迷路生成
  172.  */
  173. function createMaze(){
  174.     clearCube();
  175.     var w = $(\'#mazeWidth\').val();
  176.     var h = $(\'#mazeHeight\').val();
  177.     var mtx = (new MAZE(w, h)).getMatrix();
  178.     makeCubes(mtx);
  179. };
  180.  
  181. $(function(){
  182.     init();
  183.     animate();
  184.     createMaze();
  185. });
  186.  
  187. /*==================================================================
  188.  MAZE GENERATOR
  189. ==================================================================*/
  190. var MAZE = function(cols, rows){
  191.     this.cfg = {
  192.         maxLoop: 15000,
  193.         cols: 10,
  194.         rows: 10
  195.     };
  196.     this.cluster = {};
  197.     this.build(cols, rows);
  198. };
  199. MAZE.prototype.build = function(cols, rows){
  200.     var _arr = [];
  201.     var _col = [];
  202.     var _row = [];
  203.     var _num = 0;
  204.     this.cfg.cols = cols;
  205.     this.cfg.rows = rows;
  206.     for(var i=0;i<rows;i++){
  207.         _arr[i] = [];
  208.         for(var j=0;j<cols;j++){
  209.             _arr[i][j] = _num++;
  210.         }
  211.     }
  212.     for(var i=0;i<rows;i++){
  213.         _col[i] = [];
  214.         for(var j=0;j<=cols;j++){
  215.             _col[i][j] = (j==0 || j==cols) ? 3 : 1 ;
  216.         }
  217.     }
  218.     for(var i=0;i<=rows;i++){
  219.         _row[i] = [];
  220.         for(var j=0;j<cols;j++){
  221.             _row[i][j] = (i==0 || i==rows) ? 3 : 1 ;
  222.         }
  223.     }
  224.     this.cluster =  {
  225.         el: _arr,
  226.         col: _col,
  227.         row: _row
  228.     };
  229.     this._breakWark();
  230. };
  231. MAZE.prototype._fillNumber = function(tg, num){
  232.     var c = this.cluster.el;
  233.     for (var i = 0, max = c.length; i < max; i++) {
  234.         for (var j = 0, max2 = c[i].length; j < max2; j++) {
  235.             if(c[i][j] == tg){
  236.                 c[i][j] = num;
  237.             }
  238.         }
  239.     }
  240. };
  241. MAZE.prototype._isAllFill = function(){
  242.     var check = null;
  243.     var c = this.cluster.el;
  244.     for (var i = 0, max = c.length; i < max; i++) {
  245.         for (var j = 0, max2 = c[i].length; j < max2; j++) {
  246.             if(check == null){
  247.                 check = c[i][j];
  248.             }else if(check != c[i][j]){
  249.                 return false;
  250.             }
  251.         }
  252.     }
  253.     return true;
  254. };
  255. MAZE.prototype._borderBreak = function(){
  256.     var c = this.cluster;
  257.     var cfg = this.cfg;
  258.     var type = (Math.round(Math.random()) == 0) ? \'col\' : \'row\' ;
  259.     switch(type){
  260.         case \'row\':
  261.             var colNum = Math.floor(Math.random()*cfg.cols);
  262.             var rowNum = Math.floor(Math.random()*cfg.rows);
  263.             if(rowNum <= 0) rowNum = 1;
  264.             if(c[type][rowNum][colNum] == 1){
  265.                 var num1 = c.el[rowNum-1][colNum];
  266.                 var num2 = c.el[rowNum][colNum];
  267.                 if(num1 == num2){
  268.                     c[type][rowNum][colNum] = 2;
  269.                 }else{
  270.  
  271.                     this._fillNumber(Math.max(num1, num2), Math.min(num1, num2));
  272.                     c[type][rowNum][colNum] = 0;
  273.                 }
  274.             }
  275.             break;
  276.         case \'col\':
  277.             var colNum = Math.floor(Math.random()*cfg.cols);
  278.             var rowNum = Math.floor(Math.random()*cfg.rows);
  279.             if(colNum <= 0) colNum = 1;
  280.             if(c[type][rowNum][colNum] == 1){
  281.                 var num1 = c.el[rowNum][colNum-1];
  282.                 var num2 = c.el[rowNum][colNum];
  283.                 if(num1 == num2){
  284.                     c[type][rowNum][colNum] = 2;
  285.                 }else{
  286.  
  287.                     this._fillNumber(Math.max(num1, num2), Math.min(num1, num2));
  288.                     c[type][rowNum][colNum] = 0;
  289.                 }
  290.             }
  291.             break;
  292.         default:
  293.             break;
  294.     }
  295. };
  296. MAZE.prototype._breakWark = function(){
  297.     var i = 1;
  298.     while(!this._isAllFill() && (i%this.cfg.maxLoop != 0 || window.confirm(\'処理を継続しますか ?\'))){
  299.         this._borderBreak();
  300.         i++;
  301.     }
  302. };
  303. MAZE.prototype.getMatrix = function(){
  304.     var cols = this.cfg.cols;
  305.     var rows = this.cfg.rows;
  306.     var col = this.cluster.col;
  307.     var row = this.cluster.row;
  308.     var mtx = [], i,imax,j,jmax;
  309.     for (i = 0, imax = rows*2+1; i < imax; i++) {
  310.         mtx[i] = [];
  311.         for (j = 0, jmax = cols*2+1; j < jmax; j++) {
  312.             mtx[i][j] = 0;
  313.         }
  314.     }
  315.     for (i = 0, imax = col.length; i < imax; i++) {
  316.         for (j = 0, jmax = col[i].length; j < jmax; j++) {
  317.             mtx[i*2][j*2] = 1;
  318.             mtx[(i+1)*2][j*2] = 1;
  319.             if(col[i][j] > 0){
  320.                 mtx[i*2+1][j*2] = 1;
  321.             }
  322.         }
  323.     }
  324.     for (i = 0, imax = row.length; i < imax; i++) {
  325.         for (j = 0, jmax = row[i].length; j < jmax; j++) {
  326.             if(row[i][j] > 0){
  327.                 mtx[i*2][j*2+1] = 1;
  328.             }
  329.         }
  330.     }
  331.     mtx[1][0] = 0;
  332.     mtx[rows*2-1][cols*2] = 0;
  333.     return mtx;
  334. };
');