PCS Temat założony przez niniejszego użytkownika |
[Box2d/SFML] User Data » 2014-05-15 19:56:01 Czołem, mam kolejny problem, otóż gdy chce skompilować mój program pojawia się ten o to błąd:
\...\main.cpp||In function 'void single()':| \...\main.cpp|262|warning: comparison with string literal results in unspecified behaviour [-Waddress]| \...\main.cpp||In function 'void CreateBox(b2World&)':| \...\main.cpp|380|error: invalid conversion from 'const void*' to 'void*' [-fpermissive]|
A o to kod zastosowania GetUserData: CreateBox( world );
int BodyCount = 0; for( b2Body * BodyIterator = world.GetBodyList(); BodyIterator != 0; BodyIterator = BodyIterator->GetNext() ) { if( BodyIterator->GetUserData() == "Box" ) { sf::Sprite box; WheelSprite.setTexture( boxTexture ); WheelSprite.setOrigin( box.getGlobalBounds().width / 2, box.getGlobalBounds().height / 2 ); box.setPosition( BodyIterator->GetPosition().x * SCALE, BodyIterator->GetPosition().y * SCALE ); box.setRotation( BodyIterator->GetAngle() * 180 / b2_pi ); window->draw( box ); ++BodyCount; } }
A to kod CreateBox: void CreateBox( b2World & world ) { boxDefs.position.Set( 200, - 360 ); boxDefs.type = b2_staticBody; boxDefs.userData = "Box"; boxShapes.SetAsBox( 16, 16 ); boxFixtures.density = 0.0f; boxFixtures.shape = & boxShapes; boxFixtures.friction = 1.0f; boxBodys = world.CreateBody( & boxDefs ); boxBodys->CreateFixture( & boxFixtures ); }
Dzięki z góry za pomoc. |
|
pekfos |
» 2014-05-15 21:53:53 if( BodyIterator->GetUserData() == "Box" )
|
Nie możesz tak porównywać tekstów. |
|
PCS Temat założony przez niniejszego użytkownika |
» 2014-05-15 23:46:48 Podpatrzyłem taki schemat u innych w sieci, spotykałem się z takim zapisem nie raz. Nie bardzo wiem jak to poprawić, chciałbym właśnie aby w podobny sposób nadać mojemu "sprite" dane fizyczne. |
|
pekfos |
» 2014-05-15 23:57:38 Podpatrzyłem taki schemat u innych w sieci, spotykałem się z takim zapisem nie raz. |
' == "Box"" to może i popularny 'schemat'. Problem w tym, że po lewej stronie nie może być byle co, jak tu.. W tym przypadku najlepiej pasuje strcmp(). boxDefs.userData = "Box";
|
Te przypisanie też nie wygląda poprawnie. |
|
PCS Temat założony przez niniejszego użytkownika |
» 2014-05-16 20:11:31 A ten sposób? boxDefs.userData =( void * ) "Box";
Sorka, w dalszym ciągu nie wiem w jaki sposób użyć strcmp() w moim kodzie, próbuje coś rozkminić lecz nie bardzo wychodzi. Edit: Chcialem uzyc tego w ten sposób, lecz aplikacja sié wiesza. if( strcmp(( char * ) BodyIterator->GetUserData(), "Box" ) == 0 )
|
|
DejaVu |
» 2014-05-16 20:46:55 Po pierwsze, wypadałoby sprawdzić najpierw czy userData!=nullptr. Po drugie: adres zapisywany do userData() powinien być zaalokowany dynamicznie lub odwoływać się do stałej globalnej. Mam poważne wątpliwości jaki adres będzie przypisany do pola userData, skoro de-facto tekst ten jest w zasięgu lokalnym i tym samym nie jest to definicja globalnej stałej, która miałaby z góry określony adres pamięci.
Być może standard C++ gwarantuje, że zapis, który zastosowałeś jest poprawny, ale w moim odczuciu jest on na tyle niebezpieczny, że wymaga albo weryfikacji w standardzie C++, albo zastosowania stałej globalnej. |
|
pekfos |
» 2014-05-16 20:50:12 Chcialem uzyc tego w ten sposób, lecz aplikacja sié wiesza.
if( strcmp(( char * ) BodyIterator->GetUserData(), "Box" ) == 0 )
|
Każdy obiekt ma w userData prawidłowego c-stringa? |
|
PCS Temat założony przez niniejszego użytkownika |
» 2014-05-16 21:00:09 Z tym wieszaniem to było niedopatrzenie, lecz dalej grafika nie pokrywa się z obiektem fizycznym. Każdy obiekt ma w userData prawidłowego c-stringa?
|
No tak. |
|
« 1 » 2 |