3

我正在开发一个简单的游戏,当您点击/单击屏幕时,角色会飞起来。继续点击角色会飞(有些类似于飞扬的鸟和喷气背包)。然而,与喷气背包一样,运动一点也不顺畅。

这是我的代码示例。

变量初始化

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;
    }
}

从游戏循环调用的 Sprite 更新

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我现在可以感觉到重力,但是有两个问题。

  1. 我的屏幕高度是 480,精灵立即接触上(y=0)和下(y=480)边界,因为我认为它会不断增加精灵的速度。
  2. 当它接触到地面时,它看起来非常粗糙,并且需要很长时间才能将精灵举到空中。

有些应该对 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)
    }
}
4

1 回答 1

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。第 5 次,dy = -40 + (-10) = -50. 每次通过,下降速度比前一次增加10倍。

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

y += dY;

所以第一次通过时,高度将是y = 500 + (-10) = 490。第二次, y = 490 + (-20) = 470。第 5 次,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:您不想直接使用重力和拍打来改变高度。相反,您想使用重力和拍打来计算每次迭代的速度,然后使用它来调整高度。

于 2014-03-19T10:49:11.720 回答