yunque9/lua_probject/base_project/Game/View/PlayerDistanceView.lua

127 lines
4.0 KiB
Lua
Raw Normal View History

2025-05-24 14:29:14 +08:00
-- 显示玩家间距离
-- Edit by chengy
PlayerDistanceView = {}
local M = PlayerDistanceView
function PlayerDistanceView.new(show_warning,style,callback)
setmetatable(M, {__index = BaseWindow})
local self = setmetatable({}, {__index = M})
self.class = "PlayerDistanceView"
self._close_destroy = false
self._close_zone = true
self.callback = callback
self:init("ui://Common/com_Distance", show_warning,style)
return self
end
function M:init(url, show_warning,style)
BaseWindow.init(self,url)
local _mainView = self._view
self._view:GetChild("btn_close2").onClick:Add(function()
self:Destroy()
end)
self:ShowPlayerDistance()
if show_warning then
self._view:GetController("warn").selectedIndex = 1
end
style = style or 0
self._view:GetController("style").selectedIndex = style
--[[self._view:GetChild("btn_exit").onClick:Set(function()
if self.callback then
self.callback(false)
end
end)--]]
self._view:GetChild("btn_continue").onClick:Set(function()
if self.callback then
self.callback(true)
end
end)
end
function M:ShowPlayerDistance()
local room = DataManager.CurrenRoom
local view = self._view
local num = room.room_config.people_num
local list = room.player_list
view:GetController("people").selectedIndex = num - 2
local com_dist = view:GetChild("dist_p" .. num)
local p_list = {}
local isHidden = false
if room and room.playback ~= true and room.room_config and room.room_config.isHidden then
isHidden = room.room_config.isHidden == 1
end
for i = 1, #list do
local u = list[i].self_user
local index = ViewUtil.GetPos(room.self_player.seat, list[i].seat, room.room_config.people_num)
local btn_head = com_dist:GetChild("btn_head" .. index)
if isHidden == false then
ImageLoad.Load(u.head_url, btn_head._iconObject)
end
p_list[index] = list[i]
if not u.location or u.location.default then
com_dist:GetChild("p" .. index).grayed = true
end
end
-- 需要计算的距离数量
local dis_num = 0
for i = 1, num - 1 do
dis_num = dis_num + i
end
-- 第一个人需要与(所有人 - 1人比第二个人需要与所有人 - 2人比以此类推
for i = 1, dis_num do
local text_dist = com_dist:GetChild("text_dest" .. i)
local tem = 0
-- 判断第i个距离是哪两个user间的
local player1, player2
for j = 1, num - 1 do
local tem2 = tem + num - j
if i <= tem2 then
player1 = p_list[j]
player2 = p_list[j + i - tem]
local line = com_dist:GetChild("line" .. i)
self:ShowDistanceDetail(player1, player2, text_dist, line, com_dist)
break
end
tem = tem2
end
end
end
function M:ShowDistanceDetail(player1, player2, text_dist, line, com_dist)
local str = ""
local warn_color = self._view:GetChild("tex_warning").color
local change_color = false
if not player1 or not player2 then
str = "未知"
change_color = true
else
local user1 = player1.self_user
local user2 = player2.self_user
if (user1.location and not user1.location.default) and (user2.location and not user2.location.default) then
local dist = user1.location:CalcDistance(user2.location)
if dist > 1 then
str = math.floor(dist + 0.5) .. "km"
else
str = math.floor(dist*1000+0.5) .. "m"
end
if dist < 0.2 then
change_color = true
end
else
str = "未知"
change_color = true
end
end
text_dist.text = str
if change_color then
text_dist.color = warn_color
line.color = warn_color
end
end
return M