2015-10-31 4 views
1

У меня есть этот метод, который обнаруживает столкновение между мячом и левым веслом в классической игре «Понг». Я сделал переменные для разных частей шара и весла, чтобы облегчить понимание метода обнаружения столкновений. Вот метод (и он работает).Установить свойства объекта относительно другого свойства того же объекта

public bool DetectBallPaddle1Collision() { 

      var ballBottom = _ball.Y + Ball.Width; 
      var ballTop = _ball.Y; 
      var ballLeft = _ball.X; 
      var ballRight = _ball.X + Ball.Width; 
      var paddle1Bottom = _paddle1.Y + Paddle.Height; 
      var paddle1Top = _paddle1.Y; 
      var paddle1Left = PlayerPaddle.X; 
      var paddle1Right = PlayerPaddle.X + Paddle.Width; 

      if (ballTop < paddle1Bottom && 
       ballBottom > paddle1Top && 
       ballLeft < paddle1Right) { 
       return true; 
      } else { 
       return false; 
      } 
     } 

Теперь я хотел бы, чтобы реорганизовать это, чтобы иметь переменные для различных частей шара, в классе мяч, например, так:

namespace Pong.Core.Models 
{ 
    public abstract class Ball : IBall 
    { 
     public int Y { get; set; } 
     public int X { get; set; } 
     public int VX { get; set; } 
     public int VY { get; set; } 
     public static int Width; 
     public static int Speed; 
     public int Bottom { get; set; } 
     public int Top { get; set; } 
     public int Left { get; set; } 
     public int Right { get; set; } 

     public Ball() { 
      this.setDirection ("left"); 
      Bottom = Y + Ball.Width; 
      Top = Y; 
      Left = X; 
      Right = X + Ball.Width; 
     } 

Что позволяет мне изменить мяч/paddle1 метод обнаружения столкновения с этим:

public bool DetectBallPaddle1Collision() { 

      var paddle1Bottom = _paddle1.Y + Paddle.Height; 
      var paddle1Top = _paddle1.Y; 
      var paddle1Left = PlayerPaddle.X; 
      var paddle1Right = PlayerPaddle.X + Paddle.Width; 

      if (_ball.Top < paddle1Bottom && 
       _ball.Bottom > paddle1Top && 
       _ball.Left < paddle1Right) { 
       return true; 
      } else { 
       return false; 
      } 
     } 

Теоретически это должно работать, но это не так, мяч теперь проходит через лопасти. Это должно работать, потому что свойство является методом и должно обновляться, если оно относится к другому свойству, правильно? Вот почему я сделал ball.Bottom, .Top, .Left и .Right, свойства с геттерами и сеттерами, а не поля, которые не будут обновляться.

ответ

1

Когда вы указываете свойства с помощью {get; задавать; } что происходит, компилятор создает частное поле и сохраняет значение свойства в нем.

Установка значения свойства Top в Y в конструкторе поместит это начальное значение Y в это частное поле, и это значение никогда не будет обновляться по мере изменения Y.

Вместо реализовать свои свойства, как это:

(Это будет работать при условии, что X и Y обновляется во время игры)

public class Ball : IBall 
{ 
    public int Y { get; set; } 
    public int X { get; set; } 
    public int VX { get; set; } 
    public int VY { get; set; } 
    public static int Width; 
    public static int Speed; 

    public int Top 
    { 
     get 
     { 
      return Y; 
     } 
    } 

    public int Left 
    { 
     get 
     { 
      return X; 
     } 
    } 

    public int Right 
    { 
     get 
     { 
      return X + Ball.Width; 
     } 
    } 

    public int Bottom 
    { 
     get 
     { 
      return Y + Ball.Width; 
     } 
    } 
} 
0

Таким образом, у вас есть независимые свойства и зависимые свойства.

Независимые свойства - это те, что их значения не вычислены, и они представляют degrees of freedom в системе.

Зависимые свойства, с другой стороны, являются свойствами, значение которых рассчитывается из других независимых (и зависимых) свойств.

Предполагаю, что X, Y и Width и независимые объекты. И что Bottom, Top, Left и Right являются зависимыми свойствами.

Вот пример того, как вы определили бы Top:

я буду считать, что X и Y представить центр шара.

public int Top 
{ 
    get 
    { 
     return Y - (Height/2); 
    } 
    set 
    { 
     Y = value + (Height/2); 
    } 
} 

Таким образом, когда потребитель просит стоимости Top имущества, вычислим его от Y и Height. И когда потребитель устанавливает значение этого свойства, мы соответствующим образом меняем свойство Y.

Обратите внимание: я предполагаю, что точка (0,0) находится в верхнем левом углу экрана. Уравнения должны измениться, если это не так.

Смежные вопросы