2012-02-28 10 views
0

これはほぼ基本的なものです。私は画像ファイルを使いたくない。むしろ、私はプログラム的に円を描き、それを表面にblitしたい(彼らはパイゲームで言うように)。私のゲームクラスからPlayNで画面に円を描くにはどうしたらいいですか?

https://developers.google.com/playn/devguide/rendering

は、私はここで、 "CanvasLayersの使用" を例に従うことをしようとした

// Surface 
SurfaceLayer surface; 

// Background 
int width = 640; 
int height = 480; 
//ImageLayer bgLayer; 
CanvasImage bgImage; 
Canvas canvas; 

// Circle 
CanvasImage circleImage; 
//ImageLayer circleLayer; 
int circleRadius = 20; 
int circleX = 0; 
int circleY = 0; 


@Override 
public void init() { 

    // create a surface 
    surface = graphics().createSurfaceLayer(width, height); 
    graphics().rootLayer().add(surface); 

    // create a solid background 
    // http://code.google.com/p/playn101/source/browse/core/src/main/java/playn101/core/J.java#81 
    bgImage = graphics().createImage(width, height); 
    canvas = bgImage.canvas(); 
    canvas.setFillColor(0xff87ceeb); 
    canvas.fillRect(0, 0, width, height); 
    //bgLayer = graphics().createImageLayer(bgImage); 
    //graphics().rootLayer().add(bgLayer); 

    // create a circle 
    circleImage = graphics().createImage(circleRadius, circleRadius); 
    canvas = circleImage.canvas(); 
    canvas.setFillColor(0xff0000eb); 
    canvas.fillCircle(circleX, circleY, circleRadius); 
    //circleLayer = graphics().createImageLayer(circleImage); 
    //graphics().rootLayer().add(circleLayer); 
} 

@Override 
public void paint(float alpha) { 
    // the background automatically paints itself, so no need to do anything 
    // here! 
    surface.clear(0); 
    surface.drawImage(bgImage, 0, 0); 
    surface.drawImage(circleImage, 100, 100); 
} 

しかし、私は、JavaとEclipseで空白のウィンドウが文句を取得:

drawImageメソッド(CanvasImage、int、int)は、タイプ0123の場合は未定義ですSurfaceLayer

ただし、これはリンクの例で使用されている方法です。

答えて

2

BG大きくします非常に古いバージョンのPlayNoを使用しています。

PlayN 1.1.1にアップデートし、その結果として生じるコンパイルエラーを修正すれば、コードは正常に動作します。

次はPlayN 1.1.1で動作するように更新され、あなたのコードです:

private SurfaceLayer surface; 
    private CanvasImage bgImage; 
    private CanvasImage circleImage; 

    @Override 
    public void init() { 
    // create a surface 
    int width = graphics().width(), height = graphics().height(); 
    surface = graphics().createSurfaceLayer(width, height); 
    graphics().rootLayer().add(surface); 

    // create a solid background 
    bgImage = graphics().createImage(width, height); 
    Canvas canvas = bgImage.canvas(); 
    canvas.setFillColor(0xff87ceeb); 
    canvas.fillRect(0, 0, width, height); 

    // create a circle 
    int circleRadius = 20; 
    int circleX = 0; 
    int circleY = 0; 
    circleImage = graphics().createImage(circleRadius, circleRadius); 
    canvas = circleImage.canvas(); 
    canvas.setFillColor(0xff0000eb); 
    canvas.fillCircle(circleX, circleY, circleRadius); 
    } 

    @Override 
    public void paint(float alpha) { 
    Surface s = surface.surface(); 
    s.clear(); 
    s.drawImage(bgImage, 0, 0); 
    s.drawImage(circleImage, 100, 100); 
    } 

本当にこのアプローチを使用してゲームをするつもりならば、あなたはImmediateLayerないSurfaceLayerを使用する必要があります。 ImmediateLayerはdrawImageなどをフレームバッファに対して直接呼び出します。 SurfaceLayerはオフスクリーンのフレームバッファを作成し、その中にすべてをレンダリングし、そのフレーム外のフレームバッファをフレームごとにメインフレームバッファにコピーします(OpenGLで自然に実行されるダブルバッファリングに加えて)。画面全体。

+0

詳細な対応をありがとうございます。このテストファイルはImmedateLayerの使用例です:[code.google.com](http://code.google.com/p/playn/source/browse/tests/core/src/playn/tests/core/ImmediateTest .java)?私はまだPlayNのコーディングパターンのハンドルを取得しようとしています。 – klenwell

+1

これは良い例です。私はそれを書きました。 :) – samskivert

0

あなたのコードは、私には正常に見える... はcanvasTransformを、設定

canvas.setTransform(1, 0, 0, 1, 0, 0); 

としてくださいテストの目的のためには、その後、あなたが提供されたコードもコンパイルした場合

graphics().createImage(circleRadius, circleRadius); (400,400) 
関連する問題