Java-Gaming.org    
Featured games (79)
games approved by the League of Dukes
Games in Showcase (476)
Games in Android Showcase (106)
games submitted by our members
Games in WIP (533)
games currently in development
News: Read the Java Gaming Resources, or peek at the official Java tutorials
 
    Home     Help   Search   Login   Register   
Pages: [1]
  ignore  |  Print  
  How would you do player-to-player collision with box2d?  (Read 1265 times)
0 Members and 1 Guest are viewing this topic.
Offline l3dx

Junior Member


Medals: 1


Say what?


« Posted 2013-05-10 08:05:12 »

I'm trying to find a good way to achieve "correct" behavior when two players collide in a multiplayer game. My current situation is that when they collide, they apply forces to each other and starts spinning and changing direction.

I want them to be unable to walk through each other, but not to cause any force/impulse being applied. One idea I have is to add collision filtering for the players, and handle it manually.
Offline heisenbergman

JGO Coder


Medals: 14


L___ o_ G___ a__ P___


« Reply #1 - Posted 2013-05-10 08:10:28 »

You can add a collision listener, then when you detect that the two players collide, set their linear velocities to (0,0)

Offline heisenbergman

JGO Coder


Medals: 14


L___ o_ G___ a__ P___


« Reply #2 - Posted 2013-05-10 08:17:30 »

something like this, maybe?

1  
2  
3  
4  
5  
6  
7  
8  
9  
10  
11  
12  
13  
14  
15  
16  
17  
18  
19  
20  
21  
22  
23  
24  
25  
26  
27  
28  
29  
30  
31  
32  
33  
34  
35  
36  
37  
38  
39  
40  
41  
private void createCollisionListener() { 
ContactListener cl = new ContactListener() {

           @Override
           public void beginContact(Contact contact) {
               Fixture fixtureA = contact.getFixtureA();
               Fixture fixtureB = contact.getFixtureB();
               
               /* pseudocode start
               
               (1) check whether fixtureA belongs to a player and fixtureB belongs to a player
               
               (2) if fixtureA and fixtureB are both players do:
               
                     (a) fixtureA.getBody().setLinearVelocity(0.0f,0.0f);
                     (b) fixtureB.getBody().setLinearVelocity(0.0f,0.0f);
                             
               pseudocode end */

           }

           @Override
           public void endContact(Contact contact) {
               Fixture fixtureA = contact.getFixtureA();
               Fixture fixtureB = contact.getFixtureB();
               
               // TODO

           }

           @Override
           public void preSolve(Contact contact, Manifold oldManifold) {
           }

           @Override
           public void postSolve(Contact contact, ContactImpulse impulse) {
           }

       };
       
   world.setContactListener(cl);
   }

Games published by our own members! Check 'em out!
Legends of Yore - The Casual Retro Roguelike
Offline l3dx

Junior Member


Medals: 1


Say what?


« Reply #3 - Posted 2013-05-10 13:37:31 »

Cool. I'll try it out when I get some spare time.
Offline l3dx

Junior Member


Medals: 1


Say what?


« Reply #4 - Posted 2013-05-10 19:27:39 »

A problem with this (naive?) strategy is that when two players collideā€¦ they are stuck Smiley

I suppose that a quick and dirty fix would be to manually separate them just enough to be able to carry on. Any other suggestions?
Offline 65K
« Reply #5 - Posted 2013-05-10 20:04:00 »

Don't know exactly what behaviour you want. Setting the fixture restitution to zero prevents from bouncing back at collisions.

Offline l3dx

Junior Member


Medals: 1


Say what?


« Reply #6 - Posted 2013-05-10 23:36:52 »

I want to achieve something similar to this game http://www.java-gaming.org/topics/iconified/26049/view.html Pointing

Players can block the way for others, but not being pushed.
Offline Jimmt
« League of Dukes »

JGO Kernel


Medals: 128
Projects: 4
Exp: 3 years



« Reply #7 - Posted 2013-05-10 23:38:31 »

Yes, what's wrong with setting restitution to 0?
Offline l3dx

Junior Member


Medals: 1


Say what?


« Reply #8 - Posted 2013-05-10 23:50:11 »

Yes, what's wrong with setting restitution to 0?

You can push your opponent?
Offline heisenbergman

JGO Coder


Medals: 14


L___ o_ G___ a__ P___


« Reply #9 - Posted 2013-05-11 01:00:05 »

So basically, when players collide, you want it such that each player treats the player he's colliding into like a wall?

Games published by our own members! Check 'em out!
Legends of Yore - The Casual Retro Roguelike
Offline heisenbergman

JGO Coder


Medals: 14


L___ o_ G___ a__ P___


« Reply #10 - Posted 2013-05-11 01:20:37 »

What happens if you set the linear velocity to (0,0) only if the linear velocity is not (0,0)? This way, once they collide and their linear velocities are already at (0,0) --- you can move them again.

I think that's a better way of handling it than separating them just enough so that they could move again.

for example:

1  
2  
3  
4  
5  
6  
7  
8  
9  
if(fixtureA and fixtureB are both players){
   if(fixtureA.getBody().getLinearVelocity != (0,0)){
      fixtureA.getBody().setLinearVelocity(0.0f,0.0f);
   }

   if(fixtureB.getBody().getLinearVelocity != (0,0)){
      fixtureB.getBody().setLinearVelocity(0.0f,0.0f);
   }
}

Maybe you could try it out.

Offline 65K
« Reply #11 - Posted 2013-05-11 07:32:01 »

Yes, what's wrong with setting restitution to 0?

You can push your opponent?
If there are no equal but opposite forces, yes.
Otherwise, set up contact listeners/filters and clear steering forces from both players. Setting linear velocity is not recommended and not necessary, afaik.
Box2d example

Offline l3dx

Junior Member


Medals: 1


Say what?


« Reply #12 - Posted 2013-05-11 10:47:39 »

I tried, but it seems like this too causes the two bodies to become stuck. I guess that when velocity is set to zero they stay in a colliding state. ?

What happens if you set the linear velocity to (0,0) only if the linear velocity is not (0,0)? This way, once they collide and their linear velocities are already at (0,0) --- you can move them again.

I think that's a better way of handling it than separating them just enough so that they could move again.

for example:

1  
2  
3  
4  
5  
6  
7  
8  
9  
if(fixtureA and fixtureB are both players){
   if(fixtureA.getBody().getLinearVelocity != (0,0)){
      fixtureA.getBody().setLinearVelocity(0.0f,0.0f);
   }

   if(fixtureB.getBody().getLinearVelocity != (0,0)){
      fixtureB.getBody().setLinearVelocity(0.0f,0.0f);
   }
}

Maybe you could try it out.
Offline l3dx

Junior Member


Medals: 1


Say what?


« Reply #13 - Posted 2013-05-11 10:50:12 »

So basically, when players collide, you want it such that each player treats the player he's colliding into like a wall?

That's exactly what I want! Smiley
Pages: [1]
  ignore  |  Print  
 
 
You cannot reply to this message, because it is very, very old.

 

Add your game by posting it in the WIP section,
or publish it in Showcase.

The first screenshot will be displayed as a thumbnail.

pw (18 views)
2014-07-24 01:59:36

Riven (17 views)
2014-07-23 21:16:32

Riven (14 views)
2014-07-23 21:07:15

Riven (17 views)
2014-07-23 20:56:16

ctomni231 (45 views)
2014-07-18 06:55:21

Zero Volt (41 views)
2014-07-17 23:47:54

danieldean (32 views)
2014-07-17 23:41:23

MustardPeter (36 views)
2014-07-16 23:30:00

Cero (51 views)
2014-07-16 00:42:17

Riven (50 views)
2014-07-14 18:02:53
HotSpot Options
by dleskov
2014-07-08 03:59:08

Java and Game Development Tutorials
by SwordsMiner
2014-06-14 00:58:24

Java and Game Development Tutorials
by SwordsMiner
2014-06-14 00:47:22

How do I start Java Game Development?
by ra4king
2014-05-17 11:13:37

HotSpot Options
by Roquen
2014-05-15 09:59:54

HotSpot Options
by Roquen
2014-05-06 15:03:10

Escape Analysis
by Roquen
2014-04-29 22:16:43

Experimental Toys
by Roquen
2014-04-28 13:24:22
java-gaming.org is not responsible for the content posted by its members, including references to external websites, and other references that may or may not have a relation with our primarily gaming and game production oriented community. inquiries and complaints can be sent via email to the info‑account of the company managing the website of java‑gaming.org
Powered by MySQL Powered by PHP Powered by SMF 1.1.18 | SMF © 2013, Simple Machines | Managed by Enhanced Four Valid XHTML 1.0! Valid CSS!