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