Пытаюсь плавно вращать мой спрайт с постоянной скоростью. Но это уменьшает скорость - PullRequest
0 голосов
/ 23 августа 2011

(я использую cocos2d для iphone)

Сначала я объясню вам мой код: (важные части)

 -(void)ccTouchesBegan:(NSSet *)touches withEvent:(UIEvent *)event {

    UITouch * touch = [touches anyObject];

    CGPoint location = [touch locationInView:[touch view]];
    location = [[CCDirector sharedDirector] convertToGL:location];

    float dstAngle = CC_RADIANS_TO_DEGREES(-ccpToAngle(ccpSub(location, plane.position)));

    plane.dstAngle = dstAngle;
     }
-(void)ccTouchesMoved:(NSSet *)touches withEvent:(UIEvent *)event {
    UITouch * touch = [touches anyObject];

    CGPoint location = [touch locationInView:[touch view]];
    location = [[CCDirector sharedDirector] convertToGL:location];

    float dstAngle = CC_RADIANS_TO_DEGREES(-ccpToAngle(ccpSub(location, plane.position)));

    plane.dstAngle = dstAngle; }

Если я касаюсь экрана, я вычисляю уголмежду моей плоскостью и местоположением касания.

Теперь я устанавливаю угол «назначения» плоскости.Моя "плоскость" является подклассом.

В моем заголовочном файле у меня есть следующие значения с плавающей точкой:

//this is in my plane subclass
float diffAngle_; 
float startAngle_;
float dstAngle_;
float smoothRotationSpeed_;

РЕДАКТИРОВАТЬ: В моей инициализации слоя я установил значение "smoothRotationSpeed" в значение,Метод вращательной метки запланирован.У меня есть метод галочки, чтобы вращать плоскость (также в подклассе плоскости)

-(void)rotateTick:(ccTime)dt {

    startAngle_ = [self rotation];
    if (startAngle_ > 0)
        startAngle_ = fmodf(startAngle_, 360.0f);
    else
        startAngle_ = fmodf(startAngle_, -360.0f);

    diffAngle_ =dstAngle_ - startAngle_;
    if (diffAngle_ > 180)
        diffAngle_ -= 360;
    if (diffAngle_ < -180)
        diffAngle_ += 360;

    [self setRotation: startAngle_ + diffAngle_ * dt]; //smooth rotate

}
-(void)setSmoothRotationSpeed:(float)smoothRotationSpeed {
    [self schedule:@selector(rotateTick:)]; //this will be called if the "smoothRotationSpeed" value is changed
}

Проблема теперь в том, что если я коснусь места, спрайты вращаются к нему правильно, но сначала он вращается немного быстро ичем он теряет свою скорость ..

Чем ближе он к углу назначения, тем медленнее он движется ...

Но я хочу, чтобы он двигался с постоянной скоростью.Эта «постоянная» скорость определена в значении «smoothRotationSpeed», но как я могу реализовать ее в своем коде?

Если я установлю интервал в значение «smoothRotationSpeed», оно не будет плавным.Это будет отставать.

Кто-нибудь хотел бы помочь мне, пожалуйста?

1 Ответ

2 голосов
/ 23 августа 2011

Вы увеличиваете вращение вашего спрайта на основе разницы между целевым и текущим углами, поэтому чем ближе текущий угол к целевому углу, тем меньше приращение, которое вы применяете к текущему вращению.Но из того, что вы говорите, это не то, что вы хотите.Таким образом, вы можете просто сделать что-то вроде этого:

-(void)rotateTick:(ccTime)dt {

    startAngle_ = [self rotation];
    if (startAngle_ > 0)
        startAngle_ = fmodf(startAngle_, 360.0f);
    else
        startAngle_ = fmodf(startAngle_, -360.0f);

    diffAngle_ =dstAngle_ - startAngle_;
    if (diffAngle_ > 180)
        diffAngle_ -= 360;
    if (diffAngle_ < -180)
        diffAngle_ += 360;

    if ( fabs(diffAngle_) < smoothRotationSpeed_*dt ) // finished rotation
    {
        [self setRotation: dstAngle_]; // go to the end position
    }
    else if (diffAngle_ > 0)
    {
        [self setRotation: startAngle_ + smoothRotationSpeed_* dt]; //smooth rotate
    }
    else
    {
        [self setRotation: startAngle_ - smoothRotationSpeed_* dt]; //smooth rotate
    }
}
-(void)setSmoothRotationSpeed:(float)smoothRotationSpeed
{
    smoothRotationSpeed_ = smoothRotationSpeed;
    [self schedule:@selector(rotateTick:)]; //this will be called if the "smoothRotationSpeed" value is changed
}
...