我正在试验cocosmotion,这是Cocos2d的Rubymotion实现。在本教程中,我有一个将结构作为参数的方法。我查阅了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

也许我应该将lib中的ccTexParams重命名为CCTexParams之类的?我猜这不是一个理想的解决方法。

最佳答案

如果有人正在寻找解决方案,请尝试Joybox。它是Cocos2D的包装。

关于ios - Rubymotion和结构指针,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/12886349/

10-10 03:38