PGRData/Script/matrix/xentity/xgoldenminer/object/XGoldenMinerMouse.lua

229 lines
7.3 KiB
Lua
Raw Normal View History

local XGoldenMinerBaseObj = require("XEntity/XGoldenMiner/Object/XGoldenMinerBaseObj")
local MathAbs = math.abs
local AnimaState = {
Run = 1,
Grab = 2,
Bomb = 3
}
--黄金矿工鼬鼠
local XGoldenMinerMouse = XClass(XGoldenMinerBaseObj, "XGoldenMinerMouse")
function XGoldenMinerMouse:Ctor()
self:InitObj()
self.StopMove = false
self.StopTime = 0 --停止移动的时间(单位:秒)
self.CurCarryStoneId = 0 --当前携带的矿石Id
end
function XGoldenMinerMouse:InitObj()
self.BombRotate = XUiHelper.TryGetComponent(self.Transform, "Animation/BombRotate")
self.Run = XUiHelper.TryGetComponent(self.Transform, "Run")
self.Grab = XUiHelper.TryGetComponent(self.Transform, "Grab")
self.Bomb = XUiHelper.TryGetComponent(self.Transform, "Bomb")
self.RunCarryItemParent = XUiHelper.TryGetComponent(self.Run.transform, "RunCarryItemParent")
self.GrabCarryItemParent = XUiHelper.TryGetComponent(self.Grab.transform, "GrabCarryItemParent")
self.RunSkeletonAnima = XUiHelper.TryGetComponent(self.Transform, "Run", "SkeletonGraphic")
end
function XGoldenMinerMouse:Init(mapId, rectSize, originParent)
XGoldenMinerMouse.Super.Init(self, mapId, rectSize, originParent)
self.Scale = self.Transform.localScale.x
local stoneId = self:GetId()
local startMoveDirection = XGoldenMinerConfigs.GetStoneStartMoveDirection(stoneId)
self.CurMoveDirection = startMoveDirection
self.Transform.localScale = Vector3(self.Scale * startMoveDirection, self.Scale, self.Scale)
self.PosY = self.Transform.localPosition.y
self.MoveSpeed = XGoldenMinerConfigs.GetStoneMoveSpeed(stoneId)
self.MoveRange = XGoldenMinerConfigs.GetStoneMoveRange(stoneId)
--左右方向能移动到的最大位置
local posX = self.Transform.localPosition.x
local range = XGoldenMinerConfigs.GetStoneMoveRange(stoneId)
self.MoveMinPosX = posX - range
self.MoveMaxPosX = posX + range
self:InitCarryItem(stoneId)
self:SetAnimaState(AnimaState.Run)
end
--初始化鼬鼠携带物品
function XGoldenMinerMouse:InitCarryItem(stoneId)
local carryStoneId = XGoldenMinerConfigs.GetStoneCarryStoneId(stoneId)
if not XTool.IsNumberValid(carryStoneId) then
return
end
self:LoadCarryItem(carryStoneId)
end
function XGoldenMinerMouse:LoadCarryItem(stoneId)
local prefab = XGoldenMinerConfigs.GetStonePrefab(stoneId)
self:LoadResource(self.RunCarryItemParent, prefab)
self:LoadResource(self.GrabCarryItemParent, prefab)
self.CurCarryStoneId = stoneId
end
function XGoldenMinerMouse:OnTriggerEnter(collider)
if not self:IsTriggerCollider(collider) then
return
end
self.StopMove = true
XGoldenMinerMouse.Super.OnTriggerEnter(self, collider)
end
function XGoldenMinerMouse:SetObjToTriggerParent(triggerObjs)
self:SetAnimaState(AnimaState.Grab)
XGoldenMinerMouse.Super.SetObjToTriggerParent(self, triggerObjs)
end
local _MoveX
function XGoldenMinerMouse:Move(deltaTime)
if XTool.UObjIsNil(self.GameObject) then
return
end
self:CheckRunAnima()
if self.StopMove then
return
end
if self.StopTime > 0 then
self.StopTime = self.StopTime - deltaTime
return
end
_MoveX = self.Transform.localPosition.x + deltaTime * self.CurMoveDirection * self.MoveSpeed
if _MoveX < self.MoveMinPosX then
_MoveX = self.MoveMinPosX
self:ChangeOrientation()
elseif _MoveX > self.MoveMaxPosX then
_MoveX = self.MoveMaxPosX
self:ChangeOrientation()
end
self.Transform.localPosition = Vector3(_MoveX, self.PosY, 0)
end
function XGoldenMinerMouse:CheckRunAnima()
if self.RunSkeletonAnima then
self.RunSkeletonAnima.timeScale = self.StopTime > 0 and 0 or 1
end
end
--改变朝向
function XGoldenMinerMouse:ChangeOrientation()
local scale = self.Scale
self.Transform.localScale = Vector3(self.Transform.localScale.x * -1, scale, scale)
self.CurMoveDirection = -self.CurMoveDirection
end
function XGoldenMinerMouse:StopMoveTime(time)
self.StopTime = time
end
function XGoldenMinerMouse:SetAnimaState(state)
self.Run.gameObject:SetActiveEx(AnimaState.Run == state)
self.Grab.gameObject:SetActiveEx(AnimaState.Grab == state)
self.Bomb.gameObject:SetActiveEx(AnimaState.Bomb == state)
end
function XGoldenMinerMouse:GetCurCarryStoneId()
return self.CurCarryStoneId
end
-- 获得贝塞尔曲线点
-- t0到1的值0获取曲线的起点1获得曲线的终点
-- start曲线的起始位置
-- center决定曲线形状的控制点
-- end曲线的终点
function XGoldenMinerMouse:GetBezierPoint(t, startPoint, center, endPoint)
return (1 - t) * (1 - t) * startPoint + 2 * t * (1 - t) * center + t * t * endPoint
end
function XGoldenMinerMouse:GetCarryStoneScore()
local carryStoneId = self:GetCurCarryStoneId()
return XTool.IsNumberValid(carryStoneId) and XGoldenMinerConfigs.GetStoneScore(carryStoneId) or 0
end
function XGoldenMinerMouse:RemoveBoomAnima()
if self.BoomAnima then
XScheduleManager.UnSchedule(self.BoomAnima)
self.BoomAnima = nil
end
end
-------------重写接口 begin-----------------
function XGoldenMinerMouse:GetWeight()
local weight = 0
local id = self:GetId()
weight = XGoldenMinerConfigs.GetStoneWeight(id)
local carryStoneId = self:GetCurCarryStoneId()
if XTool.IsNumberValid(carryStoneId) then
weight = weight + XGoldenMinerConfigs.GetStoneWeight(carryStoneId)
end
return weight
end
--变成等重量的黄金
function XGoldenMinerMouse:ChangeToGold()
local carryStoneId = self:GetCurCarryStoneId()
if not XTool.IsNumberValid(carryStoneId) then
return
end
local weight = XGoldenMinerConfigs.GetStoneWeight(carryStoneId)
local goldId = XGoldenMinerConfigs.GetGoldIdByWeight(weight, carryStoneId)
if not goldId then
return
end
XTool.DestroyChildren(self.RunCarryItemParent)
XTool.DestroyChildren(self.GrabCarryItemParent)
self:LoadCarryItem(goldId)
end
--碰到炸弹移到屏幕外再消除
function XGoldenMinerMouse:DestroySelf(isBoom)
self:RemoveBoomAnima()
local onFinish = function()
XGoldenMinerMouse.Super.DestroySelf(self)
end
if XTool.UObjIsNil(self.OriginParent) or not isBoom then
onFinish()
return
end
self:SetAnimaState(AnimaState.Bomb)
local boomBefore = self.Transform.localPosition
self.Transform:SetParent(self.OriginParent)
local screen = CS.UnityEngine.Screen
local startPos = self.Transform.localPosition
--随机左右边界
local endPosX = math.random(0, 1) == 1 and screen.width or 0
local endPos = Vector3(endPosX, self.Transform.localPosition.y, self.Transform.localPosition.z)
--中间点起点和终点的向量相加乘0.5,再加一个高度
local bezierControlPoint = (self.Transform.localPosition + endPos) * 0.5 + (Vector3.up * 400)
local curBazierPoint
local onRefresh = function(f)
if XTool.UObjIsNil(self.GameObject) then
return
end
curBazierPoint = self:GetBezierPoint(f, startPos, bezierControlPoint, endPos)
self.Transform.localPosition = curBazierPoint
end
self.BoomAnima = XUiHelper.Tween(1, onRefresh, onFinish)
end
-------------重写接口 end-------------------
return XGoldenMinerMouse