Actualmente estoy tratando de aplicar fuerza a un cuerpo usando un grado (un flotador entre -90 y 90) y un nivel de fuerza (un flotador entre 0 y 1). Body.applyForce() solo me permite proporcionar niveles de potencia x e y.
Lo que estoy tratando de lograr:
Quiero poder arrastrar hacia atrás desde una posición y hacer que mi cuerpo se lance hacia otras direcciones con la potencia del lanzamiento en función de cuánto arrastró hacia atrás el usuario.
Aquí está mi código para obtener el ángulo y el nivel de potencia.
var cachedPosition = { x: 0, y: 0 }; document.addEventListener("mousedown", (e) => { cachedPosition.x = e.clientX cachedPosition.y = e.clientY }) document.addEventListener("mouseup", (e) => { var degree = "INVALID"; var difX = cachedPosition.x - e.clientX var difY = cachedPosition.y - e.clientY if (difX > 0 && difY < 0) { var degree = getDegree(difX, difY) } if (difX < 0 && difY < 0) { var degree = -getDegree(Math.abs(difX), difY); // Negative degree if drag is towards bottom right. } var power = Math.sqrt(Math.pow(difX, 2)+Math.pow(difY, 2))/1000 })Se me ocurrió una solución muy poco elegante, pero funcional.
if (degree > 0) { if (degree < 25) { Body.applyForce(character, character.position, { x: power * (degree / 45), y: -0.4, }) } else if (degree > 45) { Body.applyForce(character, character.position, { x: power / (degree / 45), y: -power * (degree / 45) }) } else if (degree < 45) { Body.applyForce(character, character.position, { x: power * (degree / 45), y: -power / (degree / 45) }) } else if (degree == 45) { Body.applyForce(character, character.position, { x: power, y: -power }) } } else { if (-degree < 25) { Body.applyForce(character, character.position, { x: power * (degree / 45), y: -0.4 }) } else if (-degree > 45) { Body.applyForce(character, character.position, { x: power / (degree / 45), y: power * (degree / 45) }) } else if (-degree < 45) { Body.applyForce(character, character.position, { x: power * (degree / 45), y: power / (degree / 45) }) } else if (-degree == 45) { Body.applyForce(character, character.position, { x: power, y: -power }) } } La potencia para el valor x e y se multiplica o divide dependiendo de si el degree se inclina hacia 0 o 90 grados utilizando la diferencia porcentual entre el degree y los 45 grados, que es el "medio". He agregado excepciones para cualquier grado inferior a 25, en caso de que power sea demasiado alta y haga que el cuerpo vuele demasiado alto. En ese caso, acabo de establecer un valor de límite y de -0.4