我承认,我是一个数学白痴。我应该在家里尝试吗?可能不行,否则会受重伤。无论如何,任何有游戏和物理经验的人都可以审查这段代码,并提供为什么原型中存在速度“损失”的见解,这将受到极大的钦佩。
概念:演员从天空落下,某个时刻与边界(弹床.y)相交,之后重力(在本例中为1.6)停止操作,反弹因子(在本例中为-6)接管。
现在我正在尝试创建一个零和情况,在这种情况下,您从弹床“弹跳”(hero.y>= trampoline.y)中得到的速度与进入时相同。但是,结果显示这并不是事实。
我尝试了五种不同的方法,这是最新的一种,考虑到在我的游戏计时器的任何给定“tic”(33毫秒)中,我们可能已经越过了弹床的边界,因此加速规则将已更改。我真的以为我做到了,但结果显示每次弹跳后速度都会减小,这不是我预期的。
我向您提交以下代码,希望您进行审查:
var newV:Number;
if (hero.y < trampoline.y) { newV = hero.velocityY + gravityAccelerationInPixels }
else { newV = hero.velocityY + TrampolineActor.SPRING_ACCELERATION }
var newY:Number = hero.y + newV;
trace("Coming in: y=" + hero.y + " oldVelocity=" + hero.velocityY + " newVelocity=" + newV + " Change in V: " + (newV - hero.velocityY) + ". Testing for newY=" + newY);
if ((hero.y < trampoline.y && newY < trampoline.y) || (hero.y >= trampoline.y && newY >= trampoline.y)) {
hero.y = newY;
hero.velocityY = newV;
} else {
trace("SPLIT");
var percent:Number = (trampoline.y - hero.y) / newV; trace("Percent: " + percent);
var newVV:Number;
if (hero.y < trampoline.y) {
// going down!
newVV = hero.velocityY + percent * gravityAccelerationInPixels; trace("New velocity before split: " + hero.velocityY + " Change in V: " + (newVV - hero.velocityY));
newVV += (1 - percent) * TrampolineActor.SPRING_ACCELERATION; trace("Percent after split: " + (1 - percent) + " Change in V: " + (newVV - hero.velocityY));
} else {
// movin on up!
newVV = hero.velocityY + percent * TrampolineActor.SPRING_ACCELERATION; trace("New velocity before split: " + hero.velocityY + " Change in V: " + (newVV - hero.velocityY));
newVV += (1 - percent) * gravityAccelerationInPixels; trace("Percent after split: " + (1 - percent) + " Change in V: " + (newVV - hero.velocityY));
}
trace("New velocity: " + newVV + " Change in V: " + (newVV - hero.velocityY));
hero.velocityY = newVV;
hero.y += hero.velocityY;
}
附加信息: 屏幕原点在左上角,所以 y-- = 向上更高 我的tic目前设置为33毫秒 gravityAccelerationInPixels 目前是 1.62 (比较随意) SPRING_ACCELERATION 是任意的6,但我希望调整该数字以控制人物在减速/吸收周期中能距离蹦床多远。
目前我希望有一个解决方案,在人物与蹦床断开联系后,在tic上的速度与进入前的速度相同(但是为负数)。我甚至尝试存储和检索进入位置和速度,但这看起来只是一种干扰。
y
是向上还是向下增加,2)您是否介意您的蹦床表现出非物理性质,例如向上的重力而不是弹性,3)您想知道您的代码哪里出了问题,还是想要一个可行的解决方案,或者两者都要? - Beta