2013-04-20 6 views
0

나는 점프 시스템을 만드는 데 큰 어려움을 겪어왔다. 사용자는 작은 점프를 위해 점프 버튼을 탭하고 높은 점프를 위해 점프 버튼을 누를 수있다. 크게 나 다음 코드 개발을 도왔가변 점프 높이

https://gamedev.stackexchange.com/questions/13277/variable-height-jumping-in-side-scrollers

:

PlayerMovementTimer = [NSTimer scheduledTimerWithTimeInterval:0.005 target:self selector:@selector(movePlayer) userInfo:nil repeats:YES]; 

[JumpButton addTarget:self action:@selector(jumpPlayer:) forControlEvents:UIControlEventTouchDown]; 
[JumpButton addTarget:self action:@selector(stopJump:) forControlEvents:UIControlEventTouchCancel | UIControlEventTouchUpInside | UIControlEventTouchDragExit]; 

- (void)movePlayer 
{ 
    CGFloat playerY = Player.center.y + PlayerYV; 
    if(playerY > 264) { 
     PlayerYV = 0; 
     playerY = 264; 
    } 
    if(playerY < 264) { 
     PlayerYV += 0.048f - PlayerYD; 
    } 
    if(HoldingJump && PlayerYV < 0 && PlayerYD + 0.0018f < 0.048f) { 
     PlayerYD += 0.0018f; 
    } 

    Player.center = CGPointMake(Player.center.x + PlayerXV, playerY); 
} 

- (IBAction)jumpPlayer:(id)sender 
{ 
    if(Player.center.y == 264) { 
     PlayerYD = 0; 
     PlayerYV = -2.25; 
     HoldingJump = true; 
    } 
} 

- (IBAction)stopJump:(id)sender 
{ 
    HoldingJump = false; 
} 

코드가 작동하는 것 같다가 (일부 값이 미세 조금 필요

나는이 주제에 발견 튜닝하지만 나는 아직 그것에 대해 얻지 못했다). 유일한 문제는 움직임이 약간 엉망이되는 것입니다 (실제 장치에서도). 그리고 플레이어가 점프의 최상위에있을 때 실제로는 천천히 가속을하고 값을 넣지 않으면 점프를 볼 수있는 것처럼 보입니다. 마리오 게임처럼 부드럽게.

코드를 살펴보고 확실하지 않은 것이 있는지 또는 NSTimer가 void 함수를 호출하는 것보다 효율적인 이동 제어 방법이 있는지 확인하십시오. 또한 UIImageView의 위치를 ​​부동 소수점 값으로 설정하는 중입니까?

감사합니다.

답변

1

여기에는 꽤 많은 문제가 있습니다. 먼저, ImageView 또는 다른 UI 요소의 원점을 분수 픽셀 인 좌표 위치로 설정해서는 안됩니다. 이로 인해 이미지가 흐려지는 하위 픽셀링이 발생합니다. 이것을 피하려면 모든 CGFloat가 roundf() 또는 다른 유사한 반올림 함수를 사용하여 가장 가까운 정수로 반올림되어야합니다.

내가 볼 수있는 또 다른 문제는 Player.center를 설정한다는 것입니다. Player가 ImageView가 아니라면 인생을 힘들게 할 수 있기를 바랍니다. 위에서 언급했듯이 프레임의 원점이 원형 인 CGFloat로 설정되지 않으면 하위 픽셀링이 발생합니다. center 속성을 사용하면 잘못된 원점 값을 쉽게 얻을 수 있습니다. 예를 들어 11 by 11 이미지가 있고 중심이 (11,11)로 설정되면 원점은 (5.5,5.5)로 설정되고 하위 픽셀링이 발생합니다. 이것을 피하는 쉬운 방법은 원점을 올바르게 배치하고 먹이를주는 CGFloat를 둥글게해야합니다 (또는 프레임을 설정하기 전에 프레임에 CGRectIntegral을 사용하는 것입니다).

세 번째 문제는 타이머를 0.005 초라고합니다. 이 게임이 60FPS로 실행되기를 원한다고 가정 해 봅시다. 60 FPS는 약 0.0167 초로 변환됩니다. 타이머가 메서드를 세 번 더 자주 호출하면 60FPS를 원한다고 할지라도이 메서드를 호출하면 자꾸 움직이는 동작이 발생할 수 있습니다.

점프와 같은 "마리오"를 얻는 관점에서 위의 코드를 사용하는 경우 전용 물리 엔진이 필요하므로 실제로는 전용 물리 엔진을 사용하는 것이 좋습니다. 물리 엔진이하는 일은 플레이어가 좀 더 사실적으로 보이고 행동하도록하는 "중력"을 일정하게 적용하는 것입니다. 플레이어가 버튼을 누르면 플레이어 캐릭터에 충동을 적용합니다. 충동을 사용하면 버튼을 누르고있는 기간에 따라 다른 방법으로 충동을 적용 할 수 있으므로 작업을 단순화 할 수 있습니다. 위의 코드는 실제 문제를 해결하지 않고이 문제를 해결하기 위해 노력하는 것입니다. 물리 엔진.

사용할 수있는 가능한 물리 엔진으로 cocos2D 및 Box2D를 조사하십시오. cocos2D + Box2D에는 풍부한 리소스가 있으며 cocos2D를 사용하여 물리 엔진이 작동하는 방법에 대한 기본적인 이해를 제공하는 슈퍼 마리오 클론을 만드는 방법에 대한 자습서를 작성한 개발자도 있습니다. http://www.raywenderlich.com/15230/how-to-make-a-platform-game-like-super-mario-brothers-part-1

+0

감사합니다!이 정보를 사용하여 UIImageView에 흐린 효과를 성공적으로 막을 수 있었고 타이머에 올바른 값을 사용하여 부드러운 움직임을 만들 수있었습니다! 또한, 물리 엔진 포인터를 사용하여 주셔서 감사하지만 그것은 필요하지 않습니다; 나는 내 문제를 고쳤고 지금은 내 게임을위한 완벽한 점프 시스템을 가지고있다 :) – CHRIS