3

I'm having a few problems with Eclipse's C++ parser. I've been using it with Emscripten and found the code completion, call hierarchy, documentation popup, code analysis and related features to be very useful, but it's been bothering me that the parser isn't totally working. Especially with this new problem with using vectors.


The first parsing error is on std::vector<SDL_Rect> box; with the error being:

Symbol 'vector' could not be resolved

And then on emscripten_set_main_loop(game_loop, 60, 1); I get this error:

Function 'usleep' could not be resolved

Here's the full code:

#include <stdio.h>
#include <stdlib.h>
#include <SDL/SDL.h>
#include <SDL/SDL_image.h>
#include <emscripten.h>
#include <stdarg.h>
#include <libcxx/vector>

///GLOBAL VARIABLES
SDL_Surface* bitmap;
SDL_Surface* screen;
SDL_Rect source;
SDL_Rect destination;

///second sprite
SDL_Surface* bitmap2;
SDL_Rect source2;
SDL_Rect destination2;

/// Side Scrolling variables:
SDL_Rect camera;
SDL_Rect offset;
SDL_Rect offset2;

int level_width = 480 * 5;
int level_height = 640;

bool gameRunning = true;

class buttonpresses {
public:
    bool leftButton;
    bool rightButton;
    bool jumpButton;

};

int movementspeed = 5;
int jumpspeed = 2;
bool jumpenabled = false;
int jumpduration = 0;
int maxjump = 20;

int leftmomentum = 1;
int rightmomentum = 1;

int lastdestination;
int countDestination = 0;

int maxmomentum = 5;

buttonpresses charactermovement;

/// Collision detection
std::vector<SDL_Rect> box;

///MAIN LOOP
void game_loop() {
    // EVENT HANDLING
    SDL_PumpEvents();
    Uint8 *keystate = SDL_GetKeyboardState(NULL);

    if (keystate[SDLK_ESCAPE]) {
        gameRunning = false;
        printf("Game Stopping!!!!!!\n");
        SDL_Quit();
        exit(0);
    }

    if (keystate[SDLK_LEFT]) {
//     printf("Left Key\n");
        charactermovement.leftButton = true;
    }
    if (keystate[SDLK_LEFT] == false) {
        charactermovement.leftButton = false;
    }
    if (keystate[SDLK_RIGHT]) {
//     printf("Right Key\n");
        charactermovement.rightButton = true;
    }
    if (keystate[SDLK_RIGHT] == false) {
        charactermovement.rightButton = false;
    }
    if (keystate[SDLK_SPACE]) {
//     printf("Space Key\n");
        charactermovement.jumpButton = true;
    }
    if (keystate[SDLK_SPACE] == false) {
        charactermovement.jumpButton = false;
    }

//        printf("Game Running..\n");

// LOGIC

    //character movement
    if (charactermovement.rightButton) {
        destination.x = destination.x + movementspeed;
    }
    if (charactermovement.leftButton) {
        destination.x = destination.x - movementspeed;
    }
    if (charactermovement.jumpButton && jumpenabled) {
        destination.y = destination.y - jumpspeed;
        jumpduration++;
    }
    destination.x = destination.x + rightmomentum - leftmomentum;

    if (destination.y >= 200) {
        jumpenabled = true;

//  printf ("jump enabled\n");
    }
    if (jumpduration >= maxjump) {
        jumpenabled = false;
    }
    if (destination.y >= 200) {
//  printf ("destination y:");
//  printf ("%d\n", destination.y);

        jumpduration = 0;
    }
//if (jumpenabled != true){
//  printf ("jump disabled\n");
//}
//if (jumpenabled == true){
//  printf ("jump enabled\n");
//  printf ("jump duration: ");
//  printf ("%d\n", jumpduration);
//}

//momentum
    //save position every 5 interations
    if (countDestination > 5) {
        lastdestination = destination.x;
        countDestination = 0;
    } else {
        countDestination++;
    }

//printf ("last location: ");
//printf ("%d\n", destination.x);
//
//printf ("current location: ");
//printf ("%d\n", lastdestination);

    // increase momentum in direction your moving in (relative to previous location)
    if (lastdestination > destination.x) {
//  printf ("right if running \n ");
        if (rightmomentum > 0) {
            rightmomentum--;
        } else if (leftmomentum < maxmomentum) {
            leftmomentum++;
        }
    }
    if (lastdestination < destination.x) {
//  printf ("left if running \n ");
        if (leftmomentum > 0) {
            leftmomentum--;
        } else if (rightmomentum < maxmomentum) {
            rightmomentum++;
        }
    }
    if (lastdestination == destination.x) {
        if (leftmomentum > 0) {
            leftmomentum--;
        }
        if (rightmomentum > 0) {
            rightmomentum--;
        }
    }

    printf("left momentum: ");
    printf("%d\n", rightmomentum);
    printf("right momentum: ");
    printf("%d\n", leftmomentum);

    //gravity
    if (destination.y <= 200) {
        destination.y++;
    }
    offset.x = destination.x - camera.x;
    offset2.x = destination2.x - camera.x;
    offset.y = destination.y - camera.y;
    offset2.y = destination2.y - camera.y;

    // RENDERING
    SDL_FillRect(screen, NULL, SDL_MapRGB(screen->format, 0, 0, 0));
    SDL_BlitSurface(bitmap, &source, screen, &offset);

    // RENDER SECOND SPRITE
    SDL_BlitSurface(bitmap2, &source2, screen, &offset2);

    //blank screen
    SDL_Flip(screen);
    camera.x++;
}

int main() {
    SDL_Init( SDL_INIT_VIDEO);

    // LOAD FILES
    bitmap = IMG_Load("ninjagaiden3sheet1.png");
    screen = SDL_SetVideoMode(640, 480, 0, SDL_HWSURFACE | SDL_DOUBLEBUF);
    /// camera variables
    camera.x = 0;
    camera.y = 0;
    camera.w = 640;
    camera.h = 480;
    /// end camera variables

    // Part of the bitmap that we want to draw

    source.x = 37;
    source.y = 4;
    source.w = 17;
    source.h = 32;

    // Part of the screen we want to draw the sprite to

    destination.x = 100;
    destination.y = 100;
    destination.w = 65;
    destination.h = 44;

    //// second sprite
    bitmap2 = IMG_Load("bat_transparent.png");
    source2.x = 24;
    source2.y = 63;
    source2.w = 65;
    source2.h = 44;

    destination2.x = 940;
    destination2.y = 100;
    destination2.w = 65;
    destination2.h = 44;
    //// end second sprite

    lastdestination = destination.x;

    offset = destination;
    offset2 = destination2;

    charactermovement.leftButton = false;
    charactermovement.rightButton = false;
    charactermovement.jumpButton = false;

    //START MAIN LOOP
    emscripten_set_main_loop(game_loop, 60, 1);

    return 0;
}

My includes tab for C++ in the "Paths and Symbols" properties looks like:

C:\Program Files\Emscripten\emscripten\1.12.0\system\include
C:\Program Files\Emscripten\emscripten\1.12.0\system\include\libc
C:\Program Files\Emscripten\emscripten\1.12.0\system\include\emscripten
C:\Program Files\Emscripten\emscripten\1.12.0\system\include\libcxx

In the Indexer settings I have the following enabled:

  • Index source files not included in the build
  • Index unused headers
  • Index all header variants
  • Index source and header files opened in editor
  • Allow heuristic resolution of includes
  • Skip files larger than: 8 MB

Does anyone know what's going on? Or what I can do to fix it?

Update:

I've fixed the error on parsing std::vector. It turns out that some of llvm/clang libraries use _LIBCPP_BEGIN_NAMESPACE_STD and _LIBCPP_END_NAMESPACE_STD definitions instead of using namespace std; and those defines are invisible to the parser unless __clang__ is defined.

So the solution is to go into the "Symbols" tab for C++ in the "Paths and Symbols" properties and add:

__clang__

In the "Add" dialog that pops up just put it in the Name: input field and press OK. This will also add many of the missing std namespace functions like cout cin etc.

I haven't found a fix for the usleep/emscripten_set_main_loop issue yet but this should be good enough to get the IDE's code completion and several related features to work. Though I'm still having some weird complicated parser issues with Eclipse so I think I'm going to abandon the search for a solution here and work with NetBeans for which I think I have every thing set up.

Community
  • 1
  • 1
bobajeff
  • 131
  • 6

0 Answers0