Panel użytkownika
Nazwa użytkownika:
Hasło:
Nie masz jeszcze konta?

[Box2d/SFML] User Data

Ostatnio zmodyfikowano 2014-06-01 21:15
Autor Wiadomość
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:
C/C++
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:

C/C++
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.

P-110054
pekfos
» 2014-05-15 21:53:53
C/C++
if( BodyIterator->GetUserData() == "Box" )
Nie możesz tak porównywać tekstów.
P-110063
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.
P-110087
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().

C/C++
boxDefs.userData = "Box";
Te przypisanie też nie wygląda poprawnie.
P-110091
PCS
Temat założony przez niniejszego użytkownika
» 2014-05-16 20:11:31
A ten sposób?
C/C++
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.
C/C++
if( strcmp(( char * ) BodyIterator->GetUserData(), "Box" ) == 0 )
P-110138
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.
P-110141
pekfos
» 2014-05-16 20:50:12
Chcialem uzyc tego w ten sposób, lecz aplikacja sié wiesza.
C/C++
if( strcmp(( char * ) BodyIterator->GetUserData(), "Box" ) == 0 )
Każdy obiekt ma w userData prawidłowego c-stringa?
P-110142
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.
P-110145
« 1 » 2
  Strona 1 z 2 Następna strona