답변:
이 효과의 저자로부터 구현 설명을 찾았습니다.
2D 평면에서 깊이 환영을 만들기 위해서는 많은 작업이 필요했습니다.
원칙은 매우 쉽습니다. 원은 화면 중간에서 배율 0으로 시작합니다. 그런 다음 터널의 첫 번째 원은 경과 시간에 비례하여 비율 조정을 시작하고 (선형 비율 조정이 작동하지 않음) 얼마 후 두 번째 원의 비율 조정이 시작됩니다 , 3, 4 등이 있습니다.
그런 다음 원의 알파 값을 비례 적으로 낮추고 (맨 뒤의 알파 값은 흐림 효과를주기 위해 알파 값을 앞의 값보다 낮습니다) 모든 원이 따라야하는 경로를 정의하여 X와 Y를 이동합니다 좌표를 조정 한 다음 화면 중앙에 우주선을 배치합니다. 장치를 기울이면 터널이 좌우로 상하로 움직입니다 (그러나 우주선이 대신 움직인다는 인상을줍니다!).
원이 화면 밖으로 나간 후에는 빠르게 사라지고 메모리를 절약하기 위해 초기 위치로 돌아갑니다 (새로운 원을 만들 필요는 없지만 동일한 원을 재사용합니다).
내 영어에 대해 죄송하지만 일반적인 아이디어를 설명하기를 바랍니다. :)
Z 값과 스케일이 감소하는 여러 링 스프라이트가 거의 있습니다. 그들 모두를 중앙에 두지 마십시오.
터널이 멀리있는 사건의 지평선을 치는 지점을 추적해야합니다. 당신은 그러나 당신이 원하는 시간이 지남에 따라 그 지점을 이동할 수 있습니다.
당신은 각각의 새로운 스프라이트를 배치 그런 다음, 그 시점에서 장소가, 당신이 좋아, 다음을 시작하는 방법 그것의 불투명도를 설정, 작은 그것을 확장 CCSpawn
으로 CCScaleTo
하고 CCFadeTo
, 예를 들어 :
sprite->runAction(CCSpawn::create(
CCScaleTo::create(2.0f, 1.5f),
CCFadeTo::create(5.0f, 255),
nullptr));
모든 스프라이트를 미리 만들고 효율적으로 유지하기 위해 뒤에있는 스프라이트를 회전시킵니다.
솔직히 말하면 2D 카메라를 사용하여 이미지를 렌더링한다고 생각하지 않습니다. 게임이 3D 렌더링 시스템을 사용하여 렌더링 된 것 같습니다. 그러나 cocos2d를 사용하려면 3D 변환 행렬을 직접 시뮬레이션해야합니다. 3D 장면에서 모든 객체는 3 개의 스칼라 값 x, y 및 z로 정의됩니다. 사용할 수있는 가장 간단한 방법은 제안한대로 확장하는 것이지만 구현 한 것은 아닙니다! ccScaleTo
시간이 지남에 따라 선형 스케일링이 발생하여 3D 느낌을 생성하지 않습니다. 의 값으로 스케일링 객체를 시작할 수 있습니다 1/z
. 이것은 당신이 생각할 수있는 가장 간단한 영사 행렬과 동일합니다! 그래도 만족스럽지 않다면 더 현대적이고 복잡한 투영 행렬을 살펴보십시오 .
참고 사항 : cocos2D에서 커스텀 프로젝션 매트릭스를 구현하는 것은 약간 더럽습니다. 효과가 마음에 들지 않으면 엔진을 3D 지원 엔진으로 변경하는 것이 좋습니다.
의사 코드에서 내가 한 방법은 다음과 같습니다.
터널 효과 활성화 :
createCircle ()
제어 (시차)
위치는 소실점이므로 소실점을 이동하지 않고 레이어를 이동할 수 없습니다. 그러나 기준점을 이동하면 레이어가 이동하는 것처럼 보이지만 소실점은 동일하게 유지됩니다. 가까운 레이어 (대규모)에서 ccp (0.2,0.2)를 이동하면 효과가 더 크기 때문에 시차 효과가 발생합니다. 멀리 떨어진 레이어에서 동일하게 이동합니다.
앵커 위치를 변경하면 모든 레이어에서 동일한 움직임이 발생하도록 모든 크기를 동일한 크기의 레이어로 묶습니다.