Kłopot z klasą

TP
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 13
0

Cześć, piszę sobie moduł w C++ do modyfikacji MTA. Od razu mówię że w C++ jestem w miarę początkujący, chociaż znam Lua więc jakby ktoś chciał pomóc to proszę o dokładniejsze wytłumaczenie :)
Ok, więc problem polega na tym że zaimplementowałem do modułu (plik .dll) system fizyki bullet + język skryptowy Lua. I teraz mam problem. Stworzyłem funkcję bulletSetUp w której ustawiam dane fizyki, między innym element świata na którym będę operował.

Kopiuj
int CFunctions::bulletSetUp ( lua_State* luaVM )
{
    if ( luaVM )
    {
        btBroadphaseInterface* broadphase = new btDbvtBroadphase();
        btDefaultCollisionConfiguration* collisionConfiguration = new btDefaultCollisionConfiguration();
        btCollisionDispatcher* dispatcher = new btCollisionDispatcher(collisionConfiguration);
        btGImpactCollisionAlgorithm::registerAlgorithm(dispatcher);
        btSequentialImpulseConstraintSolver* solver = new btSequentialImpulseConstraintSolver;
        btDiscreteDynamicsWorld* dynamicsWorld = new btDiscreteDynamicsWorld(dispatcher, broadphase, solver, collisionConfiguration);
        lua_pushboolean(luaVM, true);
    return 1;
    }
lua_pushboolean(luaVM, false);
return 0;
}
 

Funkcja działa prawidłowo. Teraz druga funkcja, physicsSetGravity która odpowiada za ustawianie grawitacji w świecie.

Kopiuj
 int CFunctions::physicsSetGravity ( lua_State* luaVM )
{
    if ( luaVM )
    {
        if(dynamicsWorld == 0)
        {
            lua_pushboolean(luaVM, false);
        return 0;
        }
        CLuaArguments args;
        int data1;
        int data2;
        int data3;
        data1 = lua_tonumber ( luaVM, 1 );
        data2 = lua_tonumber ( luaVM, 2 );
        data3 = lua_tonumber ( luaVM, 3 );
      //  args.PushString("Hello World!");
        //args.PushArguments(luaVM);
        std::cout << "lolek: " << data1 << " and " << data2 << " and " << data3 << std::endl;
        dynamicsWorld->setGravity(btVector3(0, -10, 0));
        return 1;
    }
    return 0;
}

I tutaj jest już problem, ponieważ podczas kompilowania kompilator twierdzi, że zmienna dynamicsWorld nie istnieje. No w sumie ma rację, bo jest tworzona w pierwszej funkcji. Jak to rozwiązać? Z góry dzięki za pomoc.

S1
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 6
0

uczyń dynamicsWorld polem klasy.

TP
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 13
0

Zrobiłem coś takiego na górze:

Kopiuj
 class dynamicsWorld {};

I teraz wywala błąd:
D:\MTABulletPhysics\ml_devkit\ml_base\CFunctions.cpp|80|error: expected unqualified-id before '->' token|
To jest ten fragment kodu:

Kopiuj
 int CFunctions::physicsSetGravity ( lua_State* luaVM )
{
    if ( luaVM )
    {
       // if(dynamicsWorld == 0)
        //{
          //  lua_pushboolean(luaVM, false);
        //return 0;
        //}
        CLuaArguments args;
        int data1;
        int data2;
        int data3;
        data1 = lua_tonumber ( luaVM, 1 );
        data2 = lua_tonumber ( luaVM, 2 );
        data3 = lua_tonumber ( luaVM, 3 );
      //  args.PushString("Hello World!");
        //args.PushArguments(luaVM);
        std::cout << "lolek: " << data1 << " and " << data2 << " and " << data3 << std::endl;
        dynamicsWorld->setGravity(btVector3(0, -10, 0));
        return 1;
    }
    return 0;
}

Ta linijka:

Kopiuj
 dynamicsWorld->setGravity(btVector3(0, -10, 0));

Znalazłbym sam rozwiązanie, ale nie rozumiem tego błędu.

NI
  • Rejestracja: dni
  • Ostatnio: dni
  • Lokalizacja: Warszawa
  • Postów: 535
0

dynamicsworld jest wskaźnikiem czy obiektem? jak obiektem to dajesz "." a jak wskaźnikiem to dajesz "->"

TP
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 13
0

wcześniej było -> i działało dobrze. teraz zmieniłem na kropkę i jest:
error: expected unqualified-id before '.' token|

NI
  • Rejestracja: dni
  • Ostatnio: dni
  • Lokalizacja: Warszawa
  • Postów: 535
0

czekaj... zrobiłeś

Kopiuj
class dynamicsWorld{}; 

?????
wiesz, że zdefiniowałeś klasę, a nie jej obiekt i możesz się przez to odnosić tylko do statycznych metod/zmiennych, chyba, że zrobiłeś to inaczej i nie pokazałeś kodu

TP
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 13
0

tak. czyli jak mam zdefiniować obiekt? xd Wygooglowałem, ale nie mówi mi to nic

GO
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 148
0

Utworzyłeś w ogóle jakiś obiekt dynamicsWord? Bo z tego co widzę używasz "." i "->" w odniesieniu nie do obiektu lub wskaźnika tylko bezprośrednio do klasy

[edit] Byłem kilka sekund wolniejszy od użytkownika wyżej :/ obiekt definiujesz tak:

Kopiuj
typObiektu nazwaObiektu;

Czyli w Twoim przypadku piszesz tak:

Kopiuj
dynamicsWorld nazwa;
NI
  • Rejestracja: dni
  • Ostatnio: dni
  • Lokalizacja: Warszawa
  • Postów: 535
0

Człowieku wpisujesz w google c++ klasy i sprawdź sobie jak się tworzy obiekty klas... 1 min czytania i będziesz wiedział wszystko http://cpp0x.pl/kursy/Kurs-C++/Klasy-obiekty/311

NI
  • Rejestracja: dni
  • Ostatnio: dni
  • Lokalizacja: Warszawa
  • Postów: 535
0

@ThePiotrek zobaczyłeś w ten link chociaż? klasa nie jest obiektem, jest definicją, działa jak int lub string... musisz zadeklarować obiekt tej klasy:

Kopiuj
nazwa-klasy nawa-obiektu; 

i odnosić się do obiektu potem

NI
  • Rejestracja: dni
  • Ostatnio: dni
  • Lokalizacja: Warszawa
  • Postów: 535
0

1.Pisz w odpowiedziach a nie w komentarzach
2.czy ty czytasz co my do ciebie piszemy? Napisałem wyraźnie(pisze niewyraźnie ale komputer raczej nie ma takiej czcionki :P), że masz się odwoływać do obiektu klasy, a nie do klasy a więc nie:

Kopiuj
klasa.zmienna; 

tylko obiektklasy.zmienna;

Kopiuj
 i skąd masz tę funkcję setgravity? nie jest na polem klasy a więc nie możesz się do nie odwoływać przez obiekt klasy ani przez samą klasę

Zarejestruj się i dołącz do największej społeczności programistów w Polsce.

Otrzymaj wsparcie, dziel się wiedzą i rozwijaj swoje umiejętności z najlepszymi.