SingleStoryPlayerView = {} local MapPointConfig = ConfigManager.GetConfig(ConfigName.MapPointConfig) local _PlayTimeStamp = { [0] = 0, [1] = 0, } function SingleStoryPlayerView:New(gameObject) local b = {} b.gameObject = gameObject b.transform = gameObject.transform setmetatable(b, { __index = SingleStoryPlayerView }) return b end function SingleStoryPlayerView:InitComponent() self.roleRoot = Util.GetGameObject(self.gameObject,"roleRoot") self.nameDi = Util.GetGameObject(self.gameObject, "nemeDi") self.name = Util.GetGameObject(self.nameDi, "name"):GetComponent("Text") self.roadsList = {} self.dirList = {} self.roads = {} self.startPos = {} self.index = 1 --当前应该走哪一段 self.roads = self.roadsList[self.index] 第一段是出生点 从第二段开始跑图 self.roadsIndex = 0 --走到当前路线哪一步 self.callList = Stack.New() self.state = 0 end function SingleStoryPlayerView:OnOpen(parent) self.parent = parent _PlayTimeStamp = { [0] = 0, [1] = 0, } --LogGreen("_PlayTimeStamp[0]:".._PlayTimeStamp[0]) end function SingleStoryPlayerView:SetData(data,playerType) self.playerType = playerType if self.playerLiveView then self.playerLiveView:OnClose() self.playerLiveView = nil end self.roleRoot.transform.localScale = Vector3.one if playerType == 0 then self:SetRoads0(data) elseif playerType == 1 then self:SetRoads1(data) end self.gameObject.transform.localPosition = self.startPos self.gameObject.transform.localScale = Vector3.one * 1.5 end function SingleStoryPlayerView:SetRoads0(data) local index = 0 for i = 2 ,#data do local vecs = string.split(data[i],',') if #vecs < 3 then if tonumber(vecs[1]) == 0 then index = index + 1 if not self.roadsList[index] then self.roadsList[index] = {} end if not self.dirList[index] then self.dirList[index] = tonumber(vecs[2]) or 1 end end else local road = {} road.indexType = 0 -- 0 怪 1 人 2 地图 road.vec = Vector3.New(tonumber(vecs[1] or 0),tonumber(vecs[2] or 0),tonumber(vecs[3] or 0)) if tonumber(vecs[4]) and tonumber(vecs[4]) > 0 then local event = {} event.eventType = tonumber(vecs[4]) event.groups = {} for j = 5,#vecs do table.insert(event.groups,tonumber(vecs[j])) end road.event = event end table.insert(self.roadsList[index],road) end end -- for k,v in ipairs(self.roadsList) do -- --LogGreen("Monster k:"..k.." dirList:"..self.dirList[k]) -- for n,m in ipairs(v) do -- --LogGreen("Monster k:"..k.." n:"..n.." vec:"..tostring(m.vec)) -- end -- end self.startPos = self.roadsList[1][1].vec local pointId = tonumber(data[1]) self.playerLiveView = MonsterLiveView:New(self.roleRoot,pointId) self:SetWalkDir(self.dirList[1]) end function SingleStoryPlayerView:SetRoads1(data) self.playerLiveView = PlayerLiveView:New(self.roleRoot,2,{ skin = PlayerManager.GetPlayerSkin(), sex = NameManager.roleSex, ride = 0, designation = 0, }) self.playerLiveView:OnOpen(GetPlayerRoleSingleConFig().Scale14) self.playerLiveView.name = "npc" --PlayUIAnim(self.gameObject) local index = 0 for i = 1 ,#data do if tonumber(data[i][1]) and tonumber(data[i][1]) == 0 then index = index + 1 if not self.roadsList[index] then self.roadsList[index] = {} end if not self.dirList[index] then self.dirList[index] = tonumber(data[i][2]) or 1 end else local road = {} road.indexType = tonumber(data[i][1]) -- 0 怪 1 人 2 地图 local vecs = string.split(data[i][2],',') road.vec = Vector3.New(tonumber(vecs[1]),tonumber(vecs[2]),tonumber(vecs[3])) if tonumber(data[i][3]) and tonumber(data[i][3]) > 0 then local event = {} event.eventType = tonumber(data[i][3]) event.groups = {} for j = 4,#data[i] do table.insert(event.groups,tonumber(data[i][j])) end road.event = event end table.insert(self.roadsList[index],road) end end -- for k,v in ipairs(self.roadsList) do -- --LogGreen("Player k:"..k.." dirList:"..self.dirList[k]) -- for n,m in ipairs(v) do -- --LogGreen("Player k:"..k.." n:"..n.." vec:"..tostring(m.vec)) -- end -- end self.startPos = self.roadsList[1][1].vec self:SetWalkDir(self.dirList[1]) end function SingleStoryPlayerView:RunMap(isSetRoleDir) self.roadsIndex = 0 self.state = 1 self.index = self.index + 1 self.roads = self.roadsList[self.index] if self.dirList[self.index] ~= self.eventpoint then self.eventpoint = self.dirList[self.index] self:SetRoleDir() end if not self.roads or #self.roads < 1 then self.state = 0 return end self.callList:Clear() for i = #self.roads, 1, -1 do local data = self.roads[i] self.callList:Push(function () local go = self.gameObject if data.indexType == 2 then go = self.parent.map end local dis ----LogGreen("isSetRoleDir:"..isSetRoleDir) if data.indexType == 2 or isSetRoleDir == 10 then dis = math.abs(self:SetRoleDirAction(data.vec,go.transform.localPosition,false)) else dis = math.abs(self:SetRoleDirAction(data.vec,go.transform.localPosition,true)) end local speed = 0 if data.indexType ~= 0 then speed = (1/600)*dis else speed = (1/550)*dis end self.tween = go.gameObject.transform:DOLocalMove(data.vec, speed, false):OnStart(function() end):OnUpdate(function() --TODO:测试速度 self:PlayStepSound(data.indexType,isSetRoleDir) end):OnComplete(function () if data.event and data.event.eventType > 0 then self:SetRoleDir() self.parent:CheckTrigger(data.event,self) else self:StackPop() end end):SetEase(Ease.Linear) end) end self:StackPop() end function SingleStoryPlayerView:PlaySound(time,Sound,curTimeStamp,timeStamp) --LogGreen("curTimeStamp:"..curTimeStamp.." timeStamp:"..timeStamp.." curTimeStamp - timeStamp:"..curTimeStamp - timeStamp) if curTimeStamp - timeStamp >= time then --LogGreen("播放音效:"..Sound) SoundManager.PlaySound(Sound) return true end return false end function SingleStoryPlayerView:PlayStepSound(indexType,isSetRoleDir) self.curTimeStamp = GetTimeStamp() if indexType == 0 then self.isSet = self:PlaySound(0.5,(isSetRoleDir == 10 and SoundConfig.STORY_VOICE_1_4 or SoundConfig.STORY_FOOT_1_2),self.curTimeStamp,_PlayTimeStamp[0]) if self.isSet then _PlayTimeStamp[0] = self.curTimeStamp end --LogGreen("_PlayTimeStamp[0]:".._PlayTimeStamp[0]) elseif indexType == 1 then self.isSet = self:PlaySound(0.2,SoundConfig.STORY_FOOT_1_1,self.curTimeStamp,_PlayTimeStamp[1]) if self.isSet then _PlayTimeStamp[1] = self.curTimeStamp end else self.isSet = self:PlaySound(0.5,(isSetRoleDir == 10 and SoundConfig.STORY_VOICE_1_4 or SoundConfig.STORY_FOOT_1_2),self.curTimeStamp,_PlayTimeStamp[0]) if self.isSet then _PlayTimeStamp[0] = self.curTimeStamp end --LogGreen("_PlayTimeStamp[0]:".._PlayTimeStamp[0]) self.isSet = self:PlaySound(0.2,SoundConfig.STORY_FOOT_1_1,self.curTimeStamp,_PlayTimeStamp[1]) if self.isSet then _PlayTimeStamp[1] = self.curTimeStamp end end end -- 角色相关 function SingleStoryPlayerView:SetRoleDirAction(pos,go,indexType) local du = pos.x - go.x local dy = pos.y - go.y if du > 0 then if indexType then self:SetWalkDir(WALK_DIR.RUN_RIGHT) self.eventpoint = 4 end return du elseif du < 0 then if indexType then self:SetWalkDir(WALK_DIR.RUN_LEFT) self.eventpoint = 3 end return du elseif dy < 0 then if indexType then self:SetWalkDir(WALK_DIR.RUN_DOWN) self.eventpoint = 1 end return dy elseif dy > 0 then if indexType then self:SetWalkDir(WALK_DIR.RUN_UP) self.eventpoint = 2 end return dy end return 0 end function SingleStoryPlayerView:SetWalkDir(dir) self.playerLiveView:SetWalkDir(dir) end -- 角色停止行走时的朝向 function SingleStoryPlayerView:SetRoleDir() self:SetWalkDir(self.eventpoint) end function SingleStoryPlayerView:StackPop() if self.callList:Count() > 0 then self.roadsIndex = self.roadsIndex + 1 self.callList:Pop()() else self.state = 0 end end function SingleStoryPlayerView:StopAction() self.state = 0 self.callList:Clear() self.roadsIndex = #self.roads if self.roadsIndex < 1 then self:SetRoleDir() else local vec = self:SetRoleDirAction(self.roads[self.roadsIndex].vec,self.roads[1].vec,true) if vec == 0 then self.eventpoint = self.dirList[self.index] self:SetWalkDir() end self.gameObject.transform.localPosition = self.roads[self.roadsIndex].vec end end function SingleStoryPlayerView:OnClose() self.roadsList = {} self.roads = {} self.startPos = {} self.index = 1 --当前应该走哪一段 self.roads = self.roadsList[self.index] 第一段是出生点 从第二段开始跑图 self.callList = Stack.New() self.state = 0 if self.playerLiveView then self.playerLiveView:OnClose() end if self.tween then self.tween:Kill() end --LogGreen("_PlayTimeStamp[0]:".._PlayTimeStamp[0]) _PlayTimeStamp = { [0] = 0, [1] = 0, } end function SingleStoryPlayerView:CheckState() ----LogGreen("self.state:"..self.state.." self.index:"..self.roadsIndex.." self.playerType:"..self.playerType.." #self.roadsList:"..#self.roadsList[self.index]) if self.state == 1 or self.roadsIndex < (self.roadsList[self.index] and #self.roadsList[self.index] or 0) then return true end return false end return SingleStoryPlayerView