void MoveUp()
    {
        CELL_TYPE type = (CELL_TYPE)m_mapCtr.GetMapCell(m_row + 1, m_col).CellData.cellType;

        if (type != CELL_TYPE.STONE && type != CELL_TYPE.WALL && (CELL_TYPE)m_curCell.CellData.cellType == CELL_TYPE.LADDER)
        {
            MapCellCtr target = m_mapCtr.GetMapCell(m_row + 1, m_col);
            if (null != target)
            {
                m_targetPos = target.Position;
                m_isMoving  = true;
                m_dir       = new Vector3(0, 1, 0);
                m_ani.SetBool("run", false);
                m_ani.SetBool("climb", true);
                State        = PlayerState.CLIMB;
                m_isLookLeft = false;
                transform.localEulerAngles        = new Vector3(0, 0, 0);
                m_body.transform.localEulerAngles = new Vector3(0, 0, 0);
            }
            else
            {
                Debug.LogWarning("warning: astarMap not match spriteMap:" + (m_row + 1) + "," + (m_col));
            }
        }
    }
    public void CheckAttack()
    {
        if (m_isMoving || m_ani.GetBool("climb"))
        {
            return;
        }
        //stand on the wall and target must be wall
        CELL_TYPE underType = (CELL_TYPE)m_mapCtr.GetMapCell(m_row - 1, m_col).CellData.cellType;

        if (underType == CELL_TYPE.WALL || underType == CELL_TYPE.STONE)
        {
            Debug.Log("under type ok");
            int look = 1;
//			if (m_isLookLeft)
//				look = -1;
            MapCellCtr target = m_mapCtr.GetMapCell(m_row, m_col + look);
            if ((CELL_TYPE)target.CellData.cellType == CELL_TYPE.NONE)
            {
                Debug.Log("dir ok");
                MapCellCtr targetDown = m_mapCtr.GetMapCell(m_row - 1, m_col + look);
                if ((CELL_TYPE)targetDown.CellData.cellType == CELL_TYPE.WALL)
                {
                    Debug.Log("dir down ok");
                    m_isAttack = true;
                    m_ani.SetBool("run", false);
                    m_ani.SetBool("attack", m_isAttack);
                    State = PlayerState.ATTACK;
                    targetDown.ChangeToNone(true);
                }
            }
        }
    }
Esempio n. 3
0
 public void Init(int row, int col, MapCtr map)
 {
     m_isGround          = false;
     m_row               = row;
     m_col               = col;
     m_mapCtr            = map;
     m_curCell           = m_mapCtr.GetMapCell(row, col);
     transform.position  = m_curCell.Position;
     m_ani               = GetComponentInChildren <Animator> ();
     m_localPositionTemp = m_body.transform.localPosition;
 }
 public void Init(int row, int col, MapCtr map)
 {
     m_isMoving         = false;
     m_row              = row;
     m_col              = col;
     m_dir              = new Vector3(1, 0, 0);
     m_mapCtr           = map;
     m_curCell          = m_mapCtr.GetMapCell(row, col);
     transform.position = m_curCell.Position;
     m_ani              = GetComponentInChildren <Animator> ();
     CheckGround();
 }
    //

    public void Move(float horizontalInput, float verticalInput, bool jump = false)
    {
        if (m_isAttack)
        {
            return;
        }
        if (m_isMoving)
        {
            return;
        }
        if (jump)
        {
            jumpTarget = CheckJump();
            if (jumpTarget != null)
            {
                m_isJumping = true;
                return;
            }
        }
        hInput = horizontalInput;
        vInput = verticalInput;
        if (Mathf.Abs(hInput) > 0.5f)
        {
            if (hInput > 0)
            {
                MoveRight();
            }
            else
            {
                MoveLeft();
            }
        }
        //
        if (Mathf.Abs(vInput) > 0.5f)
        {
            if (vInput > 0)
            {
                MoveUp();
            }
            else
            {
                MoveDown();
            }
        }
    }
 // Update is called once per frame
 void Update()
 {
     if (m_isJumping && !m_isMoving)
     {
         float   step = m_moveSpeed * Time.deltaTime;
         Vector3 dir  = jumpTarget.Position - transform.position;
         transform.position += dir * step;
         if (Vector3.Distance(transform.position, jumpTarget.Position) < step * 1.5f)
         {
             transform.position = new Vector3(jumpTarget.Position.x, jumpTarget.Position.y, transform.position.z);
             m_row       = jumpTarget.CellData.row;
             m_col       = jumpTarget.CellData.col;
             m_curCell   = jumpTarget;
             m_isJumping = false;
             CheckGround();
             State = PlayerState.STAND;
             if (null != m_playerMoveOverEvent)
             {
                 m_playerMoveOverEvent.Invoke(this);
             }
         }
     }
     else if (m_isMoving)
     {
         float step = m_moveSpeed * Time.deltaTime;
         transform.position += m_dir * step;
         if (Vector2.Distance(new Vector2(transform.position.x, transform.position.y), new Vector2(m_targetPos.x, m_targetPos.y)) < step * 1.5f)
         {
             transform.position = new Vector3(m_targetPos.x, m_targetPos.y, transform.position.z);
             m_row     += (int)m_dir.y;
             m_col     += (int)m_dir.x;
             m_curCell  = m_mapCtr.GetMapCell(m_row, m_col);
             m_isMoving = false;
             CheckGround();
             State = PlayerState.STAND;
             if (null != m_playerMoveOverEvent)
             {
                 m_playerMoveOverEvent.Invoke(this);
             }
         }
     }
 }
    //
    protected MapCellCtr CheckJump()
    {
        if (m_isMoving)
        {
            return(null);
        }
        MapCellCtr upCell     = m_mapCtr.GetMapCell(m_row + 1, m_col);
        MapCellCtr targetCell = m_mapCtr.GetMapCell(m_row, m_col + 1);

        if (m_isLookLeft)
        {
            targetCell = m_mapCtr.GetMapCell(m_row, m_col - 1);
        }
        if ((CELL_TYPE)upCell.CellData.cellType != CELL_TYPE.WALL && (CELL_TYPE)upCell.CellData.cellType != CELL_TYPE.STONE &&
            (CELL_TYPE)targetCell.CellData.cellType != CELL_TYPE.WALL && (CELL_TYPE)targetCell.CellData.cellType != CELL_TYPE.STONE)
        {
            return(targetCell);
        }
        return(null);
    }
    void MoveLeft()
    {
        CELL_TYPE type = (CELL_TYPE)m_mapCtr.GetMapCell(m_row, m_col - 1).CellData.cellType;

        if (type != CELL_TYPE.STONE && type != CELL_TYPE.WALL)
        {
            MapCellCtr target = m_mapCtr.GetMapCell(m_row, m_col - 1);
            if (null != target)
            {
                m_targetPos = target.Position;
                m_isMoving  = true;
                m_dir       = new Vector3(-1, 0, 0);
                if ((CELL_TYPE)target.CellData.cellType == CELL_TYPE.POLE)
                {
                    transform.localEulerAngles        = new Vector3(0, 0, 90);
                    m_body.transform.localEulerAngles = new Vector3(0, 90, 0);
                    m_ani.SetBool("run", false);
                    m_ani.SetBool("climb", true);
                    State        = PlayerState.CLIMB;
                    m_isLookLeft = true;
                }
                else
                {
                    transform.localEulerAngles        = new Vector3(0, 0, 0);
                    m_body.transform.localEulerAngles = new Vector3(0, -90, 0);
                    m_isLookLeft = true;
                    m_ani.SetBool("run", true);
                    m_ani.SetBool("climb", false);
                    State = PlayerState.RUN;
                }
            }
            else
            {
                Debug.LogWarning("warning: astarMap not match spriteMap:" + m_row + "," + (m_col + 1));
            }
        }
    }
Esempio n. 9
0
    void FixedUpdate()
    {
        if (!CanControl)
        {
            return;
        }
        //上格子
        Vector2    upPos      = new Vector2(transform.position.x, transform.position.y + (float)m_mapCtr.Map.cellHeight * 0.5f);
        MapCellCtr upCell     = m_mapCtr.GetMapCell(upPos);
        CELL_TYPE  upCellType = (CELL_TYPE)upCell.CellData.cellType;
        //下
        MapCellCtr downCell     = m_mapCtr.GetMapCell(new Vector2(transform.position.x, transform.position.y - (float)m_mapCtr.Map.cellHeight * 0.5f));
        CELL_TYPE  downCellType = (CELL_TYPE)downCell.CellData.cellType;
        //右
        Vector2    rightPos      = new Vector2(transform.position.x + (float)m_mapCtr.Map.cellWidth * 0.5f, transform.position.y);
        MapCellCtr rightCell     = m_mapCtr.GetMapCell(rightPos);
        CELL_TYPE  rightCellType = (CELL_TYPE)rightCell.CellData.cellType;
        //左
        Vector2    leftPos      = new Vector2(transform.position.x - (float)m_mapCtr.Map.cellWidth * 0.5f, transform.position.y);
        MapCellCtr leftCell     = m_mapCtr.GetMapCell(leftPos);
        CELL_TYPE  leftCellType = (CELL_TYPE)leftCell.CellData.cellType;
        //foot
        MapCellCtr footCell     = m_mapCtr.GetMapCell(new Vector2(transform.position.x, transform.position.y - (float)m_mapCtr.Map.cellHeight * 0.5f + 0.1f));
        CELL_TYPE  footCellType = (CELL_TYPE)footCell.CellData.cellType;

        //cur
        m_curCell = m_mapCtr.GetMapCell(new Vector2(transform.position.x, transform.position.y));
        CELL_TYPE curCellType = (CELL_TYPE)m_curCell.CellData.cellType;

        m_row = m_curCell.CellData.row;
        m_col = m_curCell.CellData.col;

        //检查是否劈砖
        float angleY = m_body.transform.localRotation.eulerAngles.y;

        angleY = angleY > 180 ? (angleY - 360):angleY;
        if (angleY > 10)
        {
            m_look = 1;
        }
        else if (angleY < -10)
        {
            m_look = -1;
        }
        else
        {
            m_look = 0;
        }
        if (m_isHitInput)
        {
            m_isHitInput = false;
            if (downCellType == CELL_TYPE.WALL || downCellType == CELL_TYPE.STONE)
            {
                if (m_look != 0)
                {
                    MapCellCtr target = m_mapCtr.GetMapCell(m_row, m_col + m_look);
                    if ((CELL_TYPE)target.CellData.cellType == CELL_TYPE.NONE)
                    {
                        MapCellCtr targetDown = m_mapCtr.GetMapCell(m_row - 1, m_col + m_look);
                        if ((CELL_TYPE)targetDown.CellData.cellType == CELL_TYPE.WALL)
                        {
                            m_isAttack = true;
                            m_ani.SetBool("run", false);
                            m_ani.SetBool("attack", m_isAttack);
                            targetDown.ChangeToNone(true);
                            AudioManager.Instance.PlayAudio("attack");
                        }
                    }
                }
            }
        }
        if (m_isAttack)
        {
            return;
        }

        //计算重力
        m_verticalAccelerate += m_g;
        if (m_verticalAccelerate > 0)
        {
            if (upCellType == CELL_TYPE.STONE || upCellType == CELL_TYPE.WALL)
            {
                m_verticalAccelerate = 0;
            }
            if (footCellType == CELL_TYPE.POLE)
            {
                m_verticalAccelerate = m_g;
                m_isGround           = true;
            }
        }
        else if (m_verticalAccelerate < 0)
        {
            if (downCellType == CELL_TYPE.STONE || downCellType == CELL_TYPE.WALL ||
                downCellType == CELL_TYPE.LADDER || curCellType == CELL_TYPE.POLE)
            {
                m_verticalAccelerate = 0;
                m_isGround           = true;
            }
            else
            {
                m_isGround = false;
                m_body.transform.localEulerAngles = new Vector3(0, m_body.transform.localEulerAngles.y, 0);
            }
            //
            if (downCellType == CELL_TYPE.STONE || downCellType == CELL_TYPE.WALL)
            {
                transform.position = new Vector3(transform.position.x, downCell.Position.y + (float)m_mapCtr.Map.cellHeight - 0.01f, transform.position.z);
            }
        }
        else
        {
            m_isGround = true;
        }
        //计算左右位移和上下楼梯
        if (m_dir.x > 0)
        {
            if (rightCellType == CELL_TYPE.STONE || rightCellType == CELL_TYPE.WALL)
            {
                m_dir = new Vector2(0, m_dir.y);
            }
        }
        else if (m_dir.x < 0)
        {
            if (leftCellType == CELL_TYPE.STONE || leftCellType == CELL_TYPE.WALL)
            {
                m_dir = new Vector2(0, m_dir.y);
            }
        }

        //
        if (m_dir.y > 0)
        {
            if (footCellType != CELL_TYPE.LADDER)
            {
                m_dir = new Vector2(m_dir.x, 0);
            }
        }
        else
        {
            if (downCellType == CELL_TYPE.STONE || downCellType == CELL_TYPE.WALL)
            {
                m_dir = new Vector2(m_dir.x, 0);
            }
        }
        //最后综合考虑重力和输入的上下左右
        Vector2 velocity = m_verticalAccelerate * new Vector2(0, 1) * Time.fixedDeltaTime + m_dir * m_moveSpeed;
        Vector2 dist     = velocity * Time.fixedDeltaTime;

        transform.position += new Vector3(dist.x, dist.y, 0);

        //animation
        //是否播放run动画
        if (Mathf.Abs(m_dir.x) > 0 && m_isGround)
        {
            if ((footCellType != CELL_TYPE.LADDER && footCellType != CELL_TYPE.POLE) ||
                (downCellType == CELL_TYPE.WALL || downCellType == CELL_TYPE.STONE))
            {
                m_isRun = true;
            }
            else
            {
                m_isRun = false;
            }
        }
        else
        {
            m_isRun = false;
        }
        //是否播放climb动画
        m_isPole = false;
        if (m_isGround && (footCellType == CELL_TYPE.LADDER || curCellType == CELL_TYPE.POLE))
        {
            if (downCellType == CELL_TYPE.STONE || downCellType == CELL_TYPE.WALL)
            {
                m_isClimb = false;
            }
            else
            {
                m_isClimb = true;
                if (curCellType == CELL_TYPE.POLE)
                {
                    m_isPole = true;
                }
            }
        }
//		else if(m_isGround && curCellType == CELL_TYPE.POLE && Mathf.Abs(m_dir.x) > 0){
//			m_isClimb = true;
//		}
        else
        {
            m_isClimb = false;
        }

        if (m_isGround && dist == Vector2.zero && m_isClimb)
        {
            m_ani.speed = 0;
        }
        else
        {
            m_ani.speed = 1;
        }
        m_ani.SetBool("isGround", m_isGround);
        m_ani.SetBool("climb", m_isClimb);
        if (m_isClimb)
        {
            if (Mathf.Abs(m_dir.y) > 0)
            {
                AudioManager.Instance.PlayAudio("climb", true);
            }
            else
            {
                AudioManager.Instance.StopAudio("climb");
            }
            if (m_isPole)
            {
                //朝左爬
                if (velocity.x > 0.001f)
                {
                    m_body.transform.localEulerAngles = new Vector3(-90, 90, 180);
                    m_body.transform.localPosition    = new Vector3(-0.5f, m_localPositionTemp.y * 0.5f, m_localPositionTemp.z);
                }
                else if (velocity.x < -0.001f)                    //朝右爬
                {
                    m_body.transform.localEulerAngles = new Vector3(-90, 90, 0);
                    m_body.transform.localPosition    = new Vector3(0.5f, m_localPositionTemp.y * 0.5f, m_localPositionTemp.z);
                }
                else
                {
                    //未输入左右参数,且还未进行体位旋转
                    if (Mathf.Abs(m_body.transform.localPosition.x - 0.5f) > 0.01f)
                    {
                        m_body.transform.localEulerAngles = new Vector3(-90, 90, 180);
                        m_body.transform.localPosition    = new Vector3(-0.5f, m_localPositionTemp.y * 0.5f, m_localPositionTemp.z);
                    }
                }
            }
            else
            {
                m_body.transform.localPosition    = m_localPositionTemp;
                m_body.transform.localEulerAngles = new Vector3(0, 0, 0);
            }
        }
        else
        {
            AudioManager.Instance.StopAudio("climb");
            m_body.transform.localPosition = m_localPositionTemp;
            //m_body.transform.localEulerAngles = new Vector3 (0, 90, 0);
        }

        m_ani.SetBool("run", m_isRun);
        if (m_isRun)
        {
            //AudioManager.Instance.PlayAudio("run", true);
            if (velocity.x > 0)
            {
                m_body.transform.localEulerAngles = new Vector3(0, 90, 0);
            }
            else
            {
                m_body.transform.localEulerAngles = new Vector3(0, -90, 0);
            }
        }
        else
        {
            //AudioManager.Instance.StopAudio("run");
        }
        //是否播放jump动画
        if (m_verticalAccelerate > 0 && !m_isGround && !m_ani.GetBool("jump"))
        {
            m_ani.SetBool("jump", true);
            AudioManager.Instance.PlayAudio("jump");
        }
        if (m_isGround)
        {
            m_ani.SetBool("jump", false);
        }
        if (m_verticalAccelerate < 0 && !m_isGround)
        {
            if (m_dir.x > 0)
            {
                m_body.transform.localEulerAngles = new Vector3(0, 90, 0);
            }
            else if (m_dir.x < 0)
            {
                m_body.transform.localEulerAngles = new Vector3(0, -90, 0);
            }
        }
        //检查当前格子是否有bra/underpant/sock物品
        object[] p = new object[2];
        p[0] = (object)Row;
        p[1] = (object)Column;
        if (curCellType == CELL_TYPE.BRA)
        {
            MapCell.ChangeToNone(false);
            GameStateManager.Instance().FSM.CurrentState.Message("GetBra", p);
            AudioManager.Instance.PlayAudio("get");
        }
        else if (curCellType == CELL_TYPE.UNDERPANT)
        {
            MapCell.ChangeToNone(false);
            GameStateManager.Instance().FSM.CurrentState.Message("GetUnderpant", p);
            AudioManager.Instance.PlayAudio("get");
        }
        else if (curCellType == CELL_TYPE.SOCKS)
        {
            MapCell.ChangeToNone(false);
            GameStateManager.Instance().FSM.CurrentState.Message("GetSocks", p);
            AudioManager.Instance.PlayAudio("get");
        }
        //是否是出口
        if (m_mapCtr.CanExit && Row == m_mapCtr.ExitEndRow && Column == m_mapCtr.ExitEndCol)
        {
            GameStateManager.Instance().FSM.CurrentState.Message("Vectory", p);
        }
        //是否遇到狗狗
        if (m_mapCtr.IsMeetWithDog(transform.position))
        {
            GameStateManager.Instance().FSM.CurrentState.Message("PlayerDead", p);
        }
    }
Esempio n. 10
0
    void FromMapData(MapData md)
    {
        m_map = md;
        transform.position = new Vector3((float)md.startPosX, (float)md.startPosY, (float)md.startPosZ);

        cells           = new MapCellCtr[m_map.column, m_map.row];
        BraUnderpantNum = 0;
        //
        foreach (MapCellData item in md.cells)
        {
            GameObject go = new GameObject();
            go.AddComponent <SpriteRenderer> ();
            MapCellCtr mcc = go.AddComponent <MapCellCtr> ();
            go.transform.parent = this.transform;
            go.name             = item.col + "_" + item.row;
            mcc.Init(this, item);
            cells [item.col, item.row] = mcc;
            //
            if ((CELL_TYPE)mcc.CellData.cellType == CELL_TYPE.BRA ||
                (CELL_TYPE)mcc.CellData.cellType == CELL_TYPE.UNDERPANT)
            {
                BraUnderpantNum += 1;
            }
        }
        foreach (MapCellData item in md.cells)
        {
            switch ((CELL_ADDITION)item.cellAdd)
            {
            case CELL_ADDITION.EXIT:
                exitRow = item.row;
                exitCol = item.col;
                ShowExit(false);
                break;

            case CELL_ADDITION.PLAYER:
                LoadPlayer(item.row, item.col);
                break;

            case CELL_ADDITION.DOG:
                LoadDog(item.row, item.col);
                break;
            }
        }
        //
        m_decorationList.Clear();
        foreach (DecorationData item in md.decorations)
        {
            GameObject go = new GameObject();
            go.AddComponent <SpriteRenderer> ();
            go.transform.parent     = this.transform;
            go.name                 = item.resName;
            go.transform.position   = new Vector3((float)item.posX, (float)item.posY, (float)item.posZ);
            go.transform.rotation   = Quaternion.Euler(new Vector3((float)item.eulerX, (float)item.eulerY, (float)item.eulerZ));
            go.transform.localScale = new Vector3((float)item.scaleX, (float)item.scaleY, (float)item.scaleZ);
            if (!string.IsNullOrEmpty(item.resName))
            {
                go.GetComponent <SpriteRenderer> ().sprite = Resources.Load("Sprites/" + item.resName, typeof(Sprite)) as Sprite;
            }
            else
            {
                go.GetComponent <SpriteRenderer> ().sprite = null;
            }
            go.GetComponent <SpriteRenderer> ().sortingOrder     = item.sortOrder;
            go.GetComponent <SpriteRenderer> ().sortingLayerName = item.sortLayer;
            m_decorationList.Add(go);
        }
    }