ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

android-通过重力和加速度使飞行平稳,如飞扬的小鸟或喷气背包喜悦的飞行

2019-11-22 01:27:44  阅读:129  来源: 互联网

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


我正在开发一个简单的游戏,当您点击/单击屏幕时,角色会飞起来.持续点击角色会飞(类似于飘扬的小鸟和喷气背包).但是,就喷气背包而言,运动根本不是很平稳.

这是我的代码示例.

可变初始化

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

我认为速度不是提高速度的平滑方法,我不确定,但是可能会添加一些与时间有关的变量以增加速度,而且添加重力会使其更逼真,但我不知道该怎么做,我读过很少的博客,第一件事是我无法使用正确的关键字进行搜索,第二件事是它们很难理解,因为它们包含与平台相关的代码.请帮忙.

我正在用android制作游戏,但是可以接受任何语言的代码(HTML5,javascript,Android,Flash或任何一种).

问:如何在用户轻击或单击并放开时飞行的物体(精灵)上增加加速度和重力?
类似于喷气背包的操纵杆(只能上下移动)

更新

在@scottt建议下,我已经实现了dY =重力拍打,现在我可以感觉到重力了,但是有两个问题.

>我的屏幕高度是480,并且精灵立即触摸上(y = 0)和下(y = 480)边界,因为我认为它不断提高了精灵的速度.
>当它碰到地面时,似乎显得很忙,需要花费很多时间才能将精灵抬起.

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

解决方法:

重力只是向下的加速.加速度反过来只是速度(方向速度)的变化.在下面的讨论中,我做出以下假设以使事情更简单:

>您的水平速度恒定
>输入敲击称为“拍打”
>重力正常
>对于我们的目的而言,简单而不是科学的方法/语言是可以的

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

让我们将重力设置为每个循环-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.第五次,y = 400(-50)=350.因为每次下降的速度都会加快,这只鸟会急速下降,直到摔倒!

那就是拍击的地方.每次通过循环发生拍击时,dY计算将应用25.因此,让我们假设鸟在第6次迭代中开始拍打. dy的计算将是dy = -50(-10)25 = -35,而高度将是y = 350(-35)=315.下次通过计算得出dy = -35(-10)25 = -20并且高度将为y = 350(-20)=295.仍在下降,但速度较慢.之后的时间:dy = -20(-10)25 = -5并且y = 295(-5)=290.之后的时间终于显示出身高的增加:dy = -5(-10)25 = 10 y = 290 10 = 300.

综上所述,在获得令人满意的结果之前,您肯定需要使用数字.

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

标签:html5,flash,game-physics,flappy-bird-clone,android
来源: https://codeday.me/bug/20191122/2056004.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有