我一直很难创建一个跳跃系统,用户可以点击跳跃按钮进行小跳跃并按住它以获得更高的跳跃。
我偶然发现了这个话题:
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的位置设置为浮动值不好吗?
感谢。
答案 0 :(得分:1)
所以这里有很多不妥之处。首先,是的,您永远不应该将ImageView或任何其他UI元素的原点设置为分数像素的坐标位置。这会导致子像素化,这会模糊您的图像。为避免这种情况,所有CGFloats都应使用roundf()或其他类似的舍入函数舍入到最接近的整数。
我可以看到的另一个问题是你正在设置Player.center。我希望为你的缘故,玩家不是一个ImageView,因为你将会让你的生活变得更加艰难。如上所述,当帧的原点未设置为圆形数字的CGFloat时,您将得到子像素化。当您使用center属性时,您很容易导致自己获得不良的原始值。例如,如果我有一个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