laya.d3Plugin.js 2.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105
  1. (function(window,document,Laya){
  2. var __un=Laya.un,__uns=Laya.uns,__static=Laya.static,__class=Laya.class,__getset=Laya.getset,__newvec=Laya.__newvec;
  3. var Component=laya.components.Component,MeshTerrainSprite3D=laya.d3.core.MeshTerrainSprite3D;
  4. /**
  5. *<code>PathFinding</code> 类用于创建寻路。
  6. */
  7. //class laya.d3.component.PathFind extends laya.components.Component
  8. var PathFind=(function(_super){
  9. function PathFind(){
  10. /**@private */
  11. this._meshTerrainSprite3D=null;
  12. /**@private */
  13. this._finder=null;
  14. /**@private */
  15. this._setting=null;
  16. /**寻路网格。*/
  17. this.grid=null;
  18. PathFind.__super.call(this);
  19. }
  20. __class(PathFind,'laya.d3.component.PathFind',_super);
  21. var __proto=PathFind.prototype;
  22. /**
  23. *@private
  24. *初始化载入蒙皮动画组件。
  25. *@param owner 所属精灵对象。
  26. */
  27. __proto._onAdded=function(){
  28. if (! (this.owner instanceof laya.d3.core.MeshTerrainSprite3D ))
  29. throw new Error("PathFinding: The owner must MeshTerrainSprite3D!");
  30. this._meshTerrainSprite3D=this.owner;
  31. }
  32. /**
  33. *寻找路径。
  34. *@param startX 开始X。
  35. *@param startZ 开始Z。
  36. *@param endX 结束X。
  37. *@param endZ 结束Z。
  38. *@return 路径。
  39. */
  40. __proto.findPath=function(startX,startZ,endX,endZ){
  41. var minX=this._meshTerrainSprite3D.minX;
  42. var minZ=this._meshTerrainSprite3D.minZ;
  43. var cellX=this._meshTerrainSprite3D.width / this.grid.width;
  44. var cellZ=this._meshTerrainSprite3D.depth / this.grid.height;
  45. var halfCellX=cellX / 2;
  46. var halfCellZ=cellZ / 2;
  47. var gridStartX=Math.floor((startX-minX)/ cellX);
  48. var gridStartZ=Math.floor((startZ-minZ)/ cellZ);
  49. var gridEndX=Math.floor((endX-minX)/ cellX);
  50. var gridEndZ=Math.floor((endZ-minZ)/ cellZ);
  51. var boundWidth=this.grid.width-1;
  52. var boundHeight=this.grid.height-1;
  53. (gridStartX > boundWidth)&& (gridStartX=boundWidth);
  54. (gridStartZ > boundHeight)&& (gridStartZ=boundHeight);
  55. (gridStartX < 0)&& (gridStartX=0);
  56. (gridStartZ < 0)&& (gridStartZ=0);
  57. (gridEndX > boundWidth)&& (gridEndX=boundWidth);
  58. (gridEndZ > boundHeight)&& (gridEndZ=boundHeight);
  59. (gridEndX < 0)&& (gridEndX=0);
  60. (gridEndZ < 0)&& (gridEndZ=0);
  61. var path=this._finder.findPath(gridStartX,gridStartZ,gridEndX,gridEndZ,this.grid);
  62. this.grid.reset();
  63. for (var i=1;i < path.length-1;i++){
  64. var gridPos=path[i];
  65. gridPos[0]=gridPos[0] *cellX+halfCellX+minX;
  66. gridPos[1]=gridPos[1] *cellZ+halfCellZ+minZ;
  67. }
  68. if (path.length==1){
  69. path[0][0]=endX;
  70. path[0][1]=endX;
  71. }else if (path.length > 1){
  72. path[0][0]=startX;
  73. path[0][1]=startZ;
  74. path[path.length-1][0]=endX;
  75. path[path.length-1][1]=endZ;
  76. }
  77. return path;
  78. }
  79. /**
  80. *设置寻路设置。
  81. *@param value 寻路设置。
  82. */
  83. /**
  84. *获取寻路设置。
  85. *@return 寻路设置。
  86. */
  87. __getset(0,__proto,'setting',function(){
  88. return this._setting;
  89. },function(value){
  90. (value)&& (this._finder=new PathFinding.finders.AStarFinder(value));
  91. this._setting=value;
  92. });
  93. return PathFind;
  94. })(Component)
  95. })(window,document,Laya);