2011-08-23 3 views
0

(iphone 용 cocos2d 사용)스프라이트를 일정한 속도로 부드럽게 회전하려고합니다. 그러나 그것은 속도를 줄입니다.

먼저 중요한 코드를 설명해 드리겠습니다. (중요한 부분)

 -(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; } 

화면을 터치하면 평면과 터치 사이의 각도를 계산합니다 위치.

이제 평면의 "대상"각도를 설정합니다. "평면"은 하위 클래스입니다.

내 헤더 파일에서 나는 다음과 같은 float 값을가집니다.

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

편집 : 레이어의 초기화에서 "smoothRotationSpeed"값을 설정합니다. "rotationTick"메서드가 예약되었습니다. 비행기를 회전하는 진드기 방법이 있습니다 (또한 평면 하위 클래스에서)

이제는 스프라이트가 올바르게 회전하는 위치를 터치하면 문제가 발생하지만 처음에는 조금 더 빠르게 회전합니다. 속도가 느려집니다.

목적지 각도가 가까울수록 속도가 느려집니다.

그러나 일정한 속도로 움직이기를 원합니다. 이 "상수"속도는 "smoothRotationSpeed"값에 정의되어 있지만 코드에서 어떻게 구현할 수 있습니까?

간격을 "smoothRotationSpeed"값으로 설정하면 부드럽 지 않습니다. 그것은 지체 할 것이다.

누구든지 나를 도와주고 싶습니까?

답변

2

목표 각도와 현재 각도의 차이에 따라 스프라이트의 회전을 증분하므로 현재 각도가 목표 각도에 가까울수록 현재 회전에 적용되는 증가량이 작아집니다. 그러나 당신이 말하는 것에서 그것은 당신이 원하는 것이 아닙니다. 따라서 다음과 같이 간단하게 할 수 있습니다.

-(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 
} 
+0

감사합니다 ... :) – cocos2dbeginner

+0

감사합니다. 좋은 작품 감사합니다. –

관련 문제