コード例 #1
0
ファイル: BowListView.cs プロジェクト: tongxingyang/TanksWar
 void MarkShowNodes(float radian, float absRadian, float maxAbsRadian, bool leaveScreen)
 {
     for (int i = 0; i < m_data.Count; i++)
     {
         float nodeRadian     = i * m_radianPerNode - radian;
         float nodeRealRadian = nodeRadian + absRadian;
         if (nodeRealRadian > maxAbsRadian && leaveScreen)
         {
             continue;
         }
         VirtualListNode virtualNode = m_virtualNodes[i];
         if (m_isLoop)
         {
             if (Mathf.Abs(nodeRadian) <= m_outRadian)
             {
                 virtualNode.m_show = true;
             }
         }
         else
         {
             float r = i * m_radianPerNode - absRadian;
             if (Mathf.Abs(r) < m_outRadian)
             {
                 virtualNode.m_show = true;
             }
         }
     }
 }
コード例 #2
0
ファイル: BowListView.cs プロジェクト: tongxingyang/TanksWar
        void UpdateRadian(float curRadian, bool updateData, bool leaveScreen)
        {
            if (!m_isLoop)
            {
                if (curRadian > (m_data.Count - 1) * m_radianPerNode)
                {
                    curRadian = (m_data.Count - 1) * m_radianPerNode;
                }
                if (curRadian < 0)
                {
                    curRadian = 0;
                }
            }
            float radian = GetFormalRadian(curRadian);

            if (!m_isLoop)
            {
                radian = curRadian;
            }

            float endRadian     = GetChainEndRadian();
            float maxNodeRadian = endRadian;

            // 先判断超出屏幕的节点
            for (int i = 0; i < m_data.Count; i++)
            {
                VirtualListNode virtualNode = m_virtualNodes[i];
                virtualNode.m_show      = false;
                virtualNode.m_usedCount = 0;
                foreach (BowListItem item in virtualNode.m_addList)
                {
                    RecollectNode(item);
                }
                virtualNode.m_addList.Clear();
            }
            if (m_isLoop && m_data.Count == 1)
            {
                MarkShowNodes(radian + 2 * m_circleRaidan, curRadian, maxNodeRadian, leaveScreen);
            }
            // 上面的
            MarkShowNodes(radian + m_circleRaidan, curRadian, maxNodeRadian, leaveScreen);
            if (m_isLoop)
            {
                // 中间的
                MarkShowNodes(radian, curRadian, maxNodeRadian, leaveScreen);
                // 下面的
                MarkShowNodes(radian - m_circleRaidan, curRadian, maxNodeRadian, leaveScreen);
                if (m_data.Count == 1)
                {
                    MarkShowNodes(radian - 2 * m_circleRaidan, curRadian, maxNodeRadian, leaveScreen);
                }
            }


            // 先回收超出屏幕的节点,再设置出现的节点
            for (int i = 0; i < m_data.Count; i++)
            {
                VirtualListNode virtualNode = m_virtualNodes[i];
                if (!virtualNode.m_show)
                {
                    if (virtualNode.m_item != null)
                    {
                        RecollectNode(virtualNode.m_item);
                        virtualNode.m_item = null;
                    }
                }
            }

            if (m_isLoop && m_data.Count == 1)
            {
                ShowNodes(radian + 2 * m_circleRaidan, curRadian, maxNodeRadian, updateData, leaveScreen);
            }
            ShowNodes(radian + m_circleRaidan, curRadian, maxNodeRadian, updateData, leaveScreen);
            if (m_isLoop)
            {
                ShowNodes(radian, curRadian, maxNodeRadian, updateData, leaveScreen);
                ShowNodes(radian - m_circleRaidan, curRadian, maxNodeRadian, updateData, leaveScreen);
                if (m_data.Count == 1)
                {
                    ShowNodes(radian - 2 * m_circleRaidan, curRadian, maxNodeRadian, updateData, leaveScreen);
                }
            }

            foreach (BowChain chain in m_chains)
            {
                chain.UpdateRadian(curRadian, maxNodeRadian, leaveScreen);
            }
            foreach (BowWheel wheel in m_wheels)
            {
                wheel.SetRouteDistance(curRadian * m_radius);
            }
        }
コード例 #3
0
ファイル: BowListView.cs プロジェクト: tongxingyang/TanksWar
        void ShowNodes(float radian, float absRadian, float maxAbsRadian, bool updateData, bool leaveScreen)
        {
            for (int i = 0; i < m_data.Count; i++)
            {
                float nodeRadian     = i * m_radianPerNode - radian;
                float nodeRealRadian = nodeRadian + absRadian;
                if (!m_isLoop)
                {
                    nodeRadian     = i * m_radianPerNode - absRadian;
                    nodeRealRadian = nodeRadian;
                    float r = i * m_radianPerNode - absRadian;
                    if (r > m_leaveRadian || r < -m_leaveRadian)
                    {
                        continue;
                    }
                }

                if (nodeRealRadian > maxAbsRadian && leaveScreen)
                {
                    continue;
                }
                object          data        = m_data[i];
                VirtualListNode virtualNode = m_virtualNodes[i];
                if (Mathf.Abs(nodeRadian) > m_outRadian)
                {
                    continue;
                }
                BowListItem listItem;
                if (virtualNode.m_usedCount == 0)
                {
                    if (virtualNode.m_item == null)
                    {
                        virtualNode.m_item = CreateNode();
                        if (virtualNode.m_item == null)
                        {
                            Debug.LogError("list pool not big enough");
                            continue;
                        }
                        virtualNode.m_item.gameObject.name = "item" + i;
                        virtualNode.m_item.SetData(data);
                    }
                    else
                    {
                        if (updateData)
                        {
                            virtualNode.m_item.gameObject.name = "item" + i;
                            virtualNode.m_item.SetData(data);
                        }
                    }
                    listItem = virtualNode.m_item;
                }
                else
                {
                    listItem = CreateNode();
                    if (listItem == null)
                    {
                        Debug.LogError("list pool not big enough");
                        continue;
                    }
                    listItem.gameObject.name = "item" + i;
                    listItem.SetData(data);
                    virtualNode.m_addList.Add(listItem);
                }
                virtualNode.m_usedCount++;
                if (listItem != null)
                {
                    UpdatePosition(nodeRadian, listItem);
                    if (i == m_selectedIndex)
                    {
                        if (IsDifRadianShiftPlaying || IsRadianShiftPlaying)
                        {
                            listItem.SetSelected(false);
                        }
                        else
                        {
                            listItem.SetSelected(true);
                        }
                    }
                    else
                    {
                        listItem.SetSelected(false);
                    }
                }
            }
        }