我一直在尝试制作一个时针跟随分针的模拟时钟。尝试了所有我能想到的,但比例不对。
拖动分针可以正常工作,所以我认为这是我计算时针应该旋转的比率的方式。
这是我最近尝试的许多...
代码:
#define DEGREES_TO_RADIANS(angle) ((angle) / 180.0 * M_PI)
#define RADIANS_TO_DEGREES(radians) ((radians) * (180.0 / M_PI))
CGFloat oldAngleInRadians = M_PI_2;
- (void)rotateNode:(SKSpriteNode *)node forTouch:(UITouch *)touch
{
if ([node isEqual:dial]) return;
CGPoint positionInDial = [touch locationInNode:dial];
float deltaY = positionInDial.y - minuteIndicator.anchorPoint.y;
float deltaX = positionInDial.x - minuteIndicator.anchorPoint.x;
CGFloat angleInRadians = atan2f(deltaY, deltaX);
// Minute hand rotation in this case
[node runAction:[SKAction rotateToAngle:angleInRadians - (M_PI / 2) duration:0]];
if (self.difficulty == kMediumDifficulty ) {
[self updateHourhandAngleWithNewAngle:angleInRadians oldAngle:oldAngleInRadians];
oldAngleInRadians = angleInRadians;
}
}
#pragma mark - Rotate hour hand with minute hand
- (void)updateHourhandAngleWithNewAngle:(CGFloat)newAngle oldAngle:(CGFloat)oldAngle
{
double newAngleDeg = RADIANS_TO_DEGREES(newAngle);
double oldAngleDeg = RADIANS_TO_DEGREES(oldAngle);
double differenceDeg = 0;
if (newAngleDeg > 0 && oldAngleDeg < 0) {
differenceDeg = oldAngleDeg - ( - 1 * newAngleDeg );
} else if (newAngleDeg < 0 && oldAngleDeg > 0) {
differenceDeg = fabsf(newAngleDeg) - oldAngleDeg;
} else {
differenceDeg = newAngleDeg - oldAngleDeg;
}
[hourIndicator runAction:[SKAction rotateByAngle:DEGREES_TO_RADIANS((differenceDeg / 12.0f)) duration:0]];
}