我在 Game Maker 8 Pro 上工作,游戏制作者语言 (GML)。我需要物体碰撞,根据角度相互传递脉冲。你需要一个弹性碰撞。我在 Wikipedia 上找到了公式,这是它的原始来源https://williamecraver.wixsite.com/elastic-equations。同样在互联网上,我找到了公式http://new.math.uiuc.edu/math198/MA198-2013/dprorok2/FearTheSpherePPT.pdf的解释。必须马上说明,这个解释有一个错误,即θ角除以速度(vspeed / hspeed),如果hspeed = 0,则程序崩溃。因此,我只是使用了方向,并且我在寻找 fi 的解释。这是代码:
if place_meeting(x+hspeed, y+vspeed, oWall) direction-=180 //чтобы шары не улетали за комнату
if inst[4]!=0 inst[4]-=1 //для кулдауна
inst[1]=collision_circle(x+hspeed,y+vspeed,12,oball,false,true) `находим уникальный id того, кого тараним`
if inst[1]!=noone and inst[4]=0 //если id существует и кулдаун прошел, то сталкиваемся, используя формулу
{
fi=arctan((y-inst[1].y)/(x-inst[1].x))
teta1=degtorad(direction) //директион от 0 до 360, зависит от hspeed и vspeed (если кто не знаком с GML)
teta2=degtorad(inst[1].direction) //с помощью id можно найти переменные определённого объекта
v1x=inst[1].speed*cos(teta2-fi)*cos(fi)+speed*sin(teta1-fi)*cos(fi+pi/2)
v1y=inst[1].speed*cos(teta2-fi)*sin(fi)+speed*sin(teta1-fi)*sin(fi+pi/2)
v2x=speed*cos(teta1-fi)*cos(fi)+inst[1].speed*sin(teta2-fi)*cos(fi+pi/2)
v2y=speed*cos(teta1-fi)*sin(fi)+inst[1].speed*sin(teta2-fi)*sin(fi+pi/2)
hspeed=v1x
vspeed=v1y
inst[1].hspeed=v2x
inst[1].vspeed=v2y
inst[4]=3
inst[1].inst[4]=3
inst[13]=0
inst[1]=0
}
if mouse_check_button(mb_right) instance_destroy()
我简化了公式,因为质量是相同的。在一个地方,零带走了部分公式,除法也从公式中带走了因子 2。在 Create 事件中,创建了一个包含 20 件的 inst 数组(仅使用了少数)。inst[4] 是一个小的冷却时间,因此在碰撞后球有时间从下一次碰撞中逃脱。该公式无法正常工作,但并非总是如此。有时它会起作用,有时球会异常反弹。我的错误是什么?(如有必要,我可以甩掉 gmk)
PS(十几天后)我找到了一个 GM8Pro 的脚本,它可以正常工作并且球可以正确反弹,就像在弹簧碰撞中一样。原则上,问题解决了,虽然我不清楚为什么我不能适应公式。我将代码留给可能正在寻找信息的人
PPS 无需冷却。