2012-02-28 75 views
0

這是關於它的基礎。我不想使用圖像文件。相反,我想以編程方式繪製一個圓圈並將其貼到表面(就像他們在pygame中所說的那樣)。如何使用PlayN在屏幕上繪製一個圓圈?

我試圖按照這裏的 「使用CanvasLayers」 例如:

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

從我的遊戲類:

// 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)未定義類型 SurfaceLayer

然而,這是它在鏈接示例中的使用方式。

回答

2

如果你提供的代碼編譯,甚至,然後你正在使用一些非常舊的PlayN版本。

更新到PlayN 1.1.1並修復導致的編譯錯誤,並且您的代碼將正常工作。

以下是你的代碼更新了1.1.1 PlayN工作:

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); 
    } 

如果你真的打算使用這種方法做一個遊戲,你應該使用ImmediateLayerSurfaceLayerImmediateLayer將直接針對framebuffer發出您的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 2012-02-29 03:42:05

+1

這是一個很好的例子。我寫的。 :) – samskivert 2012-02-29 22:59:55

0

你的代碼看起來沒什麼問題... 設置canvasTransform,

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

,並請用於測試目的使BG更大

graphics().createImage(circleRadius, circleRadius); (400,400)