2012-05-25 1 views
4

참고 : 저는 영어가 모국어가 아닙니다. 문법 실수는 용서해주십시오.Cocos2D Game Loop Clarifications

저는 왼쪽에 저격수가 있고 오른쪽에서 적을 공격하는 간단한 게임을 개발했습니다. 아주 간단합니다.

프로젝트가 거의 끝났습니다. 완벽하게 작동하지만 이제는 게임 루프 관리에 대한 의문이 생깁니다.

스케쥴러에게 오른쪽에서 나타나는 적을 일정 간격으로 일정을 잡았으므로 괜찮습니다. 하지만 단순한 ccMoveTo 동작으로 오른쪽에서 왼쪽으로 적의 움직임을 관리하고 반복합니다. 완벽하게 작동합니다. 문제는

더 나은 ... 내가 한 번 프레임 당 를 실행 예약 방법으로이 작업을 위임 "모든 프레임에서 스프라이트를 렌더링"에 대해 뭔가를 읽을 수 있다는 것입니다 : 내가 스프라이트를 이동 액션을 사용하지하려고 읽기 , 그러나 프레임 레이트별로 1/60 주파수 (fps 주파수)라고 불리는 스케쥴 된 방법으로 움직임을 시뮬레이션 한 프레임마다 다시 렌더링합니다.이 구현은 다른 하드웨어 시스템의 안정성 차이를 막을 수 있다고 읽었습니다.

내가 묻는 것은 :

  • 그게 올바른 방법입니다 proc eed?
  • 은 Cocos2D에서 더 이상 사용되지 않는 오래된 "디자인 패턴"입니까? (그리고 이것은 ccMoveTo 액션을 사용하는 것이 완전히 완벽 함을 의미합니다)
  • 또는 둘 다 동일한 레벨에서 올바른 구현입니까?

EDIT : -THE 같은 기술도 애니메이션 사용해야

?

답변

5

우선 완벽하게 작동하고 게임이 거의 완료되면 게임을 변경하지 마십시오. 이제 게임 플레이에 미묘한 변화를 일으킬 위험이 있습니다. 게임을 끝내는 데 시간이 오래 걸리며 결국에는 플레이어가 차이를 느끼지 못할 것입니다. 다음에 다른 접근 방식을 시도해 볼 수는 있지만 현재 게임이 정상적으로 작동하는 한 그대로 두십시오.

당신이 읽은 것은 내가 말하는 것입니다 : CCMoveTo/CCMoveBy를 게임 플레이 개체의 (복잡한) 동작에 사용하지 마십시오. CCMove 동작은 동작이 매우 간단하거나 A에서 B까지 한 번 실행하면 괜찮습니다. 그러나 위치를 업데이트하는 업데이트 루프도 구현하기가 간단합니다.

CCMove 동작의 문제는 방향 및/또는 속도를 변경하려는 경우의 동작입니다. 이 경우 새로운 이동 작업을 만들어야합니다. 이 작업을 자주 수행하는 경우, 필요한 것보다 많은 alloc/dealloc 사이클을 게임에 추가하게됩니다. 두 번째로, CCMove 동작은 아무런 영향을 미치기 전에 한 프레임의 비활성을 취합니다. 즉, 매 프레임마다 새로운 CCMove 액션을 생성하면 해당 게임 객체가 실제로 움직이지 않고 움직이지 않을 것입니다. 덜 자주 변경하면 개체가 속도 나 방향을 바꿀 때마다 잠시 멈추는 것을 느낄 수 있습니다. 어느 쪽도 바람직하지 않다.

대안은 소리를내는 것처럼 복잡하지 않습니다.예, 그래서 같이 움직이는 게임 오브젝트에 업데이트를 예약해야합니다

[self scheduleUpdate]; 

는 그런 다음 노드의 위치를 ​​업데이트 update 메소드를 구현합니다

-(void) update:(ccTime)delta 
{ 
    self.position = CGPointMake(self.position.x + 1, self.position.y); 
} 

보다 유연 운동은 일반적으로 속도를 사용

-(void) update:(ccTime)delta 
{ 
    self.position = ccpAdd(self.position, self.velocity); 
} 

지금 당신은 더 많은 멋쟁이 당신이 속도를 추가하는 방법으로 얻을 수 있습니다 : 속도와 운동의 방향을 결정 벡터 (CGPoint, 일반적으로 인스턴스 변수) 위치 및 속도 자체를 업데이트하는 방법에 대해 설명합니다. 예를 들어 속도를 제한하여 객체가 초당 픽셀 수보다 빠르게 움직이지 않도록 할 수 있습니다. 모든 프레임에서 velocity.y를 줄임으로써 시뮬레이션 된 중력을 추가 할 수도 있습니다. 그리고 훨씬 더. 기본 원칙은 동일하게 유지됩니다.

유일하게 진정한 다른 대안은 업데이트 사이의 델타 시간을 고려하는 것입니다. 이렇게하면 프레임 속도에 관계없이 노드가 시간 경과에 따라 같은 거리를 이동합니다. 프레임 속도가 60 ~ 20fps로 떨어지면 노드는 여전히 같은 거리를 이동하지만 손실 된 시간을 보완하기 위해 프레임 당 더 많은 픽셀을 이동합니다. 델타 시간을 고려하지 않고 노드는 프레임 속도가 떨어짐에 따라 단순히 느려질 것입니다.

-(void) update:(ccTime)delta 
{ 
    self.position = ccpAdd(self.position, ccpMult(self.velocity, delta)); 
} 

그러나, 대부분의 게임 시간 델타를 사용하지 않아야합니다 : 델타 시간을 통합

간단한 곱셈이다. 예를 들어 전자 메일이나 SMS를 수신하는 경우와 같이 장치가 10 분의 1 초 이상 바쁜 경우 게임 시뮬레이션에서 엄청난 차이를 보일 수 있다는 예측할 수없는 결과가 발생할 수 있습니다.

대부분의 게임은 오히려 속도를 늦춰서 "잃어버린"시간을 보완해야합니다. 문제는 그 시간 동안 플레이어는 더 빨리 (반대로) 반응 할 수 없으므로 게임 세계 시뮬레이션을 정상보다 빠르게 진행하는 것이 플레이어에게 불공평하며 팔다리 또는 삶의 조기 손실을 초래할 수 있다는 것입니다.

+0

위대한 설명. 그래서 대신에 게임 세계의 속도가 fps로 결정되도록 제안해야합니다. 따라서 저 성능 장치에서 우주선은 고성능 장치보다 느리게 비행합니까? 델타를 무시하면 어떻게 될까? 맞지? – openfrog

+0

그래, 그게 무슨 일이야, 자세한 내용과 근거는 여기에 : http://www.learn-cocos2d.com/2013/10/game-engine-multiply-delta-time-or-not/ – LearnCocos2D