polkom21 Temat założony przez niniejszego użytkownika |
[sfml + box2d] Dziwny błąd mimo że tak jest w manualu » 2012-12-27 20:53:58 Witajcie. Otóż mam taki kod: #include <SFML/Graphics.hpp> #include <Box2D/Box2D.h>
const float M = 64.0; const float P = 1.0 / 40.0;
int main( int argc, char ** argv ) { B2_NOT_USED( argc ); B2_NOT_USED( argv ); b2Vec2 gravity( 0.0f, 9.8f ); b2World * world = new b2World( gravity ); sf::RenderWindow okno( sf::VideoMode( 800, 600, 32 ), "Testowe okno" ); okno.setFramerateLimit( 100 ); sf::Texture player_img; if( !player_img.loadFromFile( "player.bmp" ) ) return EXIT_FAILURE; sf::Sprite player( player_img ); b2BodyDef playerbody; playerbody.type = b2_dynamicBody; playerbody.position.Set( 500, 200 ); b2Body * body = world->CreateBody( & playerbody ); b2PolygonShape playerShape; playerShape.SetAsBox( 40 / 2 * P, 40 / 2 * P ); b2FixtureDef fixture; fixture.density = 0.5; fixture.friction = 0.7; fixture.shape = & playerShape; b2Fixture * myfixture = playerbody->CreateFixture( & fixture ); while( okno.isOpen() ) { sf::Event zdarzenie; while( okno.pollEvent( zdarzenie ) ) { if( zdarzenie.type == sf::Event::Closed || sf::Keyboard::isKeyPressed( sf::Keyboard::Escape ) ) { okno.close(); } } if( sf::Keyboard::isKeyPressed( sf::Keyboard::Left ) ) player.move( - 1, 0 ); if( sf::Keyboard::isKeyPressed( sf::Keyboard::Right ) ) player.move( 1, 0 ); okno.clear( sf::Color( 0, 0, 255 ) ); world->Step( 1 / 60, 6, 2 ); b2Vec2 bodyPos = body->GetPosition(); b2Vec2 bodySiz = b2Vec2( 40 * P, 40 * P ); player.setPosition( bodyPos.x - bodySiz.x, bodyPos.y - bodySiz.y ); okno.draw( player ); okno.display(); } delete world; return 0; }
i błąd mam w linijce: b2Fixture* myfixture = playerbody->CreateFixture(&fixture); i mam coś takiego: base operand of '->' has non-pointer type 'b2BodyDef' i nie wiem jak to rozwiązać :P Takie dodatkowe pytanie. Jak wdrożyć w box2d sterowanie? |
|
Mike148 |
» 2012-12-27 21:02:10 Operatora "->" używasz przy wskaźnikach. Normalnie używasz "." do odwoływania się do pól klasy i nie możesz tego mieszać Np. b2BodyDef playerbody; playerbody.type = b2_dynamicBody;
lub b2BodyDef * playerbody = new b2BodyDef; playerbody->type = b2_dynamicBody;
|
|
polkom21 Temat założony przez niniejszego użytkownika |
» 2012-12-27 21:02:47 Ale to jest w ogóle chore te box2d mam w manualu przykład z tym CreateFixture a tu mi pokazuje że nie ma czegoś takiego: 'struct b2BodyDef' has no member named 'CreateFixture' co zrobić? |
|
Mike148 |
» 2012-12-27 21:12:10 Daj linka do tego manuala |
|
polkom21 Temat założony przez niniejszego użytkownika |
» 2012-12-27 21:21:38 No toć to jest na ich stronie głównej. http://box2d.org/manual.pdfDobra to już chyba mam nie do tego się odwołałem ale teraz mam taki błąd: request for member 'CreateFixture' in 'body', which is of non-class type 'b2Body*' a kod: #include <SFML/Graphics.hpp> #include <Box2D/Box2D.h>
const float M = 64.0; const float P = 1.0 / 40.0;
int main( int argc, char ** argv ) { B2_NOT_USED( argc ); B2_NOT_USED( argv ); b2Vec2 gravity( 0.0f, 9.8f ); b2World * world = new b2World( gravity ); sf::RenderWindow okno( sf::VideoMode( 800, 600, 32 ), "Testowe okno" ); okno.setFramerateLimit( 100 ); sf::Texture player_img; if( !player_img.loadFromFile( "player.bmp" ) ) return EXIT_FAILURE; sf::Sprite player( player_img ); b2BodyDef playerbody; playerbody.type = b2_dynamicBody; playerbody.position.Set( 500, 200 ); b2Body * body = world->CreateBody( & playerbody ); b2PolygonShape playerShape; playerShape.SetAsBox( 40 / 2 * P, 40 / 2 * P ); b2FixtureDef fixture; fixture.density = 0.5; fixture.friction = 0.7; fixture.shape = & playerShape; body.CreateFixture( & fixture ); while( okno.isOpen() ) { sf::Event zdarzenie; while( okno.pollEvent( zdarzenie ) ) { if( zdarzenie.type == sf::Event::Closed || sf::Keyboard::isKeyPressed( sf::Keyboard::Escape ) ) { okno.close(); } } if( sf::Keyboard::isKeyPressed( sf::Keyboard::Left ) ) player.move( - 1, 0 ); if( sf::Keyboard::isKeyPressed( sf::Keyboard::Right ) ) player.move( 1, 0 ); okno.clear( sf::Color( 0, 0, 255 ) ); world->Step( 1 / 60, 6, 2 ); b2Vec2 bodyPos = body->GetPosition(); b2Vec2 bodySiz = b2Vec2( 40 * P, 40 * P ); player.setPosition( bodyPos.x - bodySiz.x, bodyPos.y - bodySiz.y ); okno.draw( player ); okno.display(); } delete world; return 0; }
Aaa i jeszcze jedno. Czy to normalne, żeby takie coś prostego brało aż tyle pamięci? (11625 K) |
|
DejaVu |
» 2012-12-28 03:23:44 Postaraj się przeczytać błąd ze zrozumieniem, a nie zadajesz pytania do losowo sklejanych linijek kodu... niecały miesiąc temu czytałem tutorial Box2D i jakoś krok po kroku udało mi się złożyć aplikację 'do kupy'. Może warto przeczytać go, a nie sklejać kod na 'hura'? |
|
ridic14 |
» 2012-12-28 10:27:22 Postaraj się dobrze opanować C++? Dobrze ci ktoś powiedział: Operatora "->" używasz przy wskaźnikach. Normalnie używasz "." do odwoływania się do pól klasy i nie możesz tego mieszać Np.
b2BodyDef playerbody; playerbody.type = b2_dynamicBody;
lub
b2BodyDef * playerbody = new b2BodyDef; playerbody->type = b2_dynamicBody;
|
czyli w twoim kodzie: b2BodyDef playerbody; zamień na b2BodyDef* playerbody; * oznacza że to wskaźnik czyli do jakichkolwiek metod tej zmiennej używasz -> dlatego potrzebne jest znać C++. Czyli tak naprawdę odpowiedź miałeś w pierwszym poście:) |
|
polkom21 Temat założony przez niniejszego użytkownika |
» 2012-12-28 17:54:04 Szczerze to już nic nie rozumiem z tego całego box2d. Z tego co udało mi się wyczytać to żeby za cokolwiek się zabrać to muszę mieć stworzony świat a więc zabieram się do pracy i tworzę coś takiego jak jest w manualu: #include <SFML/Graphics.hpp> #include <Box2D/Box2D.h> #include <iostream>
int main( int argc, char ** argv ) { B2_NOT_USED( argc ); B2_NOT_USED( argv ); bool doSleep = true; b2Vec2 gravity( 0, 9.8f ); b2World * myWorld = new b2World( gravity, doSleep ); float32 timeStep = 1.0f / 60.f; int32 velocityIterations = 10; int32 positionIterations = 8; sf::RenderWindow okno( sf::VideoMode( 800, 600, 32 ), "Testowe okno" ); okno.setFramerateLimit( 100 ); sf::Texture player_img; if( !player_img.loadFromFile( "player.bmp" ) ) return EXIT_FAILURE; sf::Sprite player( player_img ); while( okno.isOpen() ) { sf::Event zdarzenie; while( okno.pollEvent( zdarzenie ) ) { if( zdarzenie.type == sf::Event::Closed || sf::Keyboard::isKeyPressed( sf::Keyboard::Escape ) ) { okno.close(); } } if( sf::Keyboard::isKeyPressed( sf::Keyboard::Left ) ) player.move( - 1, 0 ); if( sf::Keyboard::isKeyPressed( sf::Keyboard::Right ) ) player.move( 1, 0 ); myWorld->ClearForces(); myWorld->Step( timeStep, velocityIterations, positionIterations ); player.setPosition( 100, 100 ); okno.clear( sf::Color( 0, 0, 255 ) ); okno.draw( player ); okno.display(); } delete myWorld; return 0; }
i na dzień dobry mam error: no matching function for call to 'b2World::b2World(b2Vec2&, bool&)' Czy ten manual nie mógł być prosto napisany, żeby nie było żadnego problemu? Czy to możliwe, że mam takie problemy bo mam werjsę 2.2.1? Każdy tutorial, który tylko znajdę w internecie to jest wielki problem, bo mam najnowszą wersję a pisane są one na starsze wersje. Jak by mi zaczęła działać podstawa taka jak grawitacja to z resztą jakoś już bym doszedł do ładu co z czym się je. |
|
« 1 » 2 |