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; }
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(); } }
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); }
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(); }