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 的位置设置为浮点值是否不好?

谢谢。

4

1 回答 1

1

所以这里有很多问题。首先,是的,您永远不应该将 ImageView 或任何其他 UI 元素的原点设置为小数像素的坐标位置。这会导致亚像素化,从而使您的图像模糊。为避免这种情况,所有 CGFloat 都应使用 roundf() 或其他类似的舍入函数四舍五入到最接近的整数。

我可以看到的另一个问题是您正在设置 Player.center。我希望为你着想 Player 不是 ImageView 因为你会让你的生活变得更艰难。如上所述,当帧的原点未设置为整数的 CGFloat 时,您将获得子像素化。当您使用 center 属性时,您很容易导致自己获得错误的原点值。例如,如果我有一个 11 x 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

于 2013-04-28T05:59:40.247 回答