5

HTMLキャンバスに基づいた簡単なゲームをコーディングしています。現在、coffeescript から opal に移植しています。

CanvasRenderingContext2D オブジェクトを効率的な方法でラップしたいと思います。

私の現在の解決策はラッパーですが、そのフリーダイヤルを橋渡ししたいと思っています。

app.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 に答える