平滑的飞行运动,如飞扬的鸟或喷射包装喜悦乘坐重力和加速度

时间:2014-03-16 20:25:41

标签: android html5 flash game-physics flappy-bird-clone

我正在开发一个简单的游戏,当你点击/点击屏幕时,角色会飞起来。继续攻击角色会飞(有些类似于飞扬的鸟和喷射包)。然而,这种运动根本不是平滑的,就像喷气背包一样。

以下是我的代码示例。

可变性启动

maxSpeedLimit  = spriteHeight/10;
speed = maxSpeedLimit/2; //half of the max speed

触碰事件

public void onTapOrClick(int action) {
    if (action == UP) {
        sprite.up= true;
    }
    else {
        sprite.up = false;
    }
}

从游戏循环调用的精灵更新

public void update() {
    if (up) {
        y -= speed; //fly up
    }
    else {
        y += speed;// fly down
    }
    if (speed < maxSpeedLimit) {
        speed++; // May be cheep way to add **velocity/acceleration**
    }   
}

我认为speed++不是一种提高速度的平滑方式,我不确定但是可能会增加一些时间相关变量来增加它可能会改善它,而且添加一个引力会让它变得更加逼真,但我不知道怎么做,我读过几篇博客,首先我无法使用正确的关键词进行搜索,第二件事就是他们很难理解,因为它们包含平台相关代码。请帮忙。

我在Android中制作此游戏,但接受任何语言的代码(HTML5,javascript,Android,Flash或任何)。

问:如何将加速度和重力添加到对象(精灵)中,当用户点按或点击并放下时,它会飞起来? 类似于喷射包装兜风的东西(仅上下运动)

已更新

@scottt建议我实施了dY += gravity + flapp我现在感觉到了引力,但有2个问题。

  1. 我的屏幕高度为480,精灵立即触摸上边(y = 0)和下边(y = 480)边界,因为我认为它会不断提高精灵的速度。
  2. 当它接触到地面时,看起来非常强大并且需要花费很多时间才能将空气提升到空中。
  3. 某些如何对dY进行一些限制,这种限制会不断添加到y位置。

    这是更新代码。

    int downSpeed = 1;
    int upSpeed = -2;
    int dy = 0;
    private void update() {
        if (flapping) {
            upSpeed = -2; //if flying speed
        }
        else {
            upSpeed = 0;
        }
    
        dy  +=  downSpeed + upSpeed;
        if (dy < -10) {
            dy = -10; //limit for rise speed
        }
        else if (dy > 8) {
            dy = 8; //limit for gravity
        }
        y += dy; // add value in y location
        if (y > GAME_HEIGHT - sprite.getHeight()) {
            y = GAME_HEIGHT  - sprite.getHeight(); // reset y, if touch ground
            dy = 0; //reset speed, otherwise it make it very heavy to rise
        }
        else if ( y < 0) {
            y = 0; //reset y if touch upper limit
            dy = 0; //reset speed, otherwise take much time to fall (as it would be in negative)
        }
    }
    

1 个答案:

答案 0 :(得分:3)

重力只是向下加速。加速度又是速度的变化(定向速度)。在下面的讨论中,我做了以下假设以使事情变得更简单:

  • 你的水平速度是恒定的
  • 输入点击称为“拍打”
  • 重力通常表现
  • 简单化,而非科学方法/措辞对我们来说是可行的

对于每次通过更新循环的过程,必须对所有各种加速度求和,并将总和加到当前速度。在您的情况下,有两种可能的加速度,重力和可能的拍打。重力是恒定的,是一个负值(向下工作),而拍打只发生在点击期间,正向(向上)。

让我们将重力设置为每个循环-10像素,点击每个循环+25像素,初始高度为500.一些初始定义是:

static final int gravity = -10;   // constant downward acceleration
static final int flapping = 25;   // upward acceleration whenever isFlapping is true

Boolean isFlapping = false;   // Is the bird flapping

int dY = 0; // current vertical speed
y = 500;    // current vertical position

每次循环,没有拍打,速度计算将是:

dY += gravity + flapping;

所以第一次,速度计算将是dY = 0 + (-10) + 0 = -10。第二次,dy = -10 + (-10) + 0 = -20。第五次,dy = -40 + (-10) = -50。每次通过时,向下的速度比以前的速度快10倍。

高度很简单。每次通过时,高度都会随垂直加速度的变化而变化。所以:

y += dY;

所以第一次通过时,身高将是y = 500 + (-10) = 490。第二次,y = 490 + (-20) = 470。第五次,y = 400 + (-50) = 350。因为每次下降的速度都会增加,所以这只鸟会越来越快地坠落直到啪啪!

这就是拍打的地方。每次通过发生拍打的循环时,+ 25将应用于dY计算。因此,假设鸟在第6次迭代中开始拍打。 dy计算为dy = -50 + (-10) + 25 = -35,高度为y = 350 + (-35) = 315。下次通过将dy = -35 + (-10) + 25 = -20,高度为y = 350 + (-20) = 295。仍然下降,但更慢。之后的时间:dy = -20 + (-10) + 25 = -5y = 295 + (-5) = 290。最后一次显示高度增益:dy = -5 + (-10) + 25 = 10y = 290 + 10 = 300

所有这一切,你肯定需要玩这些数字,直到你得到满意的结果。

TLDR:您不希望使用重力和拍打直接更改高度。相反,您希望使用重力和拍打来计算每次迭代的速度,然后使用它来调整高度。