Понимание метода CGPoint

У меня возникли проблемы с пониманием некоторых математических операций в следующем руководстве:

Учебник по Sprite Kit

Я не уверен, как понять смещение. Примерно в середине руководства Рэй использует следующий код:

UITouch * touch = [touches anyObject];
CGPoint location = [touch locationInNode:self];

// 2 - Set up initial location of projectile
SKSpriteNode * projectile = [SKSpriteNode spriteNodeWithImageNamed:@"projectile"];
projectile.position = self.player.position;

// 3- Determine offset of location to projectile
CGPoint offset = rwSub(location, projectile.position);

где rwSub

static inline CGPoint rwSub(CGPoint a, CGPoint b) {
    return CGPointMake(a.x - b.x, a.y - b.y);
}

Я знаю, что этот код работает, но я его не понимаю. Я попробовал NSLogging точку касания и точку смещения, и они не образуют треугольник, как показано на рисунке:

img
(источник: raywenderlich.com)

Вот что я получил из своего вывода:

Touch Location
 X: 549.000000 Y: 154.000000
Offset
 X: 535.500000 Y: -6.000000

Это не формирует вектор в правильном направлении... но все же работает? Кто-нибудь может объяснить, как работает смещение?


person EvilAegis    schedule 24.09.2013    source источник
comment
Оригинальный учебник включает ссылку на страницу по векторной математике. Вы это читали?   -  person CodaFi    schedule 24.09.2013
comment
Да, у меня есть. Я также сделал свои собственные расчеты. Я просто не понимаю вывод относительно экрана.   -  person EvilAegis    schedule 24.09.2013


Ответы (2)


Смещение - это отличие от ниндзя, и точка, которую вы коснулись. Таким образом, касание, которое вы зарегистрировали, равно 535 очкам вправо и 6 очкам вниз (-6).

Так что он движется в правильном направлении по отношению к игроку.

Учебник также заставляет звезду ниндзя путешествовать за кадром через

 // 6 - Get the direction of where to shoot
CGPoint direction = rwNormalize(offset);

// 7 - Make it shoot far enough to be guaranteed off screen
CGPoint shootAmount = rwMult(direction, 1000);

// 8 - Add the shoot amount to the current position       
CGPoint realDest = rwAdd(shootAmount, projectile.position);

Нарисуйте несколько картинок, это поможет вам понять.

person DogCoffee    schedule 03.10.2013

Смещение в этом случае просто представляет место касания, связанное с персонажем, и позволяет вам узнать, куда будет направлен снаряд.

В учебнике в следующих строках вы можете увидеть:

// 4 - Bail out if you are shooting down or backwards
    if (offset.x <= 0) return;

В этом примере offset.x < 0 означает, что снаряд нацелен на что-то позади ниндзя по оси X, где 0 — координата X персонажа.

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

person Broco    schedule 26.09.2013