Du bist nicht angemeldet.

Stilllegung des Forums
Das Forum wurde am 05.06.2023 nach über 20 Jahren stillgelegt (weitere Informationen und ein kleiner Rückblick).
Registrierungen, Anmeldungen und Postings sind nicht mehr möglich. Öffentliche Inhalte sind weiterhin zugänglich.
Das Team von spieleprogrammierer.de bedankt sich bei der Community für die vielen schönen Jahre.
Wenn du eine deutschsprachige Spieleentwickler-Community suchst, schau doch mal im Discord und auf ZFX vorbei!

Werbeanzeige

BlueCobold

Community-Fossil

Beiträge: 10 738

Beruf: Teamleiter Mobile Applikationen & Senior Software Engineer

  • Private Nachricht senden

11

18.05.2013, 06:34

Du sollst die gar nicht selbst aufrufen, Du musst einen ContactListener registrieren, der hat so eine Methode. Und da muss Dein Code hin. Dann ruft Farseer das selbst auf.
Teamleiter von Rickety Racquet (ehemals das "Foren-Projekt") und von Marble Theory

Willkommen auf SPPRO, auch dir wird man zu Unity oder zur Unreal-Engine raten, ganz bestimmt.[/Sarkasmus]

12

18.05.2013, 19:39

Ich habe ein Problem mit PreSolve. Mit folgendem Code kommt es nicht zu einer Kollision zwischen zwei Body-Rectangles, die Spielfigur kann also durch bestimmte Tiles gehen. Jedoch klappt der gleiche Code nicht wenn es zur einer Kollision zwischen einem Circle(in diesem Fall die Spielfigur) und einem Rectangle kommt, der Circle prallt einfach ganz normal am Rectangle ab und ich habe keine Ahnung woran das liegt ?(
Woran liegt das? Wie kann es sein dass der Code bei einer Rectangle-Rectangle Kollision funktioniert und nicht bei einer Circle-Rectangle Kollision?

C#-Quelltext

1
2
3
4
5
 protected override void Initialize()
        {
            base.Initialize();
            world.ContactManager.PreSolve += new PreSolveDelegate(PreSolve);
        }

C#-Quelltext

1
2
3
4
5
6
7
8
9
10
void PreSolve(Contact contact, ref Manifold oldManifold)
        {
            Fixture fixtureA = contact.FixtureA;
            Fixture fixtureB = contact.FixtureB;

            if (fixtureB.CollisionCategories == Category.Cat15)
            {
                contact.Enabled = false;
            }
        }

Spielfigur(Tennisball)

C#-Quelltext

1
2
3
4
5
6
 playerrect = BodyFactory.CreateCircle(world, 0.25f, 1.0f);
            playerrect.BodyType = BodyType.Dynamic;
            playerrect.Position = new Vector2(5.0f, 0f);
            playerrect.AngularDamping = 0.4f;
            playerrect.Restitution = 0.5f;
            playerrect.LinearVelocity = new Vector2(0, 2.0f);

Das Objekt(Münze) durch das der Ball fliegen soll:

C#-Quelltext

1
2
3
4
reccoin = BodyFactory.CreateRectangle(world, 0.64f, 0.64f, 1.0f);
            reccoin.BodyType = BodyType.Static;
            reccoin.Position = new Vector2(5.0f, 3.16f);
            reccoin.CollisionCategories = Category.Cat15;

13

18.05.2013, 20:40

Hallo,

ich habe es in meinem Spiel so gelöst, dass meine Sterne(in deinen Fall die Münzen) einfach Sensoren sind. Dadurch wird eine Kollision im ContactListener erkannt, hat aber keinen Einfluss auf ein DynamicBody. Das muss man allerdings dem Fixture deines Coins mitteilen.

Also "einfach" für dein Fixture deines Münzen-Bodys folgende Zeile hinzufügen:

C#-Quelltext

1
f.IsSensor = true;

Wie BlueCobold schon geschrieben hat, solltest du noch einen ContactListener deinem world Objekt hinzufügen.

BlueCobold

Community-Fossil

Beiträge: 10 738

Beruf: Teamleiter Mobile Applikationen & Senior Software Engineer

  • Private Nachricht senden

14

18.05.2013, 21:32

Bei einer der beiden gibst Du eine CollisionCategory an, bei der anderen nicht.
Teamleiter von Rickety Racquet (ehemals das "Foren-Projekt") und von Marble Theory

Willkommen auf SPPRO, auch dir wird man zu Unity oder zur Unreal-Engine raten, ganz bestimmt.[/Sarkasmus]

15

18.05.2013, 23:01

Bei einer der beiden gibst Du eine CollisionCategory an, bei der anderen nicht.

Ich habe bei beiden eine CollisionCategory angegeben. Ich habe hier aber nur den Fall angegeben der nicht funktioniert hat.Der Body "playerrect" ist der Ball und ich habe ihn keiner Kategorie zugeordnet. Die Münze "reccoin" habe ich einer Kategorie zugeordnet, jedoch wird die Zeile " contact.Enabled = false;" nie ausgelöst :(

Ich habe das mit dem Sensor ausprobiert, und da funktioniert es. Der Ball fliegt durch das Rectangle. Ich weiss aber nicht wie ich das reccoin löschen kann sobald es berührt wurde. Bei einer Kollision zwischen Ball und Münzen soll die jeweilige Münze vom Bildschirm entfernt werden. In welcher Methode muss ich das tun wenn ich mit einem Sensor arbeite? Muss ich die Münzen in OnCollision entfernen?

BlueCobold

Community-Fossil

Beiträge: 10 738

Beruf: Teamleiter Mobile Applikationen & Senior Software Engineer

  • Private Nachricht senden

16

19.05.2013, 10:20

Du darfst Objekte nicht während des Solvings aus der World entfernen. Du musst das irgendwie anders lösen, indem Du z.B. eine "to-delete"-Liste einführtst, die die Objekte nach dem World-Step entfernt.
Teamleiter von Rickety Racquet (ehemals das "Foren-Projekt") und von Marble Theory

Willkommen auf SPPRO, auch dir wird man zu Unity oder zur Unreal-Engine raten, ganz bestimmt.[/Sarkasmus]

17

19.05.2013, 10:23

Benutzt du jetzt einen ContactListener? Wenn nein, dann füge einen bitte hinzu :) Bei dem ContactListener gibt es dann die Methode BeginContact, wo du dein Coin "entfernen" kannst. Um zu wissen welches Objekt hinter dem Fixture steckt, solltest du bei den Bodies noch die UserData setzen.

18

19.05.2013, 14:46

Benutzt du jetzt einen ContactListener? Wenn nein, dann füge einen bitte hinzu :) Bei dem ContactListener gibt es dann die Methode BeginContact, wo du dein Coin "entfernen" kannst. Um zu wissen welches Objekt hinter dem Fixture steckt, solltest du bei den Bodies noch die UserData setzen.

Nein. Ich hatte nur PreSolve in Game1 eingebaut und nicht den ContactListener. Ich habe jetzt mal versucht den ContactListener einzubauen, jedoch bekomme ich das nicht richtig hin :( Ich habe versucht es so ähnlich wie im box2d manual zu machen, jedoch bekomme ich immer zwei Fehlermeldungen. Außerdem weiss ich nicht wie ich den ContactListener in Game1 benutzen soll ?(
Die erste Fehlermeldung kommt in Zeile 1:
The type or namespace name 'ContactListener' could not be found (are you missing a using directive or an assembly reference?)
Die zweite kommt in Zeile 24:
The type or namespace name 'ContactImpulse' could not be found (are you missing a using directive or an assembly reference?)

ContactListener:

C#-Quelltext

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
class MyContactListener: ContactListener
    {
        void BeginContact(Contact contact)

        { /* handle begin event */ }


        void EndContact(Contact contact)

        { /* handle end event */ }


         void PreSolve(Contact contact, ref Manifold oldManifold)
        {
          Fixture fixtureA = contact.FixtureA;
          Fixture fixtureB = contact.FixtureB;

          if (fixtureB.CollisionCategories == Category.Cat10)
          {
            contact.Enabled = false;
          }
        }

        void PostSolve(Contact contact, ref ContactImpulse impulse)

       { /* handle post-solve event */ }

    }

19

19.05.2013, 15:30

Ich will dir ja nicht den ganzen Spaß der Fehler-und Problemlösung nehmen ;) Gucke dir aber mal die Fehlermeldung genauer an.

Ich bin mir nicht sicher, aber es sollte in der Manual auch stehen was du mit deinem ContactListener machen sollst. Dann schaue dir noch gleich an, was es mit diesen UserData eines Bodys auf sich hat.

Ich muss vielleicht auch dazu sagen, dass ich zwar schon mit Box2D aber nicht mit Farseer gearbeitet habe.

20

19.05.2013, 19:33

UserData braucht man doch nur wenn ein Body aus mehreren Fixtures besteht, oder? Also bei einem Gegenstand der aus mehreren Teilen besteht. Bei meinem Beispiel(Münzen und Ball) besteht ja kein Body aus mehreren Fixtures, also brauche ich UserData doch auch nicht, oder?

Werbeanzeige