iPhone에서 화면 컨트롤을 사용하여 UIImageView를 이동하는 가장 좋은 방법은 무엇입니까?

StackOverflow https://stackoverflow.com/questions/1012606

문제

저는 이 게임의 iPhone 버전을 개발 중입니다. http://www.students.uni-mainz.de/rathb000/Fillit/Game.html

나는 배의 위치를 ​​1픽셀씩 변경하기 위해 NSTimer를 사용하고 있으며 타이머의 시간 간격은 0.002입니다.

그러나 시간 간격을 더 줄이면 배가 더 빨리 움직이지 않는다는 것을 알았습니다.실제로 0.05와 0.002 사이에는 차이가 없습니다.NSTimeInterval로 제공해야 하는 최소 시간에 제한이 있나요?

배는 현재 게임이 흥미로워지기에는 너무 느리게 움직입니다.

또한 배를 움직이기 위해 아무 버튼이나 누르면 새의 움직임(NSTimer에서도 달성됨)이 느려집니다.

이 문제를 어떻게 해결할 수 있는지 아시나요?

도움이 되었습니까?

해결책 6

이것을 알아 냈습니다.

배를 움직이기 위해 Core Animation을 사용해야 했고 NSTimer로 새들을 움직이게 만들었습니다.이 방법은 잘 작동하지만 특정 한도까지만 가능합니다.배의 속도가 특정 한도 이상으로 증가하면 새의 속도가 다시 느려집니다.

다른 팁

NSTimer는 실시간 메커니즘이 아닙니다.이는 실행 루프의 일부로 실행되며 부드럽고 유동적인 애니메이션을 만드는 데 이상적이지 않습니다.그러나 Core Animation이라는 iPhone OS의 일부인 SDK가 있습니다. SDK는 레이어와 뷰의 원활한 애니메이션을 수행하기 위한 기능 라이브러리를 제공합니다. 다음은 상당히 좋은 비디오 튜토리얼 시리즈입니다. 당신이 유용하다고 생각할 수도 있습니다.이라는 훌륭한 책도 있습니다. Mac OS X 및 iPhone용 핵심 애니메이션 당신이 유용하다고 생각할 수도 있습니다.

또한 Apple의 핵심 애니메이션 문서 CABasicAnimation 클래스를 사용하여 레이어나 뷰의 속성에 애니메이션을 적용하는 방법을 설명합니다.다음은 문서에 있는 명시적 레이어 애니메이션의 예입니다.

CABasicAnimation *theAnimation; 

theAnimation=[CABasicAnimation animationWithKeyPath:@"opacity"];
theAnimation.duration=3.0;
theAnimation.repeatCount=1;
theAnimation.autoreverses=NO;
theAnimation.fromValue=CATransform3DTranslate(0,0,0);
theAnimation.toValue=CATransform3DTranslate(20,20,0);

[theLayer addAnimation:theAnimation forKey:@"animateTransform"];

에서 NSTimer 문서:

타이머는 실시간 메커니즘이 아닙니다.타이머가 추가된 런 루프 모드 중 하나가 실행 중일 때만 실행되며 타이머의 실행 시간이 지났는지 확인할 수 있습니다.일반적인 실행 루프가 관리하는 다양한 입력 소스로 인해 타이머 시간 간격의 유효 분해능은 50~100밀리초 정도로 제한됩니다.런 루프가 타이머를 모니터링하지 않는 모드에 있거나 긴 호출 중에 타이머의 실행 시간이 발생하면 다음 번 런 루프가 타이머를 확인할 때까지 타이머가 실행되지 않습니다.따라서 타이머가 잠재적으로 실행되는 실제 시간은 예정된 실행 시간 이후 상당한 시간이 될 수 있습니다.

어쩌면 당신은 이동을 시도할 수 있습니다 UIView 사용하여 UIView 타이머 대신 애니메이션.

거리 크기를 늘리는 것을 고려할 수 있습니다.배를 .002초마다 1픽셀씩 이동하는 것이 아니라 .05초마다 3~4픽셀씩 이동합니다.

제 생각에는 플레이어의 함선에만 시간 단계를 적용하는 것이 아니라 게임의 모든 엔터티에서 전역적으로 동일한 시간 단계를 사용해야 합니다.우주선이 시간 단계에 따라 너무 느리게 이동하는 경우 프레임당 이동 거리를 늘리십시오.

실제로 플레이어의 함선을 픽셀/초 단위로 움직이는 것을 생각해야 합니다.NSTimer 이벤트가 발생하면 마지막 업데이트 이후 경과된 시간을 가져옵니다.이 경과 시간을 사용하여 게임 엔터티를 이동합니다.예를 들어 업데이트 시간 간격이 0.05초이고 플레이어의 선박을 초당 100픽셀로 이동하려는 경우 이 업데이트에서는 100 * 0.05 = 5픽셀을 이동해야 합니다.이 방법은 다양한 크기의 시간 단계를 설명하며 타이머 메커니즘이 일관성이 없더라도 게임 엔터티는 항상 일정한 속도로 움직이는 것처럼 보입니다.

NSTimer는 이러한 유형의 애니메이션에 적합한 도구가 아닐 뿐만 아니라 디자인도 잘못되었습니다.

간격이 0002인 타이머는 초당 500회 실행됩니다.이 게임을 애니메이션화하는 미친 방법입니다.

2D 게임 디자인을 읽고 충돌 감지를 수행하는 더 나은 방법을 찾아볼 것을 제안합니다. 익명의 제안처럼 실제 픽셀에 의존하기보다는 배 주위에 충돌 직사각형을 두어야 한다고 제안합니다.

당신은 또한 확인해야합니다 아이폰용 Cocos-2D

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top