public virtual void Move(ActionPlayer action) { if (_movedPlayer != null) { _movedPlayer(); } bool okDirect = false; Coordinate prePosition = new Coordinate(Position.PosX, Position.PosY); // position before move, previous position, it was create for delete coordinate tank after his move switch (action) { case ActionPlayer.PressRight: if (DirectionTank.HasFlag(Direction.Right)) { okDirect = true; } else { DirectionTank = Direction.Right; } break; case ActionPlayer.PressLeft: if (DirectionTank.HasFlag(Direction.Left)) { okDirect = true; } else { DirectionTank = Direction.Left; } break; case ActionPlayer.PressUp: if (DirectionTank.HasFlag(Direction.Up)) { okDirect = true; } else { DirectionTank = Direction.Up; } break; case ActionPlayer.PressDown: if (DirectionTank.HasFlag(Direction.Down)) { okDirect = true; } else { DirectionTank = Direction.Down; } break; case ActionPlayer.NoAction: break; default: throw new ActionNotFoundException (string.Format("\n{0} Method: Move, Class: Tank, parametrs Action: {1} - not found!!!", DateTime.Now, action)); } if (okDirect && IsPermitMove()) { Position.Move(DirectionTank, Characteristic.MS); // move tank DeletePrePosition(prePosition); // delete 1 row or 1 column in owner game field AddNewPostion(this); // add 1 row or 1 column in owner game field } }
public bool IsPermitMove() { bool permitOk = true; Coordinate permitCoordinate = new Coordinate(Position.PosX, Position.PosY); //start posX, posY for tank is upper left corner // new coordinate with direction same tank move new coordinate on step equal movespeed(MS) tank switch (DirectionTank) { case Direction.Right: permitCoordinate.PosX = Position.PosX; permitCoordinate.PosY = Position.PosY + ConstantValue.WIDTH_TANK; break; case Direction.Left: permitCoordinate.PosX = Position.PosX; permitCoordinate.PosY = Position.PosY - 1; break; case Direction.Up: permitCoordinate.PosX = Position.PosX - 1; permitCoordinate.PosY = Position.PosY; break; case Direction.Down: permitCoordinate.PosX = Position.PosX + ConstantValue.HEIGHT_TANK; permitCoordinate.PosY = Position.PosY; break; } if (!permitCoordinate.IsPermitMoveCoordinate(DirectionTank)) { return(false); } Coordinate tempForMove = new Coordinate(permitCoordinate); if (DirectionTank.HasFlag(Direction.Right) || DirectionTank.HasFlag(Direction.Left)) { for (int permitRow = permitCoordinate.PosX; permitRow < ConstantValue.HEIGHT_TANK + permitCoordinate.PosX; permitRow++) { tempForMove.PosX = permitRow; if (_owner.IsContain(tempForMove)) { if (!(_owner[tempForMove] is GrassBlock)) { permitOk = false; break; } } } } else { for (int permitCol = permitCoordinate.PosY; permitCol < ConstantValue.WIDTH_TANK + permitCoordinate.PosY; permitCol++) { tempForMove.PosY = permitCol; if (_owner.IsContain(tempForMove)) { if (!(_owner[tempForMove] is GrassBlock)) { permitOk = false; break; } } } } return(permitOk); }