5

我正在编写一个基于 html 画布的简单游戏。我现在正在从咖啡脚本移植到蛋白石。

我想以一种有效的方式包装 CanvasRenderingContext2D 对象。

我目前的解决方案是一个包装器,但我真的很想让这个免费桥接。

应用程序.rb:

class Game
    def initialize
        @canvas = Element.find('#canvas').get(0)
        js_ctx  = `this.canvas.getContext('2d')`        # this is a javascript object
        @ctx    = CanvasRenderingContext2D.new(js_ctx)  # create the proxy
        @ctx.fillStyle='red'
        @ctx.fillRect(10,10,50,50)
    end
end

# the opal proxy class (named $CanvasRenderingContext2D in javascript space)
class CanvasRenderingContext2D
    # I currently model the proxy as a has_a while I'd prefer it to be is_a
    attr_reader :js    # the native javascript object

    def initialize(js)
        @js = js
    end

    # getter
    def fillStyle
        `this.js.fillStyle`
    end

    # setter
    def fillStyle= value
        `this.js.fillStyle= value`
    end

    # method invocation
    def fillRect x,y,width,height
        `this.js.fillRect(x,y,width,height)`
    end
end

欢迎任何提示。

4

1 回答 1

5

上次我使用蛋白石时,我遵循了与您相同的路径,创建了包装器,甚至直接从我的代码中直接调用了 javascript。最近我遇到了一个描述 Native 类使用的博客,所以你的代码看起来像这样:

require 'native'
class Game
  def initialize
    @canvas = Element.find('#canvas').get(0)
    @ctx  = Native(`this.canvas.getContext('2d')`)
    @ctx.fillStyle='red'
    @ctx.fillRect(10,10,50,50)
  end
end

还没有真正测试过这个方法

[1] http://dev.mikamai.com/post/79398725537/using-native-javascript-objects-from-opal

于 2014-03-14T17:39:45.793 回答