示例#1
0
        public List<Tile> CheckIfCanMove(MOVE_DIRECTIONS dir, STATE currentState, List<Tile> currentTiles, Player player)
        {
            //Temps:
            List<Tile> tilesToCheck = new List<Tile>();
            Vector2 position = Vector2.Zero;

            //Verificando o estado:
            switch (currentState)
            {
                #region STANDING
                case STATE.STANDING:
                    //Ocupo apenas um tile no mapa, então pegando a posição do mesmo:
                    position = currentTiles[0].MapPosition;

                    //Verificando de acordo com a direção que queremos ir:
                    switch (dir)
                    {
                        #region NORT_WEST
                        case MOVE_DIRECTIONS.NORT_WEST:
                            //Verificando se caímos fora do mapa (Buracos ou Laterais do mapa):
                            if (GetTile(new Vector2(position.X, position.Y - 1)) == null ||
                               GetTile(new Vector2(position.X, position.Y - 1)).Type == TILE_TYPES.HOLE)
                            {
                                //Caindo e retornando nulo:
                                player.Fall(dir);
                                return null;
                            }
                            else
                            {
                                //Temos uma parede?
                                if (GetTile(new Vector2(position.X, position.Y - 1)).Type == TILE_TYPES.HEIGHT_ONE)
                                {
                                    //Não podemos nos mover:
                                    return null;
                                }
                            }

                            //Verificando se caímos fora do mapa (Buracos ou Laterais do mapa):
                            if (GetTile(new Vector2(position.X, position.Y - 2)) == null ||
                               GetTile(new Vector2(position.X, position.Y - 2)).Type == TILE_TYPES.HOLE)
                            {
                                //Caindo e retornando nulo:
                                player.Fall(dir);
                                return null;
                            }
                            else
                            {
                                //Temos uma parede?
                                if (GetTile(new Vector2(position.X, position.Y - 2)).Type == TILE_TYPES.HEIGHT_ONE)
                                {
                                    //Não podemos nos mover:
                                    return null;
                                }
                            }

                            //Se chegamos até aqui, adicionando os tiles:
                            tilesToCheck.Add(GetTile(new Vector2(position.X, position.Y - 1)));
                            tilesToCheck.Add(GetTile(new Vector2(position.X, position.Y - 2)));
                            break;
                        #endregion
                        #region SOUTH_WEST
                        case MOVE_DIRECTIONS.SOUTH_WEST:
                            //Verificando se caímos fora do mapa (Buracos ou Laterais do mapa):
                            if (GetTile(new Vector2(position.X - 1, position.Y)) == null ||
                               GetTile(new Vector2(position.X - 1, position.Y)).Type == TILE_TYPES.HOLE)
                            {
                                //Caindo e retornando nulo:
                                player.Fall(dir);
                                return null;
                            }
                            else
                            {
                                //Temos uma parede?
                                if (GetTile(new Vector2(position.X - 1, position.Y)).Type == TILE_TYPES.HEIGHT_ONE)
                                {
                                    //Não podemos nos mover:
                                    return null;
                                }
                            }

                            //Verificando se caímos fora do mapa (Buracos ou Laterais do mapa):
                            if (GetTile(new Vector2(position.X - 2, position.Y)) == null ||
                               GetTile(new Vector2(position.X - 2, position.Y)).Type == TILE_TYPES.HOLE)
                            {
                                //Caindo e retornando nulo:
                                player.Fall(dir);
                                return null;
                            }
                            else
                            {
                                //Temos uma parede?
                                if (GetTile(new Vector2(position.X - 2, position.Y)).Type == TILE_TYPES.HEIGHT_ONE)
                                {
                                    //Não podemos nos mover:
                                    return null;
                                }
                            }

                            //Se chegamos até aqui, adicionando os tiles:
                            tilesToCheck.Add(GetTile(new Vector2(position.X - 1, position.Y)));
                            tilesToCheck.Add(GetTile(new Vector2(position.X - 2, position.Y)));
                            break;
                        #endregion
                        #region SOUTH_EAST
                        case MOVE_DIRECTIONS.SOUTH_EAST:
                            //Verificando se caímos fora do mapa (Buracos ou Laterais do mapa):
                            if (GetTile(new Vector2(position.X, position.Y + 1)) == null ||
                               GetTile(new Vector2(position.X, position.Y + 1)).Type == TILE_TYPES.HOLE)
                            {
                                //Caindo e retornando nulo:
                                player.Fall(dir);
                                return null;
                            }
                            else
                            {
                                //Temos uma parede?
                                if (GetTile(new Vector2(position.X, position.Y + 1)).Type == TILE_TYPES.HEIGHT_ONE)
                                {
                                    //Não podemos nos mover:
                                    return null;
                                }
                            }

                            //Verificando se caímos fora do mapa (Buracos ou Laterais do mapa):
                            if (GetTile(new Vector2(position.X, position.Y + 2)) == null ||
                               GetTile(new Vector2(position.X, position.Y + 2)).Type == TILE_TYPES.HOLE)
                            {
                                //Caindo e retornando nulo:
                                player.Fall(dir);
                                return null;
                            }
                            else
                            {
                                //Temos uma parede?
                                if (GetTile(new Vector2(position.X, position.Y + 2)).Type == TILE_TYPES.HEIGHT_ONE)
                                {
                                    //Não podemos nos mover:
                                    return null;
                                }
                            }

                            //Se chegamos até aqui, adicionando os tiles:
                            tilesToCheck.Add(GetTile(new Vector2(position.X, position.Y + 1)));
                            tilesToCheck.Add(GetTile(new Vector2(position.X, position.Y + 2)));
                            break;
                        #endregion
                        #region NORT_EAST
                        case MOVE_DIRECTIONS.NORT_EAST:
                            //Verificando se caímos fora do mapa (Buracos ou Laterais do mapa):
                            if (GetTile(new Vector2(position.X + 1, position.Y)) == null ||
                               GetTile(new Vector2(position.X + 1, position.Y)).Type == TILE_TYPES.HOLE)
                            {
                                //Caindo e retornando nulo:
                                player.Fall(dir);
                                return null;
                            }
                            else
                            {
                                //Temos uma parede?
                                if (GetTile(new Vector2(position.X + 1, position.Y)).Type == TILE_TYPES.HEIGHT_ONE)
                                {
                                    //Não podemos nos mover:
                                    return null;
                                }
                            }

                            //Verificando se caímos fora do mapa (Buracos ou Laterais do mapa):
                            if (GetTile(new Vector2(position.X + 2, position.Y)) == null ||
                               GetTile(new Vector2(position.X + 2, position.Y)).Type == TILE_TYPES.HOLE)
                            {
                                //Caindo e retornando nulo:
                                player.Fall(dir);
                                return null;
                            }
                            else
                            {
                                //Temos uma parede?
                                if (GetTile(new Vector2(position.X + 2, position.Y)).Type == TILE_TYPES.HEIGHT_ONE)
                                {
                                    //Não podemos nos mover:
                                    return null;
                                }
                            }

                            //Se chegamos até aqui, adicionando os tiles:
                            tilesToCheck.Add(GetTile(new Vector2(position.X + 1, position.Y)));
                            tilesToCheck.Add(GetTile(new Vector2(position.X + 2, position.Y)));
                            break;
                            #endregion
                    }
                    break;
                #endregion
                #region DIAGONAL_UP
                case STATE.DIAGONAL_UP:
                    //Verificando de acordo com a direção que queremos ir:
                    switch (dir)
                    {
                        case MOVE_DIRECTIONS.NORT_WEST:
                            //Adicionando o tile acima de cada tile atual:
                            foreach (var tile in currentTiles)
                            {
                                //Verificando se caímos:
                                if (GetTile(new Vector2(tile.MapPosition.X, tile.MapPosition.Y - 1)) == null)
                                {
                                    player.Fall(dir);
                                    return null;
                                }

                                tilesToCheck.Add(GetTile(new Vector2(tile.MapPosition.X, tile.MapPosition.Y - 1)));
                            }
                            break;
                        case MOVE_DIRECTIONS.SOUTH_EAST:
                            //Adicionando o tile abaixo de cada tile atual:
                            foreach (var tile in currentTiles)
                            {
                                //Verificando se caímos:
                                if (GetTile(new Vector2(tile.MapPosition.X, tile.MapPosition.Y + 1)) == null)
                                {
                                    player.Fall(dir);
                                    return null;
                                }

                                tilesToCheck.Add(GetTile(new Vector2(tile.MapPosition.X, tile.MapPosition.Y + 1)));
                            }
                            break;
                        case MOVE_DIRECTIONS.SOUTH_WEST:
                            //Considerando o tile com menor X:
                            position = currentTiles[0].MapPosition;

                            foreach (var tile in currentTiles)
                            {
                                if (tile.MapPosition.X < position.X)
                                    position = tile.MapPosition;
                            }

                            //Verificando se caímos:
                            if (GetTile(new Vector2(position.X - 1, position.Y)) == null)
                            {
                                player.Fall(dir);
                                return null;
                            }

                            //Pegando um tile abaixo do tile selecionado:
                            tilesToCheck.Add(GetTile(new Vector2(position.X - 1, position.Y)));
                            break;
                        case MOVE_DIRECTIONS.NORT_EAST:
                            //Considerando o tile com menor X:
                            position = currentTiles[0].MapPosition;

                            foreach (var tile in currentTiles)
                            {
                                if (tile.MapPosition.X < position.X)
                                    position = tile.MapPosition;
                            }

                            //Verificando se caímos:
                            if (GetTile(new Vector2(position.X + 2, position.Y)) == null)
                            {
                                player.Fall(dir);
                                return null;
                            }

                            //Pegando dois tiles acima do tile selecionado:
                            tilesToCheck.Add(GetTile(new Vector2(position.X + 2, position.Y)));
                            break;
                    }
                    break;
                #endregion
                #region DIAGONAL_DOWN
                case STATE.DIAGONAL_DOWN:
                    //Dos tiles ocupados, considerando o que tem o menor Y:
                    position = currentTiles[0].MapPosition;

                    foreach (var tile in currentTiles)
                    {
                        if (tile.MapPosition.Y < position.Y)
                            position = tile.MapPosition;
                    }

                    //Verificando de acordo com a direção que queremos ir:
                    switch (dir)
                    {
                        case MOVE_DIRECTIONS.NORT_WEST:
                            //Verificando se caímos:
                            if (GetTile(new Vector2(position.X, position.Y - 1)) == null)
                            {
                                player.Fall(dir);
                                return null;
                            }

                            //Pegando um tile abaixo do tile selecionado:
                            tilesToCheck.Add(GetTile(new Vector2(position.X, position.Y - 1)));
                            break;
                        case MOVE_DIRECTIONS.SOUTH_WEST:
                            foreach (var tile in currentTiles)
                            {
                                //Verificando se caímos:
                                if (GetTile(new Vector2(tile.MapPosition.X - 1, tile.MapPosition.Y)) == null)
                                {
                                    player.Fall(dir);
                                    return null;
                                }

                                //Adicionando o tile acima de cada tile atual:
                                tilesToCheck.Add(GetTile(new Vector2(tile.MapPosition.X - 1, tile.MapPosition.Y)));
                            }
                            break;
                        case MOVE_DIRECTIONS.SOUTH_EAST:
                            //Verificando se caímos:
                            if (GetTile(new Vector2(position.X, position.Y + 2)) == null)
                            {
                                player.Fall(dir);
                                return null;
                            }

                            //Pegando dois tiles acima do tile selecionado:
                            tilesToCheck.Add(GetTile(new Vector2(position.X, position.Y + 2)));
                            break;
                        case MOVE_DIRECTIONS.NORT_EAST:
                            //Adicionando o tile abaixo de cada tile atual:
                            foreach (var tile in currentTiles)
                            {
                                //Verificando se caímos:
                                if (GetTile(new Vector2(tile.MapPosition.X + 1, tile.MapPosition.Y)) == null)
                                {
                                    player.Fall(dir);
                                    return null;
                                }

                                tilesToCheck.Add(GetTile(new Vector2(tile.MapPosition.X + 1, tile.MapPosition.Y)));
                            }
                            break;
                    }
                    break;
                    #endregion
            }

            //Recebemos algum tile?
            if (tilesToCheck.Count > 0)
            {
                //Verificando se os tiles são passáveis:
                foreach (var tile in tilesToCheck)
                {
                    //É parede?
                    if (tile.Type == TILE_TYPES.HEIGHT_ONE)
                    {
                        return null;
                    }
                    //É buraco?
                    else if (tile.Type == TILE_TYPES.HOLE)
                    {
                        //Caindo...
                        player.Fall(dir);
                        return null;
                    }

                }
            }
            else
            {
                //Falhamos.
                return null;
            }

            //Se chegamos até aqui, retornando a lista de tiles:
            return tilesToCheck;
        }
示例#2
0
        public void Move(MOVE_DIRECTIONS dir, Map map)
        {
            //Temps:
            List<Tile> newCurrentTiles = map.CheckIfCanMove(dir, mCurrentState, mCurrentTiles, this);

            //Verificando se podemos nos mover nessa direção:
            if (mCurrentState != STATE.FALLING && newCurrentTiles != null)
            {
                //Salvando os tiles atuais:
                mCurrentTiles.Clear();

                foreach (var tile in newCurrentTiles)
                    mCurrentTiles.Add(tile);

                //Podemos nos mover:
                UpdateDrawAndSprites(dir);

                //Tocando o som:
                //mMoveSound.Play();
            }
        }
示例#3
0
        private void UpdateDrawAndSprites(MOVE_DIRECTIONS targetDir)
        {
            //Verificando o estado atual do player:
            switch (mCurrentState)
            {
                #region STANDING
                case STATE.STANDING:
                    //Verificando a direção em que nos movemos:
                    switch (targetDir)
                    {
                        case MOVE_DIRECTIONS.NORT_WEST:
                            //Considerando o tile com menor X:
                            _sprite.DrawPosition = mCurrentTiles[0].Sprite.DrawPosition;

                            foreach (var tile in mCurrentTiles)
                            {
                                if (tile.Sprite.DrawPosition.X < _sprite.DrawPosition_X)
                                    _sprite.DrawPosition = tile.Sprite.DrawPosition;
                            }

                            //Corrigindo o Y:
                            _sprite.DrawPosition_Y -= 6;

                            //Salvando o novo estado:
                            mCurrentState = STATE.DIAGONAL_DOWN;
                            break;
                        case MOVE_DIRECTIONS.SOUTH_WEST:
                            //Considerando o tile com menor X:
                            _sprite.DrawPosition = mCurrentTiles[0].Sprite.DrawPosition;

                            foreach (var tile in mCurrentTiles)
                            {
                                if (tile.Sprite.DrawPosition.X < _sprite.DrawPosition_X)
                                    _sprite.DrawPosition = tile.Sprite.DrawPosition;
                            }

                            //Corrigindo o Y:
                            _sprite.DrawPosition_Y -= 68;

                            //Salvando o novo estado:
                            mCurrentState = STATE.DIAGONAL_UP;
                            break;
                        case MOVE_DIRECTIONS.SOUTH_EAST:
                            //Considerando o tile com menor X:
                            _sprite.DrawPosition = mCurrentTiles[0].Sprite.DrawPosition;

                            foreach (var tile in mCurrentTiles)
                            {
                                if (tile.Sprite.DrawPosition.X < _sprite.DrawPosition_X)
                                    _sprite.DrawPosition = tile.Sprite.DrawPosition;
                            }

                            //Corrigindo o Y:
                            _sprite.DrawPosition_Y -= 6;

                            //Salvando o novo estado:
                            mCurrentState = STATE.DIAGONAL_DOWN;
                            break;
                        case MOVE_DIRECTIONS.NORT_EAST:
                            //Considerando o tile com menor X:
                            _sprite.DrawPosition = mCurrentTiles[0].Sprite.DrawPosition;

                            foreach (var tile in mCurrentTiles)
                            {
                                if (tile.Sprite.DrawPosition.X < _sprite.DrawPosition_X)
                                    _sprite.DrawPosition = tile.Sprite.DrawPosition;
                            }

                            //Corrigindo o Y:
                            _sprite.DrawPosition_Y -= 68;

                            //Salvando o novo estado:
                            mCurrentState = STATE.DIAGONAL_UP;
                            break;
                    }
                    break;
                #endregion
                #region DIAGONAL_UP
                case STATE.DIAGONAL_UP:
                    //Verificando a direção em que nos movemos:
                    switch (targetDir)
                    {
                        case MOVE_DIRECTIONS.NORT_WEST:
                            //Considerando o tile com menor X:
                            _sprite.DrawPosition = mCurrentTiles[0].Sprite.DrawPosition;

                            foreach (var tile in mCurrentTiles)
                            {
                                if (tile.Sprite.DrawPosition.X < _sprite.DrawPosition_X)
                                    _sprite.DrawPosition = tile.Sprite.DrawPosition;
                            }

                            //Corrigindo o Y:
                            _sprite.DrawPosition_Y -= 68;
                            break;
                        case MOVE_DIRECTIONS.SOUTH_WEST:
                            //Considerando o tile com menor X:
                            _sprite.DrawPosition = mCurrentTiles[0].Sprite.DrawPosition;

                            foreach (var tile in mCurrentTiles)
                            {
                                if (tile.Sprite.DrawPosition.X < _sprite.DrawPosition_X)
                                    _sprite.DrawPosition = tile.Sprite.DrawPosition;
                            }

                            //Corrigindo o Y:
                            _sprite.DrawPosition_Y -= 68;

                            //Salvando o novo estado:
                            mCurrentState = STATE.STANDING;
                            break;
                        case MOVE_DIRECTIONS.SOUTH_EAST:
                            //Considerando o tile com menor X:
                            _sprite.DrawPosition = mCurrentTiles[0].Sprite.DrawPosition;

                            foreach (var tile in mCurrentTiles)
                            {
                                if (tile.Sprite.DrawPosition.X < _sprite.DrawPosition_X)
                                    _sprite.DrawPosition = tile.Sprite.DrawPosition;
                            }

                            //Corrigindo o Y:
                            _sprite.DrawPosition_Y -= 68;
                            break;
                        case MOVE_DIRECTIONS.NORT_EAST:
                            //Considerando o tile com menor X:
                            _sprite.DrawPosition = mCurrentTiles[0].Sprite.DrawPosition;

                            foreach (var tile in mCurrentTiles)
                            {
                                if (tile.Sprite.DrawPosition.X < _sprite.DrawPosition_X)
                                    _sprite.DrawPosition = tile.Sprite.DrawPosition;
                            }

                            //Corrigindo o Y:
                            _sprite.DrawPosition_Y -= 68;

                            //Salvando o novo estado:
                            mCurrentState = STATE.STANDING;
                            break;
                    }
                    break;
                #endregion
                #region DIAGONAL_DOWN
                case STATE.DIAGONAL_DOWN:
                    //Verificando a direção em que nos movemos:
                    switch (targetDir)
                    {
                        case MOVE_DIRECTIONS.NORT_WEST:
                            //Considerando o tile com menor X:
                            _sprite.DrawPosition = mCurrentTiles[0].Sprite.DrawPosition;

                            foreach (var tile in mCurrentTiles)
                            {
                                if (tile.Sprite.DrawPosition.X < _sprite.DrawPosition_X)
                                    _sprite.DrawPosition = tile.Sprite.DrawPosition;
                            }

                            //Corrigindo o Y:
                            _sprite.DrawPosition_Y -= 68;

                            //Salvando o novo estado:
                            mCurrentState = STATE.STANDING;
                            break;
                        case MOVE_DIRECTIONS.SOUTH_WEST:
                            //Considerando o tile com menor X:
                            _sprite.DrawPosition = mCurrentTiles[0].Sprite.DrawPosition;

                            foreach (var tile in mCurrentTiles)
                            {
                                if (tile.Sprite.DrawPosition.X < _sprite.DrawPosition_X)
                                    _sprite.DrawPosition = tile.Sprite.DrawPosition;
                            }

                            //Corrigindo o Y:
                            _sprite.DrawPosition_Y -= 6;
                            break;
                        case MOVE_DIRECTIONS.SOUTH_EAST:
                            //Considerando o tile com menor X:
                            _sprite.DrawPosition = mCurrentTiles[0].Sprite.DrawPosition;

                            foreach (var tile in mCurrentTiles)
                            {
                                if (tile.Sprite.DrawPosition.X < _sprite.DrawPosition_X)
                                    _sprite.DrawPosition = tile.Sprite.DrawPosition;
                            }

                            //Corrigindo o Y:
                            _sprite.DrawPosition_Y -= 68;

                            //Salvando o novo estado:
                            mCurrentState = STATE.STANDING;
                            break;
                        case MOVE_DIRECTIONS.NORT_EAST:
                            //Considerando o tile com menor X:
                            _sprite.DrawPosition = mCurrentTiles[0].Sprite.DrawPosition;

                            foreach (var tile in mCurrentTiles)
                            {
                                if (tile.Sprite.DrawPosition.X < _sprite.DrawPosition_X)
                                    _sprite.DrawPosition = tile.Sprite.DrawPosition;
                            }

                            //Corrigindo o Y:
                            _sprite.DrawPosition_Y -= 6;
                            break;
                    }
                    break;
                #endregion
            }

            //Corrigindo o Y:
            _sprite.DrawPosition_Y -= Tile.TILE_SIZE.Y;

            //Atualizando o spriteRect de acordo com o estado:
            switch (mCurrentState)
            {
                case STATE.STANDING:
                    _sprite.SpriteRect = new Rectangle(0, 64, 128, 192);
                    break;
                case STATE.DIAGONAL_UP:
                    _sprite.SpriteRect = new Rectangle(128, 64, 256, 192);
                    break;
                case STATE.DIAGONAL_DOWN:
                    _sprite.SpriteRect = new Rectangle(128, 256, 256, 192);
                    break;
            }

            //Atualizando a origem do sprite (Sempre Centralizada):
            _sprite.Origin = new Vector2(_sprite.SpriteRect.Width / 2, _sprite.SpriteRect.Height / 2);
        }
示例#4
0
        public void Fall(MOVE_DIRECTIONS lastDir)
        {
            //Decidindo a direção da rotação:
            switch (lastDir)
            {
                case MOVE_DIRECTIONS.NORT_WEST:
                    //Ligando a rotação:
                    _sprite.Rotation = -0.1f;
                    break;
                case MOVE_DIRECTIONS.SOUTH_WEST:
                    //Ligando a rotação:
                    _sprite.Rotation = -0.1f;
                    break;
                case MOVE_DIRECTIONS.SOUTH_EAST:
                    //Ligando a rotação:
                    _sprite.Rotation = 0.1f;
                    break;
                case MOVE_DIRECTIONS.NORT_EAST:
                    //Ligando a rotação:
                    _sprite.Rotation = 0.1f;
                    break;
            }

            //Setando o estado:
            mCurrentState = STATE.FALLING;

            //Atualizando a origem do sprite (Sempre Centralizada):
            _sprite.Origin = new Vector2(_sprite.SpriteRect.Width / 2, _sprite.SpriteRect.Height / 2);

            //Tocando o som:
            //mFallSound.Play();
        }