選択できるのは25トピックまでです。 トピックは、先頭が英数字で、英数字とダッシュ('-')を使用した35文字以内のものにしてください。

127 行
3.6 KiB

  1. local VisibleRect = class("VisibleRect")
  2. function VisibleRect:ctor()
  3. self.s_visibleRect = cc.rect(0,0,0,0)
  4. end
  5. -- 初始化可见区域
  6. function VisibleRect:lazyInit()
  7. if (self.s_visibleRect.width == 0.0 and self.s_visibleRect.height == 0.0) then
  8. self.s_visibleRect.x = 0
  9. self.s_visibleRect.y = 0
  10. local size = cc.Director:getInstance():getWinSize()
  11. self.s_visibleRect.width = size.width
  12. self.s_visibleRect.height = size.height
  13. end
  14. end
  15. function VisibleRect:updateVisibleRect()
  16. -- 这里只更新大小
  17. local size = cc.Director:getInstance():getWinSize()
  18. self.s_visibleRect.width = size.width
  19. self.s_visibleRect.height = size.height
  20. end
  21. function VisibleRect:getVisibleRect()
  22. self:lazyInit()
  23. return cc.rect(self.s_visibleRect.x, self.s_visibleRect.y, self.s_visibleRect.width, self.s_visibleRect.height)
  24. end
  25. -- 将屏幕坐标转换成GLView坐标
  26. function VisibleRect:convertScreenToGLView(x, y)
  27. self:lazyInit()
  28. return cc.p(x , self:getVisibleRect().height - y)
  29. end
  30. -- 将屏幕坐标转换成坐标系的坐标
  31. function VisibleRect:convertScreenToCoordinate(x, y)
  32. self:lazyInit()
  33. local floorPlane = cc.Plane:new(cc.vec3(0,1,0) , 0);
  34. -- 计算出mainlayer的世界位置
  35. local ray = app.mainCamera:pickRay(x / self.s_visibleRect.width , y / self.s_visibleRect.height);
  36. local distance = ray:intersectsPlane(floorPlane);
  37. if distance >= 0 then
  38. return ray:getPoint(distance);
  39. else
  40. return ray:getPoint(0);
  41. end
  42. end
  43. -- 将屏幕坐标转换成坐标系的坐标
  44. function VisibleRect:convertScreenToCoordinate2D(x, y)
  45. self:lazyInit()
  46. local floorPlane = cc.Plane:new(cc.vec3(0,0,1) , 0);
  47. -- 计算出mainlayer的世界位置
  48. local ray = app.mainCamera:pickRay(x / self.s_visibleRect.width , y / self.s_visibleRect.height);
  49. local distance = ray:intersectsPlane(floorPlane);
  50. if distance >= 0 then
  51. return ray:getPoint(distance);
  52. else
  53. return ray:getPoint(0);
  54. end
  55. end
  56. -- 鼠标位置转换成世界坐标
  57. function VisibleRect:convertScreenToWorldPos(x , y)
  58. local pos = self:convertScreenToCoordinate(x , y);
  59. return app.mainLayer:convertToWorldSpace(pos);
  60. end
  61. -- 鼠标位置转换成世界坐标
  62. function VisibleRect:convertScreenToWorldPos2D(x , y)
  63. local pos = self:convertScreenToCoordinate2D(x , y);
  64. return app.mainLayer:convertToWorldSpace(pos);
  65. end
  66. function VisibleRect:left()
  67. self:lazyInit()
  68. return cc.p(self.s_visibleRect.x, self.s_visibleRect.y+self.s_visibleRect.height/2)
  69. end
  70. function VisibleRect:right()
  71. self:lazyInit()
  72. return cc.p(self.s_visibleRect.x+self.s_visibleRect.width, self.s_visibleRect.y+self.s_visibleRect.height/2)
  73. end
  74. function VisibleRect:top()
  75. self:lazyInit()
  76. return cc.p(self.s_visibleRect.x+self.s_visibleRect.width/2, self.s_visibleRect.y+self.s_visibleRect.height)
  77. end
  78. function VisibleRect:bottom()
  79. self:lazyInit()
  80. return cc.p(self.s_visibleRect.x+self.s_visibleRect.width/2, self.s_visibleRect.y)
  81. end
  82. function VisibleRect:center()
  83. self:lazyInit()
  84. return cc.p(self.s_visibleRect.x+self.s_visibleRect.width/2, self.s_visibleRect.y+self.s_visibleRect.height/2)
  85. end
  86. function VisibleRect:leftTop()
  87. self:lazyInit()
  88. return cc.p(self.s_visibleRect.x, self.s_visibleRect.y+self.s_visibleRect.height)
  89. end
  90. function VisibleRect:rightTop()
  91. self:lazyInit()
  92. return cc.p(self.s_visibleRect.x+self.s_visibleRect.width, self.s_visibleRect.y+self.s_visibleRect.height)
  93. end
  94. function VisibleRect:leftBottom()
  95. self:lazyInit()
  96. return cc.p(self.s_visibleRect.x,self.s_visibleRect.y)
  97. end
  98. function VisibleRect:rightBottom()
  99. self:lazyInit()
  100. return cc.p(self.s_visibleRect.x+self.s_visibleRect.width, self.s_visibleRect.y)
  101. end
  102. return VisibleRect;