2013-04-20 90 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的位置设置为float值不好?

谢谢。

回答

1

所以这里有很多错误。首先,是的,你不应该将ImageView或任何其他UI元素的原点设置为分数像素的坐标位置。这会导致子像素模糊,从而使图像模糊。为了避免这种情况,所有的CGFloats应该使用roundf()或其他类似的舍入函数四舍五入到最接近的整数。

我能看到的另一个问题是,您正在设置Player.center。我希望为了你的缘故,Player不是ImageView的原因,因为你会让你的生活变得更加艰难。如上所述,当框架的原点未设置为圆形数字的CGFloat时,您将获得子像素化。当您使用中心属性时,您可能很容易导致自己遇到不良的原始值。例如,如果我有一个11乘11的图像并将其中心设置为(11,11),则原点将设置为(5.5,5.5),并且会导致子像素化。简单的方法来避免这种情况只是做数学正确放置原点,并确保将您馈入的CGFloats四舍五入(或者在设置之前在框架上使用CGRectIntegral)。

这里的第三个问题是计时器被称为0.005秒。假设您希望这款游戏以60 FPS运行。 60 FPS转换为大约0.0167秒。计时器经常三次调用该方法,即使您需要60 FPS也需要该方法,另外,经常调用此方法可能会导致一些不稳定的运动。

现在就获得像“马里奥”一样的跳跃而言,你真正需要做的就是寻找一个专用的物理引擎,因为如果你使用上面的代码,你似乎没有一个。物理引擎会做的是应用恒定的“引力”,这将有助于使玩家跳跃起来,看起来更加真实。当玩家按下一个按钮时,你会对玩家角色施加冲动。冲动的使用也可以简化你的工作,因为你可以以不同的方式应用冲动,具体取决于他们持有按钮的时间长短等。上面的代码只是试图解决这个问题,而不是解决你没有一个真正的问题物理引擎。

去调查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 2013-04-29 15:13:25