2013-10-08 3 views
7

Использование Sprite Kit Я пытаюсь установить SKPhysicsBody, перемещающийся в соответствии с заданным углом, так что, если вы хотите, чтобы спрайт перемещался вправо, вы указали бы 1.571 радиан. Чтобы превратить указанный угол в скорость, я использую метод ниже для преобразования радианов в CGVector. Версия ORIGINAL, которую я реализовал из памяти, имеет странный эффект смещения всех углов на 90 градусов. (Т.е. если 0 градусов используется спрайт перемещается вправо (так же, как это было бы, если вы указали 90 градусов)Преобразование угла радия в CGVector

. Вопрос:

Я установил это в новой версии путем замены dx и dy задания Мой вопрос почему это происходит, у меня это не так в оригинале (там, кажется, что другие делают это таким образом в Интернете) или есть какая-то причина, основанная на конкретную система координат используются.

// ORIGINAL 
- (CGVector)convertAngleToVector:(CGFloat)radians { 
    CGVector vector; 
    vector.dx = cos(radians) * 10; 
    vector.dy = sin(radians) * 10; 
    NSLog(@"DX: %0.2f DY: %0.2f", vector.dx, vector.dy); 
    return vector; 
} 


// NEW, SWAPPED DX & DY 
- (CGVector)convertAngleToVector:(CGFloat)radians { 
    CGVector vector; 
    vector.dy = cos(radians) * 10; 
    vector.dx = sin(radians) * 10; 
    NSLog(@"DX: %0.2f DY: %0.2f", vector.dx, vector.dy); 
    return vector; 
} 

ПРИМЕЧАНИЕ: также в часах Sprite Kit мутные вращения отрицательны, до сих пор convertAngleToVector делает положительные вращения по часовой стрелке (т. 1.571 радиан прав, где он должен быть оставлен) Я мог бы просто сделать cos(radians*-1) и sin(radians*-1), но может быть какая-то основная причина этого, основываясь на том, что я меняю dx и dy.

Sprite Kit (SKView Координаты):

enter image description here

ответ

2

Из Sprite Kit Programming Guide (подчеркивание добавлено):

Sprite комплект также имеет стандартное соглашение вращения. На рисунке 4-2 показано полярное согласование координат. Угол 0 радианов указывает положительную ось x. Положительный угол находится в направлении против часовой стрелки.

В этой системе координат угол нулей радианов, указывающий вправо, является правильным. Если вы хотите использовать систему, в которой нулевой угол будет направлен вверх (вдоль положительной оси y) и увеличится по часовой стрелке, вы захотите преобразовать свои углы, прежде чем преобразовывать их в векторы.

+0

А я вижу, поэтому первоначальная реализация правильная? – fuzzygoat

3

Да, SpriteKit по умолчанию справа. Образец проекта Physics Collision решает эту проблему путем реализации этого метода:

- (CGFloat)shipOrientation 
{ 
    // The ship art is oriented so that it faces the top of the scene, but Sprite Kit's rotation default is to the right. 
    // This method calculates the ship orientation for use in other calculations. 
    return self.zRotation + M_PI_2; 
} 

Вы можете просто получить существующую ориентацию, называя что-то вроде:

CGFloat shipDirection = [self shipOrientation]; 

, а затем настроить zRotation свойство там.

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

  • Нет связанных вопросов^_^