LINUX.ORG.RU

ошибка функции потока в sdl

 ,


0

1

В прошлый раз была тоже проблема с этой функцией в с++. В си нормально. В общем есть класс. чтобы использовать поток нужно создать

SDL_CreateThread ( pollevent, "pollevent", window );
В с++ это требует чтобы класс был статичным, и как то давно я пробывал что-то делать и оказалось что переменные тоже должны быть статичными. Так вот, у меня ошибка срабатывает такая.
game.cpp:87:41: ошибка: недопустимая декларация статического элемента-функции «static int Game::pollevent(void*)» [-fpermissive]
 static int Game::pollevent ( void *data )
На всякий случай для тех, кому нравиться английский язык приведу ошибку на нём.
game.cpp:87:41: error: cannot declare member function ‘static int Game::pollevent(void*)’ to have static linkage [-fpermissive]
 static int Game::pollevent ( void *data )

Ответ на: комментарий от creazero

Мне так нравиться. Смотришь на код и видишь отдельные слова, отдельные скобки, арифметические знаки, классно выглядет так. Я кстати в начале книге по с++ видел что автор так тоже писал, но потом другие примеры были уже без пробелов.

u0atgKIRznY5
() автор топика

Скажи честно, ты наркоман? Раз пишешь на плюсах, так используй std::thread. А то и вовсе SFML вместо SDL2.

Meyer ★★★★★
()

Передавай this третьим аргументом в SDL_CreateThread, в статичной функции кастуй переданный указатель к объекту и вызывай какие хочешь методы этого объекта.

unC0Rr ★★★★★
()

error: cannot declare member function

Ну так у тебя ошибка вообще с SDL не связана. Просто код неправильный.

Покажи как обьявлен класс Game (особенно его метод pollevent) и потом как данный метод определен.

KennyMinigun ★★★★★
()

Передайте ему, а то он анонимов побанил.

Ключевое слово static не пишется, если реализация метода вынесена за предела объявления класса. Короче, в файлах .cpp перед методом не пиши static.

anonymous
()
Ответ на: комментарий от u0atgKIRznY5

Можно пример в коде, а то я не совсем понимаю?

Как-то так:

class A
{
int var;
static int *thread_func(void *data);
....
}

int A::thread_func(void *data)
{
   A *_this = (A*)data;
   _this->var = 111;
.....
}

Dead ★★★★
()
Ответ на: комментарий от linuhs_user

Хотя лучше на js, там есть canvas/webgl если хочешь сам, и много движков если хочешь готовое, запутстится даже в браузере! static в примере SDL_Thread добавленна просто так, это типа private метод в С.

linuhs_user
()
Ответ на: комментарий от linuhs_user

если хочешь сам, и много движков если хочешь готовое,

Да я так, для мышления, пишу чтобы думать как такое можно написать.

u0atgKIRznY5
() автор топика
Ответ на: комментарий от KennyMinigun
class Game {
        public:
                SDL_Window *window;
                SDL_GLContext glc;
                void load_map ( long pos, Picture *pic );
                void init_sdl ( );
                Game ( int width, int height, int cube_width, int cube_height );
                int get_level ( );
                void swap_window ( );
                void clear_window ( );
                void events ( );
                static int pollevent ( void *data );
        private:
                Menu *menu;
                int level;
                GLfloat aspect;
                GLfloat cube_width;
                GLfloat cube_height;
                int screen_width;
                int screen_height;
                void init_opengl ( );
                void delay ( float period );
                void init_menu ( );
};
u0atgKIRznY5
() автор топика
Ответ на: комментарий от linuhs_user

Я незнаю за что взяться, я даже банально не могу получить нужную позицию. Вот смотри, если в opengl сделать glOrtho, а может и без glortho, то начала координат начинается посередине. Если сделать glortho, то пиксели могут быть увеличенными, они могут различаться с настоящей системой координат, по размеру пикселя. Тогда как можно узнать, есть ли указатель мыши над кнопкой например? Мне советовали делать пропорции экрана и высчитывать, но как это сделать я незнаю, может поможешь?

u0atgKIRznY5
() автор топика
Ответ на: комментарий от u0atgKIRznY5

Если ты кнопку хочешь сделать то возьми Nuklear. Если все сам хочешь, то ставь gluOrtho2d, и далее потом переводи координаты OpenGL в пиксельные. Или что?

linuhs_user
()
Ответ на: комментарий от u0atgKIRznY5

Не вижу проблем в обьявлении: должно работать. Проблема где-то еще. Читай внимательно *все* диагностики компилятора.

https://wandbox.org/permlink/aF92FFbx0KXSxRMn

KennyMinigun ★★★★★
()
Последнее исправление: KennyMinigun (всего исправлений: 1)
Ответ на: комментарий от u0atgKIRznY5

Но блин это пустая трата времени, вот в nuklear нарисовать окно с кнпокой проще простого

ctx = ... nk_create_context ...;

if(nk_begin(ctx, "Hello", nk_rect(x,y,width,height), NK_WINDOW_TITLE | NK_WINDOW_BORDER | NK_WINDOW_MOVABLE) {
    if(nk_button_label(ctx, "hello world"))
        puts("click!");
    nk_end(ctx);
}

linuhs_user
()
Последнее исправление: linuhs_user (всего исправлений: 2)
Ответ на: комментарий от u0atgKIRznY5

Да что то фейлы за фейлом. Fix.

double window_x, gl_x, window_width;

window_x = (window_width/2)+((window_width/2)*gl_x);

linuhs_user
()
Ответ на: комментарий от Dead

Очень конструктивный ответ.

Ну а что вы ожидали от персонажа, который ни документацию, ни код прочесть не может. Он ждет, когда за него решат его проблему.

andreyu ★★★★★
()
Ответ на: комментарий от u0atgKIRznY5

Я незнаю за что взяться

С EngineCore где будут функции для строк, вектров, кучи, только не вздумай реализовывать то что уже есть! Потом переходи на EngineGraphics где сделай окно, обработку событий окна. Сделай структуру для текстуры, там длинну ширину, GLuint texture_id конечно же, структура цветов, EngineMath где структуры векторов, операции над ними, матрицы, и все такое, еще нужно создать структуру камеры. Далее создай базовую структуру:

struct EntityDraw {
    Vector3D position;
    Vector3D rotation;
    Vector3D scale;
    ColorRGB color;
    void*    data;

    void (*free)(struct EntityDraw*);
    void (*draw)(struct EntityDraw*, struct Render*);
};
А далее и EngineGraphics/EntityModel.h можно написать!
struct EntityModelData {
    Texture2D texture;
    Array     triangles;
    int       animation_frame_current;
    int       animation_frame_count;
};

EntityDraw
EntityModelNew(const char* model_path) {
    EntityDraw ent;

    ent.data = malloc(sizeof(EntityModelData));
    EntityModelLoadFromFile(ent.data, model_path);   
 
    ent.free = ....;
    ent.draw = EntityModelDraw_Method;
    return(ent);
}

void
EntityModelDraw_Method(struct EntityDraw* self, struct Render* render) {
    EntityModelDraw(self->data, render);
}
Вот и так реализовываешь EntityCube, EntityTerrain, etc. Далее можно приступить к EngineAudio, там все просто, только не забудь если будешь делать 3D звук сделать привязку к Entity... А то я как то забыл, много потом переделывал.
Далее зависит от твоей игры, если будет клиент+сервер то можешь начать добавлять в EngineCore модуль для парсинга настроек пользователя и сделать EngineNetwork, сокеты и базовую часть, и переходи к реализации сервера, там на сервере уже надо сделать ServerCore, ServerPhysics, ServerGame где все будет обрабатываться. Неплохо было бы еще до всего этого написать свой редактор карт если они сложные, далее пишешь ServerMapLoader какой нибудь. UDP лучше выбрать. Если однопользовательская то тут наверное нужно EngineMapLoader, EnginePhysics и хватит думаю.

Писать лучше на С89 так как костыльный код на нем становится ужасно некрасивым, и сразу хочеться переделать, еще и скомпилируется везде. Для графики SDL2/OpenGL если GL старый то возьми glu, если новый с шейдерами итд то возьми: https://github.com/arkanis/single-header-file-c-libs/blob/master/math_3d.h . Для загрузки текстур лучше SDL2_image он поддерживает почти все форматы, для звука SDL2_mixer, для сети SDL2_net, и для рисовки текста тоже SDL2_ttf, хотя если тебе не нужен он на текстурах или просто в свободном пространстве то текст рисовать лучше с помощью Nuklear, вот его как раз и для GUI взять можно, как физический движок есть ODE, он написан на плюсах вроде, но у него интерфейс на чистом C. Еще неплохо было бы встроить в формат карт скриптование, удобная вещь! Тут советую взять http://duktape.org/
Для анимированных моделей можно взять MD2 для начала.

Вот, но прежде чем это все писать подумай над тем где ты будешь брать модели, звуки, текстуры, я думал можно будет накачать но в итоге ничего не нашел, лол.

linuhs_user
()
Последнее исправление: linuhs_user (всего исправлений: 2)
Ответ на: комментарий от Silerus

Нет, оно принимает указатель на _функцию_. Лямбда с хоть чем-то в capture - не функция. Точно так же как и результат bind.

Kuzy ★★★
()
Ответ на: комментарий от u0atgKIRznY5
glBegin(GL_TRIANGLES);
glVertex3f(gl_x, gl_y, gl_z);
...

На height такая:

double window_y, gl_y, window_height;

window_y = (window_height/2)+((window_height/2)*gl_y);
window_x, window_y = это в пикселях координаты типо.

linuhs_user
()
Последнее исправление: linuhs_user (всего исправлений: 1)
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.