zoukankan      html  css  js  c++  java
  • 蛋疼的时候写三消游戏(六)

    回来吃点东西,打把DOTA就1点了。。还是坚持下写点东西,不然就越推越迟了。

    今天主要把拖动的逻辑写完,现在可以自由上下左右移动了。

    主要的代码如下,写的略丑,有时间看能重构下最好:

        void OnPressReleased()
        {
            Debug.Log("released");
            
            if (m_curDir == MoveDir.LeftRight)
            {
                OnLRReleased();
                ResetPositionOfRow(m_CurPressRow);
            }
            else if (m_curDir == MoveDir.UpDown)
            {
                OnUDReleased();
                ResetPositionOfCol(m_CurPressCol);
            }
                
            RemoveObjectOfList(m_TailTempItemList);
            RemoveObjectOfList(m_HeadTempItemList);
            
            Debug.Log(m_GameData.ToString());
        }
        
        void OnLRReleased()
        {
            float curX = m_Items[m_CurPressRow,m_CurPressCol].transform.localPosition.x;
            float deltaPos = curX - m_CurPressItemOriPos.x;
            int deltaNum = (int)(deltaPos/m_fItemWidth);
            float leftDis = Mathf.Abs(curX - m_CurPressItemOriPos.x) - Mathf.Abs(m_fItemWidth * deltaNum);
            Debug.Log("leftDis:"+leftDis);
            Debug.Log("deltaNum:"+deltaNum);
            int count = Mathf.Abs(deltaNum);
                    
            if (leftDis > m_fItemWidth/2)
            {
                count += 1;
            }
    
            // move left
            if (deltaPos < 0)
            {
                // swap the game items with temp items
                for (int i = 0; i < count; i++)
                {
                    GameObject item = m_Items[m_CurPressRow, i];
                    ((GameObject)m_TailTempItemList[i]).name = item.name;
                    ((GameObject)m_TailTempItemList[i]).GetComponent<BoxCollider>().size = item.GetComponent<BoxCollider>().size; 
                    m_Items[m_CurPressRow, i] = (m_TailTempItemList[i] as GameObject);
                    UIEventListener.Get(m_Items[m_CurPressRow, i]).onPress += OnPressItem;
                    UIEventListener.Get(m_Items[m_CurPressRow, i]).onDrag += OnDragItem;
                    m_TailTempItemList[i] = item;
                    Debug.Log("change");
                }
                        
                ResetRowIndex(m_CurPressRow, count, true);
            }
            else if (deltaPos > 0)
            {    
                // swap the game items with temp items
                for (int i = 0; i < count; i++)
                {
                    GameObject item = m_Items[m_CurPressRow, NumCol-1-i];
                    ((GameObject)m_HeadTempItemList[i]).name = item.name;
                    ((GameObject)m_HeadTempItemList[i]).GetComponent<BoxCollider>().size = item.GetComponent<BoxCollider>().size; 
                    m_Items[m_CurPressRow, NumCol-1-i] = (m_HeadTempItemList[i] as GameObject);
                    UIEventListener.Get(m_Items[m_CurPressRow, NumCol-1-i]).onPress += OnPressItem;
                    UIEventListener.Get(m_Items[m_CurPressRow, NumCol-1-i]).onDrag += OnDragItem;
                    m_HeadTempItemList[i] = item;
                }
                
                
                ResetRowIndex(m_CurPressRow, count, false);
            }
        }
        
        void OnUDReleased()
        {
            float curY = m_Items[m_CurPressRow,m_CurPressCol].transform.localPosition.y;
            float deltaPos = curY - m_CurPressItemOriPos.y;
            int deltaNum = (int)(deltaPos/m_fItemHeight);
            float leftDis = Mathf.Abs(curY - m_CurPressItemOriPos.y) - Mathf.Abs(m_fItemHeight * deltaNum);
            Debug.Log("leftDis:"+leftDis);
            Debug.Log("deltaNum:"+deltaNum);
            int count = Mathf.Abs(deltaNum);
                    
            if (leftDis > m_fItemHeight/2)
            {
                count += 1;
            }
            
            // move down
            if (deltaPos < 0)
            {
                // swap the game items with temp items
                for (int i = 0; i < count; i++)
                {
                    GameObject item = m_Items[NumRow-1-i,m_CurPressCol];
                    ((GameObject)m_TailTempItemList[i]).name = item.name;
                    ((GameObject)m_TailTempItemList[i]).GetComponent<BoxCollider>().size = item.GetComponent<BoxCollider>().size; 
                    m_Items[NumRow-1-i, m_CurPressCol] = (m_TailTempItemList[i] as GameObject);
                    UIEventListener.Get(m_Items[NumRow-1-i, m_CurPressCol]).onPress += OnPressItem;
                    UIEventListener.Get(m_Items[NumRow-1-i, m_CurPressCol]).onDrag += OnDragItem;
                    m_TailTempItemList[i] = item;    
                }
                ResetColIndex(m_CurPressCol, count, true);
            }
            else if (deltaPos > 0)
            {
                // swap the game items with temp items
                for (int i = 0; i < count; i++)
                {
                    GameObject item = m_Items[i, m_CurPressCol];
                    ((GameObject)m_HeadTempItemList[i]).name = item.name;
                    ((GameObject)m_HeadTempItemList[i]).GetComponent<BoxCollider>().size = item.GetComponent<BoxCollider>().size; 
                    m_Items[i, m_CurPressCol] = (m_HeadTempItemList[i] as GameObject);
                    UIEventListener.Get(m_Items[i, m_CurPressCol]).onPress += OnPressItem;
                    UIEventListener.Get(m_Items[i, m_CurPressCol]).onDrag += OnDragItem;
                    m_HeadTempItemList[i] = item;
                }
                ResetColIndex(m_CurPressCol, count, false);
            }
        }
        
        void ResetRowIndex(int row, int count, bool left)
        {
            string nameIndex;
            ItemData.DataType type;
            GameObject go;
            int resetCount = 0;
            int resetNameCount = 0;
            
            if (left)
            {
                resetCount = NumCol - count;
                resetNameCount = count;
            }
            else
            {
                resetCount = count;
                resetNameCount = NumCol - count;
            }
            
            // correct the items reference
            for (int i = 0; i < resetCount; i++)
            {
                go = m_Items[row, NumCol-1];
                type = m_GameData.Data[row, NumCol-1].Type;
                for (int k = NumCol-1; k > 0; k--)
                {
                    m_Items[row, k] = m_Items[row, k-1];
                    m_GameData.Data[row, k].Type = m_GameData.Data[row, k-1].Type;
                }
                m_Items[row, 0] = go;
                m_GameData.Data[row, 0].Type = type;
            }
            //correct the gameobject name index
            for (int i = 0; i < resetNameCount; i++)
            {
                nameIndex = m_Items[row,NumCol-1].name;
                        
                for (int k = NumCol-1; k > 0; k--)
                {
                    m_Items[row, k].name = m_Items[row, k-1].name;        
                }
                
                m_Items[row, 0].name = nameIndex;        
            }
        }
        
        void ResetColIndex(int col, int count, bool up)
        {
            string nameIndex;
            ItemData.DataType type;
            GameObject go;
            int resetCount = 0;
            int resetNameCount = 0;
            
            if (up)
            {
                resetCount = count;
                resetNameCount = NumRow - count;        
            }
            else
            {
                resetCount = NumRow - count;
                resetNameCount = count;
            }
            
            // correct the items reference
            for (int i = 0; i < resetCount; i++)
            {
                go = m_Items[NumRow - 1, col];
                type = m_GameData.Data[NumRow-1,col].Type;
                for (int k = NumRow - 1; k > 0; k--)
                {
                    m_Items[k,col] = m_Items[k-1,col];
                    m_GameData.Data[k, col].Type = m_GameData.Data[k-1, col].Type;
                }
                m_Items[0,col] = go;
                m_GameData.Data[0,col].Type = type;
            }
            //correct the gameobject name index
            for (int i = 0; i < resetNameCount; i++)
            {
                nameIndex = m_Items[NumRow-1, col].name;        
                for (int k = NumRow-1; k > 0; k--)
                {
                    m_Items[k, col].name = m_Items[k-1, col].name;        
                }
                m_Items[0,col].name = nameIndex;    
            }
        }
        
        void ResetPositionOfRow(int row)
        {
            for (int k = 0; k < NumCol; k++)
            {
                m_Items[row,k].transform.localPosition = new Vector3(k * m_fItemWidth + m_fItemWidth/2,
                            -row * m_fItemHeight - m_fItemHeight/2, 0) + m_GameBoardTopLeft;
            }
        }
        
        void ResetPositionOfCol(int col)
        {
            for (int k = 0; k < NumRow; k++)
            {
                m_Items[k,col].transform.localPosition = new Vector3(col * m_fItemWidth + m_fItemWidth/2,
                            -k * m_fItemHeight - m_fItemHeight/2, 0) + m_GameBoardTopLeft;
            }
        }
        
        public void OnDragItem(GameObject go, Vector2 delta)
        {
            string[] pos = go.name.Split('|');
            int row = int.Parse(pos[0]);
            int col = int.Parse(pos[1]);
            
            //Debug.Log("Click:["+row+","+col+"]");
            
            if (m_curDir == MoveDir.None)
            {
                if (Mathf.Abs(delta.x) > Mathf.Abs(delta.y))
                {
                    m_curDir = MoveDir.LeftRight;
                }
                else
                {
                    m_curDir = MoveDir.UpDown;
                }
            }
            
            if (m_curDir == MoveDir.LeftRight)
            {
                OnLRDrag(row, col, delta);
            }
            else if (m_curDir == MoveDir.UpDown)
            {
                OnUpDownDrag(row, col, delta);
            }
        }
        
        void OnLRDrag(int row, int col, Vector2 delta)
        {
            m_fCurMoveDelta = m_Items[row,col].transform.localPosition.x + delta.x - m_CurPressItemOriPos.x;
            Debug.Log(m_fCurMoveDelta);
            
            // if move to the end, stop it
            if (Mathf.Abs(m_fCurMoveDelta) < m_fItemWidth * (NumCol - 1))
            {
                // move items with drag delta
                foreach(GameObject temp in m_HeadTempItemList)
                {
                    temp.transform.localPosition += new Vector3(delta.x, 0, 0);
                }
                foreach(GameObject temp in m_TailTempItemList)
                {
                    temp.transform.localPosition += new Vector3(delta.x, 0, 0);
                }
                
                for (int i = 0; i < NumCol; i++)
                {    
                    m_Items[row,i].transform.localPosition += new Vector3(delta.x, 0, 0);        
                }        
                
                // calculate the num of items we moved
                m_CurDeltaNum = Mathf.Abs((int)(m_fCurMoveDelta/m_fItemWidth));
                Debug.Log("num:"+m_CurDeltaNum);
                if (m_fCurMoveDelta > 0)
                {
                    // if we move a harf item, we still need to create one temp items
                    if (m_CurDeltaNum + 1 > m_HeadTempItemList.Count)
                    {
                        GameObject tempItem = null;
                        UISprite img = null;
                        // don't have any temp items when you start to move the items
                        if (m_HeadTempItemList.Count == 0)
                        {
                            tempItem = NGUITools.AddChild(m_GamePanel, m_ItemPrefab);
                            tempItem.transform.localPosition = m_Items[row,0].transform.localPosition + new Vector3(-m_fItemWidth, 0, 0);
                            img = tempItem.transform.FindChild("ItemImg").GetComponent<UISprite>();
                            img.gameObject.transform.localScale = new Vector3(m_fItemWidth, m_fItemHeight, 0);
                            img.spriteName = m_Items[row,NumCol-1].transform.FindChild("ItemImg").GetComponent<UISprite>().spriteName;
                            m_HeadTempItemList.Add(tempItem);
                        }
                        else
                        {
                            GameObject last = m_HeadTempItemList[m_HeadTempItemList.Count - 1] as GameObject;
                            tempItem = NGUITools.AddChild(m_GamePanel, m_ItemPrefab);
                            tempItem.transform.localPosition = last.transform.localPosition + new Vector3(-m_fItemWidth, 0, 0);
                            img = tempItem.transform.FindChild("ItemImg").GetComponent<UISprite>();
                            img.gameObject.transform.localScale = new Vector3(m_fItemWidth, m_fItemHeight, 0);
                            img.spriteName = m_Items[row,NumCol-1-m_CurDeltaNum].transform.FindChild("ItemImg").GetComponent<UISprite>().spriteName;
                            m_HeadTempItemList.Add(tempItem);
                        }
                    }
                }
                else if(m_fCurMoveDelta < 0)
                {
                    // if we move a harf item, we still need to create one temp items
                    if (m_CurDeltaNum + 1 > m_TailTempItemList.Count)
                    {
                        GameObject tempItem = null;
                        UISprite img = null;
                        // don't have any temp items when you start to move the items
                        if (m_TailTempItemList.Count == 0)
                        {
                            tempItem = NGUITools.AddChild(m_GamePanel, m_ItemPrefab);
                            tempItem.transform.localPosition = m_Items[row,NumCol-1].transform.localPosition + new Vector3(m_fItemWidth, 0, 0);
                            img = tempItem.transform.FindChild("ItemImg").GetComponent<UISprite>();
                            img.gameObject.transform.localScale = new Vector3(m_fItemWidth, m_fItemHeight, 0);
                            img.spriteName = m_Items[row,0].transform.FindChild("ItemImg").GetComponent<UISprite>().spriteName;
                            m_TailTempItemList.Add(tempItem);
                        }
                        else
                        {
                            GameObject last = m_TailTempItemList[m_TailTempItemList.Count - 1] as GameObject;
                            tempItem = NGUITools.AddChild(m_GamePanel, m_ItemPrefab);
                            tempItem.transform.localPosition = last.transform.localPosition + new Vector3(m_fItemWidth, 0, 0);
                            img = tempItem.transform.FindChild("ItemImg").GetComponent<UISprite>();
                            img.gameObject.transform.localScale = new Vector3(m_fItemWidth, m_fItemHeight, 0);
                            img.spriteName = m_Items[row,m_CurDeltaNum].transform.FindChild("ItemImg").GetComponent<UISprite>().spriteName;
                            m_TailTempItemList.Add(tempItem);
                        }
                    }
                }
            }// end of side judge
        }
        
        void OnUpDownDrag(int row, int col, Vector2 delta)
        {
            m_fCurMoveDelta = m_Items[row,col].transform.localPosition.y + delta.y - m_CurPressItemOriPos.y;
            Debug.Log(m_fCurMoveDelta);
            
            // if move to the end, stop it
            if (Mathf.Abs(m_fCurMoveDelta) < m_fItemHeight * (NumRow - 1))
            {
                // move items with drag delta
                foreach(GameObject temp in m_HeadTempItemList)
                {
                    temp.transform.localPosition += new Vector3(0, delta.y, 0);
                }
                foreach(GameObject temp in m_TailTempItemList)
                {
                    temp.transform.localPosition += new Vector3(0, delta.y, 0);
                }
                
                for (int i = 0; i < NumRow; i++)
                {    
                    m_Items[i,col].transform.localPosition += new Vector3(0, delta.y, 0);        
                }        
                
                // calculate the num of items we moved
                m_CurDeltaNum = Mathf.Abs((int)(m_fCurMoveDelta/m_fItemHeight));
                Debug.Log("num:"+m_CurDeltaNum);
                if (m_fCurMoveDelta > 0)
                {
                    // if we move a harf item, we still need to create one temp items
                    if (m_CurDeltaNum + 1 > m_HeadTempItemList.Count)
                    {
                        GameObject tempItem = null;
                        UISprite img = null;
                        // don't have any temp items when you start to move the items
                        if (m_HeadTempItemList.Count == 0)
                        {
                            tempItem = NGUITools.AddChild(m_GamePanel, m_ItemPrefab);
                            tempItem.transform.localPosition = m_Items[NumRow - 1,col].transform.localPosition + new Vector3(0, -m_fItemHeight, 0);
                            img = tempItem.transform.FindChild("ItemImg").GetComponent<UISprite>();
                            img.gameObject.transform.localScale = new Vector3(m_fItemWidth, m_fItemHeight, 0);
                            img.spriteName = m_Items[0,col].transform.FindChild("ItemImg").GetComponent<UISprite>().spriteName;
                            m_HeadTempItemList.Add(tempItem);
                        }
                        else
                        {
                            GameObject last = m_HeadTempItemList[m_HeadTempItemList.Count - 1] as GameObject;
                            tempItem = NGUITools.AddChild(m_GamePanel, m_ItemPrefab);
                            tempItem.transform.localPosition = last.transform.localPosition + new Vector3(0, -m_fItemHeight, 0);
                            img = tempItem.transform.FindChild("ItemImg").GetComponent<UISprite>();
                            img.gameObject.transform.localScale = new Vector3(m_fItemWidth, m_fItemHeight, 0);
                            img.spriteName = m_Items[m_CurDeltaNum,col].transform.FindChild("ItemImg").GetComponent<UISprite>().spriteName;
                            m_HeadTempItemList.Add(tempItem);
                        }
                    }
                }
                else if(m_fCurMoveDelta < 0)
                {
                    // if we move a harf item, we still need to create one temp items
                    if (m_CurDeltaNum + 1 > m_TailTempItemList.Count)
                    {
                        GameObject tempItem = null;
                        UISprite img = null;
                        // don't have any temp items when you start to move the items
                        if (m_TailTempItemList.Count == 0)
                        {
                            tempItem = NGUITools.AddChild(m_GamePanel, m_ItemPrefab);
                            tempItem.transform.localPosition = m_Items[0,col].transform.localPosition + new Vector3(0, m_fItemHeight, 0);
                            img = tempItem.transform.FindChild("ItemImg").GetComponent<UISprite>();
                            img.gameObject.transform.localScale = new Vector3(m_fItemWidth, m_fItemHeight, 0);
                            img.spriteName = m_Items[NumRow - 1,col].transform.FindChild("ItemImg").GetComponent<UISprite>().spriteName;
                            m_TailTempItemList.Add(tempItem);
                        }
                        else
                        {
                            GameObject last = m_TailTempItemList[m_TailTempItemList.Count - 1] as GameObject;
                            tempItem = NGUITools.AddChild(m_GamePanel, m_ItemPrefab);
                            tempItem.transform.localPosition = last.transform.localPosition + new Vector3(0, m_fItemHeight, 0);
                            img = tempItem.transform.FindChild("ItemImg").GetComponent<UISprite>();
                            img.gameObject.transform.localScale = new Vector3(m_fItemWidth, m_fItemHeight, 0);
                            img.spriteName = m_Items[NumRow-1-m_CurDeltaNum,col].transform.FindChild("ItemImg").GetComponent<UISprite>().spriteName;
                            m_TailTempItemList.Add(tempItem);
                        }
                    }
                }
            }// end of side judge
        }

    下面要做的就是如何来定义消除规则了,直接的三消似乎比较蛋疼,暂时有个想法是用类似围棋的矩形来消除:

    通过不断的移动来拼凑出矩形引爆那片区域,这样的移动感觉就有点魔方的味道了。挺益智的嘿嘿!

    程序上我就打算用一个策略模式来做消除判断,这样以后我可以方便的替换其它各种消除规则。

    看看周末能不能出个可玩的DEMO,睡觉了。PS:北京据说周末会降到-16度。

  • 相关阅读:
    图片懒加载原生写法。
    ES6新声明
    下拉刷新上拉加载
    angular动画
    angular路由切换后 轮播以及iscrollJs失效的问题
    ui-route多级嵌套时的默认显示。
    iscroll.js的基本布局
    angular ng-route和ui-route
    require.js JQ
    Cookie&Session
  • 原文地址:https://www.cnblogs.com/gameprogram/p/2828743.html
Copyright © 2011-2022 走看看