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

11

07.08.2013, 21:07

Vielleicht wären noch zusätzliche Informationen zu einem Objekt in der Liste entities sinnvoll:
Erzeugt werden sie in einer Schleife, mit folgendem Code als Inhalt:

C-/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
29
30
31
32
33
34
35
36
37
38
Object entity;
entity.a=y*10+x;
const float tmpX=sf::VideoMode::getDesktopMode().width - sf::VideoMode::getDesktopMode().width*.1f;
const float tmpY=sf::VideoMode::getDesktopMode().height- sf::VideoMode::getDesktopMode().height*.535;

entity.fixture.isSensor=true;

InitObj(entity, *world, sf::Vector2f(tmpX*.075f, tmpY*.125f), sf::Color(145, 60, 230), false, b2Vec2((sf::VideoMode::getDesktopMode().width*.1f + tmpX*.077f*x + 150.52f)/30.f, (sf::VideoMode::getDesktopMode().height*.11625 + tmpY*.133f*y)/30.f), 1.f, 1.8f, true);

b2FixtureDef fixture;
fixture.density=1.8f;
fixture.friction=0.8f;
fixture.restitution=1.f;
fixture.shape=entity.body->GetFixtureList()->GetShape();
entity.body->CreateFixture(&fixture);

entities.push_back(entity);

//InitObj:
void InitObj(Object &Paddle, b2World &world, const sf::Vector2f size, const sf::Color col, bool dynamic, const b2Vec2 pos, const float32 rest, const float dens, bool usData)
{
    Paddle.shape.setSize(size);
    Paddle.shape.setFillColor(col);
    Paddle.shape.setOrigin(size.x/2.f, size.y/2.f);
    Paddle.bodyDef.type = (dynamic)?(b2_dynamicBody):(b2_staticBody);
    Paddle.bodyDef.fixedRotation = true;
    Paddle.bodyDef.position.Set(pos.x, pos.y);
    if(usData)
        Paddle.bodyDef.userData = &Paddle;
    Paddle.body = world.CreateBody(&Paddle.bodyDef);
        b2PolygonShape box;
        box.SetAsBox(size.x/2.f/30.f, size.y/2.f/30.f);
        Paddle.fixture.shape = &box;
    Paddle.fixture.density = dens;
    Paddle.fixture.friction= 0.8f;
    Paddle.fixture.restitution = rest;
    Paddle.body->CreateFixture(&Paddle.fixture);
}

crap?

MfG
Check

BlueCobold

Community-Fossil

Beiträge: 10 738

Beruf: Teamleiter Mobile Applikationen & Senior Software Engineer

  • Private Nachricht senden

12

08.08.2013, 06:42

Paddle.bodyDef.userData = &Paddle;
Das verwirrt mich irgendwie. Das ist eine Adresse auf ein Objekt im Stack und auch dein push_back nimmt die Adresse im Stack. Ich hoffe Du hast Spaghetti-Code, sonst kommt da ziemlicher Unfug bei raus.
Außerdem erzeugst Du zwei Fixtures mit dem selben Shape, ohne dass die irgendwie einen Zusammenhang haben. Warum?
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]

13

08.08.2013, 15:20

Ja ich habe Spaghetticode. "Alles" in der int main() drin. :D
Ich muss wissen, ob damit kollidiert wurde. Also isSensor = true und die userData reingehauen. Das klappt auch ziemlich gut. Betreffende Funktionen bei Kollision werden aufgerufen und fügen der killingList das Objekt hinzu bzw den Key zum Objekt.
Dadurch dass isSensor=true ist, gibt es keine Kollisionen mehr. Somit erzeuge ich eine exakte Kopie der Fixture nur mit isSensor=false und dementsprechend auch ohne userData.

MfG
Check

BlueCobold

Community-Fossil

Beiträge: 10 738

Beruf: Teamleiter Mobile Applikationen & Senior Software Engineer

  • Private Nachricht senden

14

08.08.2013, 15:35

Du brauchst keinen separaten Sensor, um Dich über Kollisionen informieren zu lassen. Das geht auch mit einem ContactListener. Ein Sensor ist dann sinnvoll, wenn außer der Berührung nichts weiter passieren soll (auch wenn sich das auch anders lösen lässt). Bei dir soll es ja aber trotzdem kollidieren und daher ist das zweite Fixture total überflüssig.
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

08.08.2013, 16:10

Heißt ich muss nur die userData setzen? lol.
Weil ich das Ganze schon mit einem ContactListener mache...
//
Wird alles korrekt ausgeführt, der Ball prallt schön im besagtem, ungewolltem 90° Winkel ab. Adé b2Fixture Nummer 2
Lustigerweise habe ich nun den Fehler gefunden, den ich vorher eigentlich auch schon gefunden, nur anscheinend nicht ganz realisiert hatte: Es wird immer der letzte b2Body gelöscht. Der ist dann auch wirklich weg, keine Kollision etc.pp.
Deswegen ein dickes Danke! Den Rest sollte ich ja wohl alleine hinbekommen, bin ich ja nun von meiner Blindheit erlöst. :crazy:

MfG
Check

Dieser Beitrag wurde bereits 2 mal editiert, zuletzt von »Checkmateing« (08.08.2013, 16:29)


Werbeanzeige