2017-10-09 8 views
0

Je crée un jeu 2D de bureau Java en utilisant LibGDX.Box2D - Mouvement contrôlé avec la physique

Je dois pouvoir déplacer des objets (contrôlés par le joueur avec W/A/S/D).
La vitesse de déplacement est toujours la même (extraite d'un champ de l'objet en mouvement).

Pendant qu'ils se déplacent, ils devraient toujours être affectés par la physique. Cela signifie que lorsque vous vous éloignez d'un aimant, vous vous déplacez plus lentement, vous vous déplacez plus vite et vous vous déplacez plus vite pour vous déplacer. (Voir la partie bleue de l'image)

également une seule impulsion en se déplaçant pourrait vous frapper loin, mais vous déplacer (voir la partie rouge de l'image)

Vous devez également être en mesure de changer de direction ou d'arrêter, seulement l'arrêt votre propre mouvement, de sorte que vous serez toujours affecté par la physique.


J'ai donc besoin d'appliquer des forces constantes qui seront toujours accessibles (et amovibles) après l'étape suivante. Puis-je faire ceci avec Box2D?
-Si oui, comment?
-Si non, d'autres bibliothèques peuvent-elles le faire? Je n'ai pas vraiment besoin de densité et de trucs comme ça, les cas d'utilisation dans l'image sont à peu près tout ce dont j'ai besoin (+ Collision Detection).

image for visualization

* Un aimant serait un corps constamment en tirant d'autres corps dans une certaine gamme se
* Kockback serait juste une simple impulsion ou la collision d'un projectile avec l'objet.



EDIT: Si vous connaissez The Binding of Isaac, thats la physique un peu que je vise.

+0

je qualifierais 'applyForceToCenter()' sur l'entité à chaque itération, en fonction de la distance et de la direction de l'aimant. –

Répondre

2

Régler la distance où l'aimant a son influence:

float magnetRadius = 30; 

Régler la force d'attraction de l'aimant:

float magnetForce = 400; 

obtenir la position du joueur et de l'aimant:

Vector2 magnetPos = magnet.getWorldCenter(); 
Vector2 playerPos = player.getWorldCenter(); 

Calculez maintenant la distance entre le lecteur et l'aimant:

Vector2 magnetDist = new Vector2((playerPos.x - magnetPos.x), (playerPos.y - magnetPos.y)); 
float distance = (float) Math.sqrt((magnetPos.x) * (magnetPos.x) + (magnetPos.y) * (magnetPos.y)); 

Ensuite, si le joueur se trouve dans le rayon de l'aimant, vous devez appliquer une force à celui qui dépend de la distance du joueur de l'aimant:

if (distance <= magnetRadius) { 
    float vecSum = Math.abs(magnetDist.x)+Math.abs(magnetDist.y); 
    Vector2 force = new Vector2((magnetForce*magnetDist.x * ((1/vecSum)*magnetRadius/distance)), (magnetForce*magnetDist.y * ((1/vecSum)*planetRadius/distance))); 
    player.applyForceToCenter(force, true); 
} 
+0

Ok merci, ça veut dire que j'ai encore besoin de faire beaucoup moi-même. Je vais essayer votre solution et l'accepter si cela fonctionne. Je pourrais aussi bien télécharger les classes pour un aimant et des trucs une fois que je les ai créés. – Lahzey

+0

Ça a marché, merci. J'ai dû faire quelques modifications, car certaines choses étaient fausses. – Lahzey

+0

La question du mouvement contrôlé et constant qui est encore affectée par les aimants et autres choses est toujours sans réponse, mais je vais travailler dessus et peut-être créer une nouvelle question sur ce sujet. – Lahzey