Objective-C, массивы типа C и OpenGL ES 2.0 - PullRequest
0 голосов
/ 23 декабря 2011

Я не совсем уверен, как спросить это, или если это спрашивали раньше ...

Итак, поехали:

Я пытаюсь написать игру в Objective-C для iOS. Одной из главных особенностей этой игры является возможность преобразования 2D-ландшафта (технически 3D, однако он начинается с плоской 2D-плоскости с точками, разбросанными по ней, чтобы создать идеальную сетку из 20 квадратов 1x1) по вкусу пользователя; однако в Objective-C, по-видимому, вы не можете передавать массивы типа C через методы.

например:

-(VertexS *) getVertexArrayData {
    VertexS myArray[definedAmount]; //VertexS being a structure
    for (int i = 0; i != definedAmount; i++) {
        myArray[i] = vertexData;
    }
    return *myArray;
}

//In the other file (the one with all my rendering), under a different class, inside a method
//Lets pretend the aforementioned method was under a class called "Terrain"
-(id) initWithFrame:(CGRect)frame
{
     terrain = [[[Terrain alloc] init] autorelease];
     [terrain constructLand];
     VertexS *_vertexData = [terrain getVertexArrayData];
     ... etc.
}

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

Учитывая, что OpenGL (ES) требует либо векторный контейнер (ну, в C ++), либо массив типа C (что технически одно и то же), чтобы правильно создать IBO / VBO, я в растерянности. Я возился с ним почти полтора дня, не в силах обойти проблему и слишком (мысленно), чтобы изучать NSMutableArrays - если только вы не предложите мне это замечательное сообщество, в котором я буду псевдо-чудом потерять достаточно веса, чтобы изучить NSMutableArrays (вероятно, лучше сказать «я перестану избегать незнакомого решения»).

Я не могу вспомнить другой мой вопрос ... Мрэх. Это, вероятно, не соответствует действительности, но если я вспомню, я найду способ спросить это.

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

1 Ответ

3 голосов
/ 23 декабря 2011

Objective-C является надмножеством языка C, поэтому все, что вы можете сделать в простом C, будет работать и в Objective-C. Массив myArray объявлен в стеке в -getVertexArrayData. Он прекращается, когда метод возвращается, и эта память доступна для повторного использования при следующем вызове функции. Чтобы это исправить, выделите массив в куче, используя malloc() (или одного из его родственников).

-(VertexS *) getVertexArrayData {
    VertexS *myArray = malloc(definedAmount * sizeof(VertexS));
    for (int i = 0; i < definedAmount; i++) {
        myArray[i] = vertexData;
    }
    return myArray;
}

Управление памятью в стиле C не использует подсчет ссылок, поэтому не забудьте освободить массив, когда закончите с ним:

free(_vertexData);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...