Как CGPoint Variable работает за кулисами? - PullRequest
0 голосов
/ 09 января 2012

Я не уверен, как созданная переменная CGPoint знает, как обрабатывать конкретный оператор if.

Например, у меня есть CGPoint myVelocity;, тогда у меня есть произвольное число float maximumVelocity = 100; Затем я выполняю следующий код

if (myVelocity.x > maximumVelocity) {
     myVelocity.x = maximumVelocity;
    }
   else if (myVelocity.x < -maximumVelocity) 
    {
      myVelocity.x = -maximumVelocity;
    }

Из того, что я понимаю, если первое условие выполнено, то есть myVelocity.x > maximumVelocity, тогда переменная CGPoint установлена ​​на максимум, то есть число 100. Это так, что моя переменная никогда не превышает произвольное число. А другое условие настроено так, чтобы оно не переходило в отрицательное.

По крайней мере, я так думаю. Теперь вот важная часть этого поста. Я запутался в том, как переменная myVelocity знает, что это за произвольное число. Например, это 10? 25 в следующую секунду или когда он достигнет 100.

Я также должен отметить, что перед выполнением оператора if в myVelocity

хранится следующий код

Ниже приведен код, который сохраняется в myVelocity перед выполнением оператора if.

float deceleration = 0.4f;
float sensitivity = 6.0f;
float maximumVelocity = 100;

myVelocity.x = myVelocity.x *deceleration   + acceleration.x *sensitivity;

Я недавно спрашивал о коде смилара для последней части моего вопроса, но теперь мне интересно узнать о первой.

Ответы [ 2 ]

3 голосов
/ 09 января 2012

CGPoint - это просто структура с компонентами "x" и "y".Вы можете думать об этом как о более простом способе обойти пару чисел.

Таким образом, ваш код выше будет эквивалентен:

float x;
// other stuff
if (x > maximumVelocity) {
 x = maximumVelocity;
}
else if (x < -maximumVelocity) 
{
  x = -maximumVelocity;
}

Теперь соедините это с другой переменной, используяstruct:

struct CGPoint {
    float x;
    float y;
};

и для доступа к этой переменной «x», для установки или чтения из нее, используйте «.x», как вы делали в своем примере кода.

(PSCGPoints на самом деле являются парой CGFloats по причинам, которые не имеют отношения к этому сообщению)

2 голосов
/ 09 января 2012

GCPoint представляет двумерное пространство, в идеале хранение скорости в CGPoint означает, что вам нужен вектор скорости, представленный двумя измерениями, x и y.

В вашем случае я вижу, что вы используете только 1 измерение, я не совсем понял, чего вы пытаетесь достичь, но в вашем случае вы можете просто использовать поплавок для хранения значения скорости, если у него нет направления.

Если вам нужна двумерная скорость, вы должны проверить максимальную скорость, проверив длину вектора. В вашем примере вы проверяете только размер x, но если скорость равна x = 50, y = 20000, она довольно быстро движется по оси y.

ccpLength(<#const CGPoint v#> позволяет вам проверять длину CGPoint, чтобы вы могли сравнить ее с плавающей точкой, чтобы увидеть, является ли фактическая скорость быстрее, чем ваша максимальная. В этом случае вам нужно нормализовать вектор, чтобы он действительно соответствовал вашей максимальной скорости. может сделать это с

ccpMult(v, maximumVelocity/ccpLength(v))
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...