android - 顺畅的飞行运动,如飞扬的小鸟或喷气背包,通过重力和加速度享受欢乐之旅

标签 android html 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;
    }
}

从游戏循环中调用的 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++ 不是提高速度的平滑方法,我不确定但可能会添加一些与 time 相关的变量来增加可能会改善它,此外添加gravity 会使它更逼真,但我不知道该怎么做,我读过一些博客,首先我无法使用正确的关键字进行搜索,其次是它们是如此很难理解,因为它们包含与平台相关的代码。请帮忙。

我正在用 android 制作这款游戏​​,但可以接受任何语言的代码(HTML5、javascript、Android、Flash 或任何语言)。

问:如何为用户点击或单击并在释放时掉落的物体( Sprite )添加加速度和重力? 类似于喷气背包兜风的东西(只有上下运动)

已更新

在@scott 建议我实现了 dY += gravity + flapp 之后,我现在可以感觉到重力,但是有两个问题。

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

关于不断添加到 y 位置的 dY 应该如何限制。

这是更新代码。

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

最佳答案

重力只是一个向下的加速度。加速度反过来只是速度的变化(定向速度)。对于以下讨论,我做出以下假设以使事情更简单:

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

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

让我们将重力设置为每个循环 -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:您不想直接使用重力和拍打来改变高度。相反,您想使用重力和扑动来计算每次迭代的速度,然后使用它来调整高度。

关于android - 顺畅的飞行运动,如飞扬的小鸟或喷气背包,通过重力和加速度享受欢乐之旅,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22442495/

相关文章:

android - 将支持库添加到 Android Studio 项目

html - 如何设置Servlet Path让HTML正确调用servlet文件?

javascript - 在 JavaScript 中重定向

actionscript - 现有的 swf mp4 播放器?

jquery - 为什么 tableTools 对同一个 SWF 文件进行多次调用?

Android - 对远程服务器的 Volley JSON 请求只能正常工作一次

Android - 相机

android - 使用 Fragment Pager Adapter 时,getItem() 方法被调用两次

javascript - 如何将 input(type = text ) 从 html 表单传递到 javascript 函数

flash 对象上的 javascript onclick 事件