2012-10-14 12 views
11

Tôi đang thử nghiệm với cocosmotion, một sự thực hiện Rubymotion của Cocos2d. Trong hướng dẫn tôi đang làm việc, tôi có một phương thức lấy cấu trúc làm đối số. Tôi đã tham khảo tài liệu về Rubymotion và MacRuby, nhưng không thể tìm ra cách làm thế nào để khởi tạo một đối tượng mới dựa trên cấu trúc mà tôi cần. Tôi nghĩ rằng vấn đề chính là cấu trúc bắt đầu bằng một chữ thường và Ruby nghĩ rằng đó là một biến địa phương khi tôi cố gắng làm việc với nó.Sự hỗn loạn và Con trỏ tới các Cấu trúc

Tôi tin rằng tôi có cùng một vấn đề như đã nêu ở đây: https://github.com/MacRuby/MacRuby/issues/121

Có một giải pháp hoặc cách giải quyết?

Các struct được định nghĩa trong Objective-C như sau:

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

Phương pháp Tôi đang cố gắng để gọi hy vọng một struct ccTexParams.

Dưới đây là những gì tôi đã cố gắng:

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

Khi tôi cố gắng nó theo cách này:

 @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 

Các lỗi runtime là:

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

Tôi cũng đã cố gắng:

@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ỗi:

Can't find pointer description for type `_ccTexParams' 

Tôi cũng đã cố gắng để thay thế nó như CcTexParams, _ccTexParams, và chỉ ccTexParams trong một loạt các cách khác nhau, không có phiên bản của nó hoạt động.

Tôi cố gắng này:

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

Tôi đã cố gắng chỉ đi [GL_LINEAR_MIPMAP_LINEAR, GL_LINEAR, GL_CLAMP_TO_EDGE, GL_CLAMP_TO_EDGE] trực tiếp đến phương pháp này. Nó phàn nàn rằng nó expected a Pointer but got an Array.

Có lẽ tôi chỉ nên đổi tên ccTexParams trong lib thành một cái gì đó như CCTexParams? Tôi đoán đó không phải là giải pháp lý tưởng.

+0

Tôi đã chuyển nội dung đề xuất của tôi vào câu hỏi của bạn và xóa câu trả lời của tôi. Hy vọng rằng sẽ làm cho câu hỏi của bạn rõ ràng hơn vì nó không có câu trả lời. – vacawama

+0

Cảm ơn sự giúp đỡ của bạn, @vacawama. – plasticbugs

Trả lời

2

Nếu ai đó đang tìm kiếm giải pháp cho việc này, hãy thử Joybox. Đó là một trình bao bọc cho 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.