源战役客户端
您最多选择25个主题 主题必须以字母或数字开头,可以包含连字符 (-),并且长度不得超过35个字符
 
 
 
 
 

199 行
4.3 KiB

CoVector2 = CoVector2 or BaseClass()
local CoVector2 = CoVector2
function CoVector2:__init(x, y)
self.x = x
self.y = y
-- local now_time = Status.NowTime
-- if CoVector2.cache_time == nil or CoVector2.cache_time < now_time then
-- -- if CoVector2.call_num == 1 then
-- print("创建Vector2个数", CoVector2.call_num, now_time)
-- -- print(xxxxx+3)
-- -- end
-- CoVector2.call_num = 0
-- CoVector2.cache_time = now_time
-- end
-- CoVector2.call_num = CoVector2.call_num + 1
-- if CoVector2.call_num >1 then
-- -- print("创建Vector2个数", CoVector2.call_num, now_time)
-- print(xxxxx+3)
-- end
local meta_table = getmetatable(self)
meta_table.__add = function (v1, v2)
return CoVector2.New(v1.x + v2.x, v1.y + v2.y)
end
meta_table.__sub = function (v1, v2)
return CoVector2.New(v1.x - v2.x, v1.y - v2.y)
end
meta_table.__mul = function (v1, v2)
local f = tonumber(v2)
if f ~= nil then
return CoVector2.New(v1.x * f, v1.y * f)
else
-- print("~+~+~+ co.Vector2 相乘2", v1.x, v1.y, v2.x, v2.y)
return CoVector2.New(v1.x * v2.x, v1.y * v2.y)
end
end
meta_table.__div = function (v1, v2)
local f = tonumber(v2)
if f ~= nil then
return CoVector2.New(v1.x / f, v1.y / f)
else
return CoVector2.New(v1.x / v2.x, v1.y / v2.y)
end
end
meta_table.__tostring = function (v1)
return string.format("co.Vector2(%.4f, %.4f)", v1.x, v1.y)
end
end
function CoVector2:__defineVar()
return {
_class_type = self,
--_cid = self._id,
_iid = _in_obj_ins_id,
x = 0,
y = 0
}
end
function CoVector2:__delete()
-- body
end
function CoVector2:copyVector2(v)
self.x, self.y = v.x, v.y
end
function CoVector2:setXY(x, y)
self.x, self.y = x, y
end
function CoVector2:Mul(x, y)
y = y or x
if x and y then
self.x, self.y = self.x * x, self.y * y
end
end
function CoVector2:length()
return math.sqrt(self.x * self.x + self.y * self.y)
end
function CoVector2:squaredLength()
return self.x * self.x + self.y * self.y
end
--把对象存进缓存队列
function CoVector2:DeleteV()
local free_num = co.free_vector2_num
if co.free_vector2_num < 100 then
co.free_vector2_num = free_num + 1
co.free_vector2_list[free_num+1] = self
end
end
function CoVector2:normalise()
local l = math.sqrt(self.x * self.x + self.y * self.y)
if l >= 1e-6 then
local f = 1 / l
self.x = self.x * f
self.y = self.y * f
end
return l
end
function CoVector2:distance(v2)
local dx = self.x - v2.x
local dy = self.y - v2.y
return math.sqrt(dx * dx + dy * dy)
end
function CoVector2:squaredDistance(v2)
local dx = self.x - v2.x
local dy = self.y - v2.y
return dx * dx + dy * dy
end
function CoVector2:dotProduct(v2)
return self.x * v2.x + self.y * v2.y
end
function CoVector2:crossProduct(v2)
return self.x * v2.y - self.y * v2.x
end
function CoVector2:angleBetween(v2)
local lenProduct = self:length() * v2:length()
if lenProduct < 1e-6 then
lenProduct = 1e-6
end
local f = self:dotProduct(v2) / lenProduct
if f < -1 then
f = -1
elseif f > 1 then
f = 1
end
return math.acos(f)
end
--返回值顺时针方向为正角度
function CoVector2:angleTo(v2)
local angle = self:angleBetween(v2)
if self:crossProduct(v2) < 0 then
angle = math.pi * 2 - angle
end
return angle
end
function CoVector2:toGameVector2()
if self.game_vector2 == nil then
self.game_vector2 = Game.Vector2(self.x, self.y)
else
self.game_vector2.x = self.x
self.game_vector2.y = self.y
end
return self.game_vector2
end
--沿着dir方向移动dist距离
function CoVector2:Move(dir, dist)
self.x = self.x + dir.x * dist
self.y = self.y + dir.y * dist
end
--把V1向量按照“X轴正方向转到V2方向”的方式旋转
function CoVector2:rotateFromXAxisTo(v2, proj_modify)
local r1 = co.XAix:angleTo(self)
local r2 = co.XAix:angleTo(v2)
local r = r1 + r2
local l = self:length()
local cos_r = math.cos(r)
local sin_r = math.sin(r)
--在转到90度的时候要缩短一些,以产生透视效果
local p = proj_modify and (cos_r * 0.2929 + 0.7071) or 1
self.x, self.y = cos_r * l, sin_r * l * p
return self
end
--radian为正数时顺时针旋转
function CoVector2:rotate(radian )
local r = co.XAix:angleTo(self)
r = r + radian
local l = self:length()
local cos_r = math.cos(r)
local sin_r = math.sin(r)
self.x, self.y = cos_r * l, sin_r * l
return self
end