local VisibleRect = class("VisibleRect") function VisibleRect:ctor() self.s_visibleRect = cc.rect(0,0,0,0) end -- 初始化可见区域 function VisibleRect:lazyInit() if (self.s_visibleRect.width == 0.0 and self.s_visibleRect.height == 0.0) then self.s_visibleRect.x = 0 self.s_visibleRect.y = 0 local size = cc.Director:getInstance():getWinSize() self.s_visibleRect.width = size.width self.s_visibleRect.height = size.height end end function VisibleRect:updateVisibleRect() -- 这里只更新大小 local size = cc.Director:getInstance():getWinSize() self.s_visibleRect.width = size.width self.s_visibleRect.height = size.height end function VisibleRect:getVisibleRect() self:lazyInit() return cc.rect(self.s_visibleRect.x, self.s_visibleRect.y, self.s_visibleRect.width, self.s_visibleRect.height) end -- 将屏幕坐标转换成GLView坐标 function VisibleRect:convertScreenToGLView(x, y) self:lazyInit() return cc.p(x , self:getVisibleRect().height - y) end -- 将屏幕坐标转换成坐标系的坐标 function VisibleRect:convertScreenToCoordinate(x, y) self:lazyInit() local floorPlane = cc.Plane:new(cc.vec3(0,1,0) , 0); -- 计算出mainlayer的世界位置 local ray = app.mainCamera:pickRay(x / self.s_visibleRect.width , y / self.s_visibleRect.height); local distance = ray:intersectsPlane(floorPlane); if distance >= 0 then return ray:getPoint(distance); else return ray:getPoint(0); end end -- 将屏幕坐标转换成坐标系的坐标 function VisibleRect:convertScreenToCoordinate2D(x, y) self:lazyInit() local floorPlane = cc.Plane:new(cc.vec3(0,0,1) , 0); -- 计算出mainlayer的世界位置 local ray = app.mainCamera:pickRay(x / self.s_visibleRect.width , y / self.s_visibleRect.height); local distance = ray:intersectsPlane(floorPlane); if distance >= 0 then return ray:getPoint(distance); else return ray:getPoint(0); end end -- 鼠标位置转换成世界坐标 function VisibleRect:convertScreenToWorldPos(x , y) local pos = self:convertScreenToCoordinate(x , y); return app.mainLayer:convertToWorldSpace(pos); end -- 鼠标位置转换成世界坐标 function VisibleRect:convertScreenToWorldPos2D(x , y) local pos = self:convertScreenToCoordinate2D(x , y); return app.mainLayer:convertToWorldSpace(pos); end function VisibleRect:left() self:lazyInit() return cc.p(self.s_visibleRect.x, self.s_visibleRect.y+self.s_visibleRect.height/2) end function VisibleRect:right() self:lazyInit() return cc.p(self.s_visibleRect.x+self.s_visibleRect.width, self.s_visibleRect.y+self.s_visibleRect.height/2) end function VisibleRect:top() self:lazyInit() return cc.p(self.s_visibleRect.x+self.s_visibleRect.width/2, self.s_visibleRect.y+self.s_visibleRect.height) end function VisibleRect:bottom() self:lazyInit() return cc.p(self.s_visibleRect.x+self.s_visibleRect.width/2, self.s_visibleRect.y) end function VisibleRect:center() self:lazyInit() return cc.p(self.s_visibleRect.x+self.s_visibleRect.width/2, self.s_visibleRect.y+self.s_visibleRect.height/2) end function VisibleRect:leftTop() self:lazyInit() return cc.p(self.s_visibleRect.x, self.s_visibleRect.y+self.s_visibleRect.height) end function VisibleRect:rightTop() self:lazyInit() return cc.p(self.s_visibleRect.x+self.s_visibleRect.width, self.s_visibleRect.y+self.s_visibleRect.height) end function VisibleRect:leftBottom() self:lazyInit() return cc.p(self.s_visibleRect.x,self.s_visibleRect.y) end function VisibleRect:rightBottom() self:lazyInit() return cc.p(self.s_visibleRect.x+self.s_visibleRect.width, self.s_visibleRect.y) end return VisibleRect;