1

나는 스윙 미터를 만들려고합니다. 골프 게임에서 사용되는 것과 비슷합니다. 사용자가 스윙을 시작하는 버튼을 누르고, 힘을 결정하기 위해 꼭지점에서 벗어납니다. , 그 시점에서 '스윙'이 방향을 바꾼다. 그리고 사용자는 정확도를 설정하기 위해 다시 길을 가린다.코어 애니메이션을 사용하여 iPhone에서 스윙 미터 만들기

막대가 가득 차는 대신 왼쪽에서 오른쪽으로 흔들리는 진자를 사용하고 싶습니다. 진자는 처음으로 두드려진 부분 (힘)과 두 번째로 클릭 한 부분 (정확함)을 남깁니다.

내 첫 번째 문제는 진자를 돌리는 것입니다. 있는 UIImageView에게 접근하는 가장 좋은 방법은 회전, here, herehere하지만 난 약간의 추가 조언 : 모든

첫째을 얻을 수있을 기대했다 - 나는있는 UIImageView 회전에 대해이 글을 읽어 봤는데 이? 진자가 올바른 지점의 좌표와 그 좌표를 비교함으로써 진자가 얼마나 가까운 거리에 있는지를 생각하고있었습니다. 그러나 이것이 작동하려면 UIImageView가 물리적으로 움직여야 만 할 것인가? 또한 UIImageView를 중심점이 아닌 특정 지점을 중심으로 회전시키는 방법은 무엇입니까? 아니면 진자의 테두리 상자를 더 크게 만들어 중심점이 정확한 위치에 있어야합니다. 그리고 어떻게 사용자가 버튼을 친다 (또는 놓을 때) '스탬프'를 남길 수 있습니까? 이 접근하는 가장 좋은 방법에 대한

모든 일반 도움말 매우 아마도 내 질문이 조금 애매하고 일반화입니다 :) 평가 될 것입니다,하지만 난 누군가가 도전 :

감사를 좋아할 것 바라고 있어요!

마이클

UPDATE :

좋아 내가했습니다 시도 다음과 같은 두 가지 방법은, 둘 다 지금 작동합니다.

- (void)viewDidLoad { 
     pendulum.image = [UIImage imageNamed:@"winkOpen.png"]; 
     [self swingPendulum]; 
    } 

    - (void)swingPendulum { 
    CABasicAnimation *rotationAnimation; 
    rotationAnimation = [CABasicAnimation animationWithKeyPath:@"transform.rotation.z"]; 
    rotationAnimation.toValue = [NSNumber numberWithFloat:degreesToRadian(180)]; 
    rotationAnimation.duration = 0.75; 
    rotationAnimation.repeatCount = 1.0; 
    rotationAnimation.timingFunction = [CAMediaTimingFunction functionWithName:kCAMediaTimingFunctionEaseIn]; 

    [pendulum.layer addAnimation:rotationAnimation forKey:@"rotationAnimation"]; 
} 


    /* 
    - (void)swingPendulum { 
     [UIView setAnimationBeginsFromCurrentState:YES]; 
     [UIView beginAnimations:nil context:nil]; 
     [UIView setAnimationDuration:1]; 
     pendulum.transform = CGAffineTransformMakeRotation(degreesToRadian(180)); 
     [UIView setAnimationDelegate:self]; 
     [UIView commitAnimations]; 
    } 
    */ 

는 지금은 더 나은 어떤 방법 모르겠어요,하지만 첫 번째로, 오히려 아래에 0보다 도로 위의 진자 그네, 그래서 나는 그와 함께 갈거야.

이제 진자가 멈추는 위치를 결정하고 스윙을 뒤집을 필요가 있습니다 ...하지만 어쩌면 제가 조금 어수선 해지고 있기 때문에 별개의 질문으로 게시 할 것입니다! 내 질문이 미래에 더 구체적인지 확인해 보겠습니다.

+0

"Swingometer"라고 생각했는데 재미있을 것 같습니다. 그런 다음 질문을 읽고 그것이 골프에 관한 것이 었습니다. 한숨. 쇠약에 대해 이야기하십시오. – TechZen

+0

글쎄, 실제로 골프 게임에 사용하지는 않겠지 만, 그게 문제를 가장 정확하게 설명하는 예제라고 생각했습니다.흥미 롭습니다. :) – Smikey

+1

"Undefined symbols"오류는 QuartzCore 프레임 워크 (Core Animation 클래스 및 데이터 유형 포함)를 연결하지 않아서 발생합니다. 또한 실용적인 문제로, 사용자가 스윙하면서 디스플레이를 실제로 어떻게 보게 될까요? –

답변

1

애니메이션의 경우 변형을 살펴볼 수 있습니다. Quartz 2D programming guide:Transforms.

보기의 실제 픽셀 위치를 계산에 사용하지 않아야합니다. 그렇게 할 경우 화면 크기 및/또는 해상도 변경시 전체 다시 쓰기가 필요합니다. 대신 모션 및 위치의 추상 데이터 모델을 작성하고 추상 모델 내에서 계산을 수행하십시오. 그런 다음 추상 좌표를 현재 디스플레이의 좌표로 변환합니다.

원하는 위치에 이미지 뷰를 가져 오는 것은 처음 위치에 있어야하는 위치를 계산하는 것과 비교하면 비교적 간단합니다. 모션을 바로 잡아야합니다. 기억하십시오. "그 스윙이 없다면 그건 의미가 없습니다!"

+0

답변 해 주셔서 감사합니다! 그 이후 나는 진자가 멈추는 정확한 지점으로부터 얼마나 멀리 정확하게 계산할 필요가 없다고 결정했습니다. 단순히 너무 강하거나 너무 약하거나 올바르다면 간단합니다. 나는 아마 사용자가 버튼을 때 각도 때 그것을 수행 하여이 작업을 수행 할 수 있습니다. 나는. <170도 = 너무 약함,> 170 및 <190 = 바로 맞음>> 190 = 너무 강함. 하지만 어딘가에서 현재 이미지의 변형 각도를 추출해야합니다 ... 또한 진자 스윙을 만드는 데 문제가 있습니다. 지금 사용하고있는 코드를 게시하여 도움을 주시면 도움이됩니다. – Smikey

+1

변환은 중요한 주제입니다. 그것들을 배우는 진정한 속임수는 당신이 기대 한 것처럼 누적되지 않는다는 것입니다. 당신은 45 도의 회전 변환을 가지며 그것을 두 번 호출합니다. 변형 된 객체가 90도 회전 할 것이라고 예상 할 수 있습니다. 그렇지 않습니다. 변환은 항상 원래의 오브젝트 위치로 시작하기 때문에 몇 번이나 호출해도 45도 회전합니다. 변환을 누적 시키려면 기존 변환을 변환해야합니다. 그래서 45도 변환을 설정 한 다음 첫 번째 변환에서 또 다른 45도 변환을 호출합니다. – TechZen

+0

제가 볼 수 있듯이, 진자가 한 방향으로 흔들 리도록 만들었지 만, 말하듯이 2 차 변형을 적용하여 스윙을 다시 적용하면 변형이 현재 위치가 아니라 원래 위치에 적용되므로 진자는 원래 위치에서 반대로 흔들립니다. 그래서 당신이 말한 것에서, 역 변형을 적용하기 전에 현재의 변환을 진자 자체에 적용해야합니다. 현재 애니메이션에서 현재 변환 각도를 추출하는 방법을 알고 있습니까? 나는 그것이 의미가 있기를 바랍니다 : ... 그리고 도움을 주셔서 감사합니다! – Smikey