Рубимоция и указатели на структуры

Я экспериментирую с cocosmotion, реализацией Rubymotion Cocos2d. В учебнике, над которым я работаю, у меня есть метод, который принимает структуру как аргумент. Я консультировался с документами Rubymotion и MacRuby, но не могу понять, как создать экземпляр нового объекта на основе структуры, в которой я нуждаюсь. Я думаю, что основная проблема заключается в том, что структура начинается с строчной буквы, и Ruby думает, что это локальная переменная, когда я пытаюсь работать с ней.

Я считаю, что у меня такая же проблема, как и здесь: https://github.com/MacRuby/MacRuby/issues/121

Есть ли решение или обходное решение?

Структура определена в Objective-C следующим образом:

 typedef struct _ccTexParams {
         GLuint  minFilter;
         GLuint  magFilter;
         GLuint  wrapS;
         GLuint  wrapT;
 } ccTexParams;

Метод, который я пытаюсь вызвать, ожидает структуру ccTexParams.

Вот что я пробовал:

            @mysprite = Pointer.new("{ccTexParams=
            {GLUint=GL_LINEAR_MIPMAP_LINEAR}
            {GLUint=GL_LINEAR}
            {GLUint=GL_CLAMP_TO_EDGE}
            {GLUint=GL_CLAMP_TO_EDGE}}", 4)

Когда я пробую это так:

        @mysprite = Pointer.new(:object, 4)

        @mysprite[0] = GL_LINEAR_MIPMAP_LINEAR 
        @mysprite[1] = GL_LINEAR
        @mysprite[2] = GL_CLAMP_TO_EDGE
        @mysprite[3] = GL_CLAMP_TO_EDGE

Ошибка выполнения:

expected instance of Pointer of type `{_ccTexParams=IIII}', got `@' (TypeError)

Я также пробовал:

@mysprite = Pointer.new("_ccTexParams", 4)

        @mysprite[0] = GL_LINEAR_MIPMAP_LINEAR 
        @mysprite[1] = GL_LINEAR
        @mysprite[2] = GL_CLAMP_TO_EDGE
        @mysprite[3] = GL_CLAMP_TO_EDGE

Ошибка:

Can't find pointer description for type `_ccTexParams'

Я также пытался заменить его как CcTexParams, _ccTexParams и просто ccTexParams по-разному, без каких-либо версий.

Я пробовал это:

@mysprite = CcTexParams.new
@mysprite.minFilter = GL_LINEAR_MIPMAP_LINEAR 
@mysprite.magFilter = GL_LINEAR
@mysprite.wrapS = GL_CLAMP_TO_EDGE
@mysprite.wrapT = GL_CLAMP_TO_EDGE

RubyMotion жалуется на expected an instance of Pointer, got '#<CcTexParams minFilter=9987 magFilter=9729 wrapS=33071 wrapT=33071>' (CcTexParams) (TypeError)

Я попробовал просто передать [GL_LINEAR_MIPMAP_LINEAR, GL_LINEAR, GL_CLAMP_TO_EDGE, GL_CLAMP_TO_EDGE] непосредственно методу. Он жалуется, что он expected a Pointer but got an Array.

Возможно, мне нужно просто переименовать ccTexParams в lib на что-то вроде ccTexParams? Я предполагаю, что это не идеальное решение.

Ответ 1

Если кто-то ищет решение для этого, попробуйте Joybox. Это оболочка для Cocos2D.

Joybox сочетает в себе самый популярный и широко используемый 2D-движок для iOS, Cocos2D, сворачивает удивительный ядерный движок Box2D, а затем превращает их в чистый Ruby API, который сделает игру более быстрым и приятным для начинающих и эксперты.

Ответ 2

Вам понадобится файл мостов, созданный для вашей среды. Пожалуйста, смотрите:

https://github.com/MacRuby/MacRuby/wiki/MacRuby-Tutorial

и ознакомьтесь с разделом "Доступ к статическим API". Это должно указывать на правильное направление.