2010-11-24 6 views
1

J'essaie de faire un jeu de volleyball et de simuler chaque action basée sur box2d. Ce que je veux faire est d'avoir une restitution de balle différente lorsque le joueur frappe la balle et que la balle frappe le mur. Donc, dans le premier cas, la balle devrait voler plus vite, et dans le second cas, plus lentement.box2D flash: Resitution sélective

Mais si j'essaie d'établir une restitution pour un joueur et pour des objets muraux d'une manière différente, je remarque également que le joueur lui-même rebondit sur le mur ... Y a-t-il un moyen de le faire de manière sélective? Par exemple. frapper le sol ne devrait pas faire rebondir un joueur ... Mais si le joueur frappe la balle, il devrait rebondir beaucoup.

Répondre

2

Malheureusement, vous avez raison, Box2D n'a pas ce paramètre.

Ce que vous pouvez faire à la place est d'écouter un événement d'auditeur de contact qui correspond à la fois au joueur et à la balle. Quand cela arrive, vous appliquez une très grande force à la balle.

modifier

Je dactylographiées ce du haut de ma tête, je ne suis pas sûr qu'il est tout à fait exact.

public class MyContactListener extends b2ContactListener { 
    override public function Add(point:b2ContactPoint):void { 
     var ball:b2Body = ... 
     var player:b2Body = ... // fill these 
     var force:b2Vec2; 

     if(point.shape1.GetBody() == ball && point.shape2.GetBody() == player) { 
      force = point.normal.Copy(); 
      force.Multiply(SOMETHING); 
      ball.ApplyForce(force); 
     } else if(point.shape1.GetBody() == player && point.shape2.GetBody() == ball) { 
      force = point.normal.Copy(); 
      force.Multiply(-SOMETHING); 
      ball.ApplyForce(force); 
     } 
    } 
} 

Que se passe-t-il ici?

Vous devez créer une instance de cette classe et l'enregistrer avec le monde qui est probablement quelque chose comme world.SetContactListener(new MyContactListener) ou quelque chose.

La méthode Add() se déclenche lorsque deux corps entrent en contact. La force appliquée est dans le sens de la normale de contact (qui vous emmène d'un corps à l'autre). En raison de la manière dont le système d'écouteurs de contacts est configuré, il est possible que la balle ou le lecteur soit le corps n ° 1 dans la structure b2ContactPoint, vous devez donc coder pour cette possibilité. La direction de la normale dépend de laquelle est le corps n ° 1 (d'où le signe moins). Je ne peux pas me souvenir exactement de quelle façon cela se passe, alors vous devrez peut-être inverser la force (mettez le signe moins dans l'autre branche).

À part cela, il devrait être raisonnablement clair. Box2D ne semble pas si bien connu ici, donc vous pourriez avoir un peu plus de chance sur les forums Box2D (http://www.box2d.org/forum/)

+0

une ligne de code par exemple sera vraiment utile :) –

+0

@Oleg, est-ce utile? –

+0

Oui, merci beaucoup! –