2012-02-23 61 views
2

我目前正在试图用XNA制作一个基本的平台游戏,我想知道如何创建一个“跳跃效果”。我目前有基本的键盘输入允许横向移动,但我希望我的精灵缓慢进入跳跃,而不是立即传送到那里(现在我每次跳跃时都有类似Rectangle.Y + = 40的东西,使得精灵即刻出现在那里)。有没有人有任何见解?游戏中的跳跃效果

+0

您可以为运动添加第二个矢量(除了位置)。然后,在每次更新时,将运动矢量添加到位置矢量。在跳转时,设置运动矢量以缓慢移动播放器。在跳跃的最高点,改变它以将球员向下移动。跳转后,设置为零。需要注意的是,如果有几件事会影响运动矢量的话(添加它,而不是将它设置为不覆盖现有运动) – yoozer8 2012-02-23 02:38:43

回答

0

我并不完全知道如何在XNA/C#中实现这一点,但是在我制作的Flash游戏中,我只是添加了垂直速度属性。我会尽我所能写所有的东西作为C#..

例子;创建速度属性:

​​

垂直速度应该不断降低(通过重力)。建立一个重力属性从您的播放器的地方进行访问:

float Gravity = 2.5; 

而在你的球员update()方法,通过Gravity递增verticalVelocity。同时增加玩家的Y位置verticalVelocity。这将模拟下降:

verticalVelocity += Gravity; 
Position.Y += verticalVelocity; // this may be -= in XNA, not sure where the y axis beings 

当你打一个面,速度应该重置为0

最后,跳,简单地从verticalVelocity减去给定值:

public void Jump(float height) 
{ 
    // Only jump if standing on a surface. 
    if(verticalVelocity == 0) 
     verticalVelocity -= height; 
} 
+0

为了可扩展性,您应该创建一个'PhysicsSimulation'(或类似的)类并让它包含'List '其中Body是一个基类,玩家和任何其他应该受到影响的对象都继承自基类。然后你可以更新'PhysicsSimulation'并且它可以处理所有物体的重力。这可以让你的游戏玩法更加丰富,没有太多困难。 – annonymously 2012-02-23 07:48:35

+0

@匿名这是一个OP的建议,而不是我自己? – Marty 2012-02-23 08:46:07

+0

两者,我想:) – annonymously 2012-02-23 09:44:11

0

你最终会想要在你的游戏中加入重力和其他力量,所以我强烈建议你为自己节省很多痛苦并实现某种基本的力量系统。这可以使用Vector2来完成,因为您可以将它们添加到角色的速度。然后对你的角色施加一个瞬间的力量来推动它。

如果你真的不想使用物理引擎,你可以做一个Vector2与高点跳跃的Y和人物X的,然后使用Vector2.Lerp方法的字符位置之间进行插值跳跃的终点。

这通常是一个非常糟糕的系统使用,我强烈建议您使用现有的物理引擎,或使自己的一个简单的。

0

使用一个sinusoid

代码应该看起来像这样:

float ground = 0.0f; 
float angle = 330.0f; 

jump(){ 
if(ground == 0.0f)ground = Rectangle.Y; 
    if(Rectangle.Y <= ground) 
    { 
    Rectangle.Y+=Math.Sin(angle/(Math.Pi*180)); 
    angle++; 
    } 
} 
+0

如果你把这个代码放在Update方法中,它将不起作用。你的逻辑有点偏离,角色会以不同的速度向上移动。我想你真正想要做的是:'Rectangle.Y =(int)(ground + Math.Sin(angle /(Math.PI * 180)));' – annonymously 2012-02-23 09:54:15

+0

那就是为什么我用'+ ='而不是' =' – user1097489 2012-02-23 14:01:13

+0

使用'+ ='将右边的操作数添加到左边,然而我们在这里添加*'ground' *到'Sin'值,然后把它分配给'Rectangle'。 – annonymously 2012-02-23 20:30:51

0

您可以准确地创建一个重力作用,如果你动态修改ySpeed,而不是仅仅增加40

你要声明一个ySpeed

ySpeed = 0; 

然后你要使用的加速度变量

acceleration = 0.25; 

好的,现在我们已经做到了,让我们增加引力,只要我们的玩家没有碰到地板。

if(playerLocationY + playerHeight > floorLocationY) 
{ 
    gravity = false; 
} 
else 
{ 
    gravity = true; 
} 

if(gravity) 
{ 
    ySpeed += acceleration; 
} 

既然我们已经搞清楚了,我们想要包括一些让我们跳跃的东西。

if(KeyPressed == UP) 
{ 
    ySpeed -= acceleration; 
} 

这将在向上的方向

现在,我们要确保我们实际上动动我们的球员,所以让我们添加一个最后一行,我们就大功告成了。

playerLocationY += ySpeed; 

恭喜你,你做到了。