我正在开发一个简单的游戏,当您点击/单击屏幕时,角色会飞起来。继续点击角色会飞(有些类似于飞扬的小鸟和喷气背包)。然而,运动一点也不流畅,就像喷气背包一样。
这是我的代码示例。
变量初始化
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
之后,我现在可以感觉到重力,但是有两个问题。
- 我的屏幕高度是 480,并且 sprite 立即触摸上(y=0)和下(y=480)边界,因为我认为它不断增加 sprite 的速度。
- 当它接触地面时,它看起来很轻便,需要很长时间才能将 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 = -5
和 y = 295 + (-5) = 290
。之后的时间终于显示出高度增加:dy = -5 + (-10) + 25 = 10
和 y = 290 + 10 = 300
。
总而言之,您肯定需要玩弄数字,直到获得满意的结果。
TLDR:您不想直接使用重力和拍打来改变高度。相反,您想使用重力和扑动来计算每次迭代的速度,然后使用它来调整高度。
关于android - 顺畅的飞行运动,如飞扬的小鸟或喷气背包,通过重力和加速度享受欢乐之旅,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22442495/