我正在开发一个简单的游戏,当你点击/点击屏幕时,角色会飞起来。继续攻击角色会飞(有些类似于飞扬的鸟和喷射包)。然而,这种运动根本不是平滑的,就像喷气背包一样。
以下是我的代码示例。
可变性启动
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**
}
}
我认为speed++
不是一种提高速度的平滑方式,我不确定但是可能会增加一些时间相关变量来增加它可能会改善它,而且添加一个引力会让它变得更加逼真,但我不知道怎么做,我读过几篇博客,首先我无法使用正确的关键词进行搜索,第二件事就是他们很难理解,因为它们包含平台相关代码。请帮忙。
我在Android中制作此游戏,但接受任何语言的代码(HTML5,javascript,Android,Flash或任何)。
问:如何将加速度和重力添加到对象(精灵)中,当用户点按或点击并放下时,它会飞起来? 类似于喷射包装兜风的东西(仅上下运动)
已更新
@scottt建议我实施了dY += gravity + flapp
我现在感觉到了引力,但有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)
}
}
答案 0 :(得分: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
。第五次,dy = -40 + (-10) = -50
。每次通过时,向下的速度比以前的速度快10倍。
高度很简单。每次通过时,高度都会随垂直加速度的变化而变化。所以:
y += dY;
所以第一次通过时,身高将是y = 500 + (-10) = 490
。第二次,y = 490 + (-20) = 470
。第五次,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:您不希望使用重力和拍打直接更改高度。相反,您希望使用重力和拍打来计算每次迭代的速度,然后使用它来调整高度。