2012-10-14 13 views
11

Sto sperimentando con cocosmotion, un'implementazione di Cocym2d di Rubymotion. Nel tutorial su cui sto lavorando, ho un metodo che prende una struct come argomento. Ho consultato i documenti Rubymotion e MacRuby, ma non riesco a capire come istanziare un nuovo oggetto basato sulla struttura di cui ho bisogno. Penso che il problema principale sia che la struttura inizia con una lettera minuscola e Ruby pensa che sia una variabile locale quando provo a lavorarci.Rubymotion e Pointers to Structs

credo di avere lo stesso problema, come indicato qui: https://github.com/MacRuby/MacRuby/issues/121

C'è una soluzione o una soluzione alternativa?

La struct è definita in Objective-C in questo modo:

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

Il metodo che sto cercando di chiamare aspetta una struct ccTexParams.

Ecco che cosa ho provato:

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

Quando provo in questo modo:

 @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 

L'errore di runtime è:

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

Ho anche provato:

@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 

L'errore:

Can't find pointer description for type `_ccTexParams' 

Ho anche provato a sostituirlo come CcTexParams, _ccTexParams, e solo ccTexParams in un sacco di modi diversi, non versioni di esso funzionano.

Ho provato questo:

@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 lamenta che expected an instance of Pointer, got '#<CcTexParams minFilter=9987 magFilter=9729 wrapS=33071 wrapT=33071>' (CcTexParams) (TypeError)

Ho provato solo di passaggio [GL_LINEAR_MIPMAP_LINEAR, GL_LINEAR, GL_CLAMP_TO_EDGE, GL_CLAMP_TO_EDGE] direttamente al metodo. Si lamenta che è expected a Pointer but got an Array.

Forse dovrei semplicemente rinominare ccTexParams nella lib in qualcosa come CCTexParams? Immagino che non sia una soluzione ideale.

+0

Ho spostato il contenuto dei miei suggerimenti nella domanda e ho cancellato la mia risposta. Spero che questo renderà la tua domanda più visibile dal momento che non ha risposte. – vacawama

+0

Grazie per il tuo aiuto, @vacawama. – plasticbugs

risposta

2

Se qualcuno cerca una soluzione, prova con Joybox. È un wrapper per Cocos2D.

Joybox combines the most popular and widely used 2D game engine for iOS, Cocos2D, folds in the amazing Box2D physics engine, and then wraps them up into a clean Ruby API that will make game development faster and more enjoyable for both beginners and experts alike.