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

1

17.05.2013, 10:18

C# Kollision zwischen Body(Farseer) und Rectangle möglich?

Ich weiss nicht was ich tun soll damit meine Spielfigur(Mario) Münzen einsammeln kann die im Level verstreut rumliegen. Das Problem ist dass ich keine Kollision zwischen einem Body(Mario) und Rectangles(Münzen) hinbekomme :(
Ich wollte das Problem so lösen:
Ich erstelle auch ein Rectangle für Mario das sich an der gleichen Position befindet wie der Farseer Body, nur mit dem Unterschied dass das Rectangle nicht gezeichnet wird. Der Farseer Body wäre dann für die Physik zuständig, und das Rectangle für normale Kollisionen zwischen zwei Rectangles.

Ich habe das so wie beschrieben versucht, jedoch befindet sich das Mario Rectangle nie an der gleichen Position wie der Mario Body :( Außerdem müsste es doch eine bessere Lösung geben. Ich habe die Münzen die Mario einsammeln kann nicht also Body sondern Rectangle erstellt, da ich nicht möchte dass Mario an den Münzen abprallt.
Wäre es auch möglich die Münzen als Body zu erstellen ohne dass Mario daran abprallt? Mario soll die Münzen ja nur einsammeln und nicht daran abprallen.

BlueCobold

Community-Fossil

Beiträge: 10 738

Beruf: Teamleiter Mobile Applikationen & Senior Software Engineer

  • Private Nachricht senden

2

17.05.2013, 10:22

Du kannst sie trotzdem als Bodies erstellen und im Kollisions-Handler sagen, dass keine Kollision stattfindet. Genau so machen wir das mit dem Ball und den Zielen in Rickety Racquet (siehe Signatur).
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]

3

17.05.2013, 13:03

Mit folgendem Code kann ich jetzt durch die Münzen laufen(Cat5 sind normale Tiles, Cat10 sind Münzen):

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
private bool isOnGround;

        bool Player_OnCollision(Fixture fixtureA, Fixture fixtureB, FarseerPhysics.Dynamics.Contacts.Contact contact)
        {
            if (fixtureB.CollisionCategories == Category.Cat5)
            {
                  isOnGround = true;
            }

            if (fixtureB.CollisionCategories == Category.Cat10)
            {
                fixtureB.IgnoreCollisionWith(fixtureA);
            }
            return true;
        }

        void Player_OnSeparation(Fixture fixtureA, Fixture fixtureB)
        {
            if (fixtureB.CollisionCategories == Category.Cat5)
            {
                isOnGround = false;
            }
        }


Jedoch tritt noch ein eigenartiges Problem auf das ich nicht lösen kann. Und zwar wird die Spielfigur bei Berührung mit einer Münze für eine kurze Zeit viel langsamer(bleibt wahrscheinlich sogar für ein paar Millisekunden stehen), bevor sich die Spielfigur wieder normal bewegt. Weiss zufällig jemand woran das liegt?

Schorsch

Supermoderator

Beiträge: 5 145

Wohnort: Wickede

Beruf: Softwareentwickler

  • Private Nachricht senden

4

17.05.2013, 13:24

Bei dem Geschwindigkeitsproblem kann ich dir zwar nicht groß helfen, aber bei dem Problem mit dem Rechteck. Du bewegst zwar den Spieler, aber dadurch wird nicht automatisch das Rechteck bewegt. Du könntest jedes mal wenn du den Spieler bewegst, selbst das Rechteck mit bewegen. Andererseits könntest du das Rechteck natürlich auch jedes mal zur Laufzeit neu erstellen. Ich würde eher ersteres empfehlen, da hier nicht jedes mal erst Speicher geholt werden muss. Einfach nur beachten, dass die Werte vom Rechteck und die vom Spieler nicht verknüpft sind.
„Es ist doch so. Zwei und zwei macht irgendwas, und vier und vier macht irgendwas. Leider nicht dasselbe, dann wär's leicht.
Das ist aber auch schon höhere Mathematik.“

BlueCobold

Community-Fossil

Beiträge: 10 738

Beruf: Teamleiter Mobile Applikationen & Senior Software Engineer

  • Private Nachricht senden

5

17.05.2013, 13:30

Ich würde es genau andersrum machen. Ich würde das Rechteck dort platzieren, wo der physische Körper des Spieler ist.

Was da mit der Bewegung des Objekts los ist, kann ich nicht beurteilen.
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]

6

17.05.2013, 13:43

Ich mache jetzt alles mit Bodies und ohne normale Rectangles. Ich finde es einfacher alles mit Bodies zu machen wenn es möglich ist.
Reicht das "fixtureB.IgnoreCollisionWith(fixtureA);" aus damit es nicht zu einer richtigen Kollision(mit abprallen) kommen kann oder muss ich noch was an meinem Code ändern?

BlueCobold

Community-Fossil

Beiträge: 10 738

Beruf: Teamleiter Mobile Applikationen & Senior Software Engineer

  • Private Nachricht senden

7

17.05.2013, 14:38

Weiß nicht, wir machen im PreSolve da ein contact->SetEnabled(false).
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]

8

17.05.2013, 14:50

Wann braucht man eigentlich dieses PreSolve? Braucht man Player_OnCollision nicht wenn man mit PreSolve arbeitet, oder hat man dann beides?
Ich habe zwar noch nicht mit PreSolve gearbeitet, jedoch habe ich das bis jetzt so verstanden:
In PreSolve kann man einige Standard-Einstellungen ändern. Würde ich das tun dann würde Player_OnCollision bei mir anders arbeiten, also nicht mehr mit den Standard-Einstellungen, sondern mit denen die in PreSolve festgelegt wurden.

Oder liege ich da komplett falsch?

BlueCobold

Community-Fossil

Beiträge: 10 738

Beruf: Teamleiter Mobile Applikationen & Senior Software Engineer

  • Private Nachricht senden

9

17.05.2013, 15:21

Das hat damit eigentlich nix zu tun. PreSolve wird halt augerufen bevor (pre-) die eigentliche Kollisionsberechnung (solve) stattfindet. Da kann man entweder noch was mit dem Objekt anstellen oder die Kollision komplett unterbinden. Bei "onCollision" ist es schon zu spät, da wird man benachrichtigt, wenn die Kollision tatsächlich schon als stattfindend angesehen und berechnet wird.
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]

10

18.05.2013, 00:07

Ich habe jetzt mal folgende Methode erstellt(keine Ahnung ob das richtig ist):

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.Cat10)
          {
            contact.Enabled = false;
          }
        }

Ich habe aber keine Ahnung wann und wie ich die Methode aufrufen soll ?( Ich wollte sie immer in der Update-Methode aufrufen, jedoch weiss ich nicht was ich da in den Klammern eingeben soll:

C#-Quelltext

1
2
3
4
5
6
7
8
protected override void Update(GameTime gameTime)
        {
            float elapsed = (float)gameTime.ElapsedGameTime.TotalSeconds;
            world.Step(Math.Min(elapsed, (1f / 60f)));
            PreSolve(???,???);

         ...
        }

Wie kann ich die PreSolve-Methode aufrufen damit bei allen Münzen-Bodies(befinden sich in Category.Cat10) die Kollision unterbunden wird?

Werbeanzeige