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

[sfml + box2d] Dziwny błąd mimo że tak jest w manualu

Ostatnio zmodyfikowano 2012-12-30 13:34
Autor Wiadomość
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:
C/C++
#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 );
   
    // Ladowanie grafiki gracza
    sf::Texture player_img;
    if( !player_img.loadFromFile( "player.bmp" ) )
         return EXIT_FAILURE;
   
    sf::Sprite player( player_img );
    // Symulacja gracza
    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 );
   
    //Glowna petla gry
    while( okno.isOpen() )
    {
        // Sprawdzanie wcisnietych klawiszy
        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 );
       
        // Wyswietlanie i symulacja
        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?
P-72132
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.

C/C++
b2BodyDef playerbody;
playerbody.type = b2_dynamicBody;

lub

C/C++
b2BodyDef * playerbody = new b2BodyDef;
playerbody->type = b2_dynamicBody;
P-72133
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ć?
P-72134
Mike148
» 2012-12-27 21:12:10
Daj linka do tego manuala
P-72135
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.pdf
Dobra 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:
C/C++
#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 );
   
    // Ladowanie grafiki gracza
    sf::Texture player_img;
    if( !player_img.loadFromFile( "player.bmp" ) )
         return EXIT_FAILURE;
   
    sf::Sprite player( player_img );
    // Symulacja gracza
    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 );
   
    //Glowna petla gry
    while( okno.isOpen() )
    {
        // Sprawdzanie wcisnietych klawiszy
        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 );
       
        // Wyswietlanie i symulacja
        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)
P-72137
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'?
P-72158
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.

C/C++
b2BodyDef playerbody;
playerbody.type = b2_dynamicBody;
lub

C/C++
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:)
P-72161
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:
C/C++
#include <SFML/Graphics.hpp>
#include <Box2D/Box2D.h>
#include <iostream>

int main( int argc, char ** argv )
{
    B2_NOT_USED( argc );
    B2_NOT_USED( argv );
   
    // Tworzenie swiata
    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 );
   
    // Ladowanie grafiki gracza
    sf::Texture player_img;
    if( !player_img.loadFromFile( "player.bmp" ) )
         return EXIT_FAILURE;
   
    sf::Sprite player( player_img );
   
    // Symulacja gracza
   
   
    //Glowna petla gry
    while( okno.isOpen() )
    {
        // Sprawdzanie wcisnietych klawiszy
        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 );
       
        // Wyswietlanie i symulacja
        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.
P-72203
« 1 » 2
  Strona 1 z 2 Następna strona