2011-07-19 59 views
2

我正在Android上使用Java進行我的第一個遊戲。我需要畫出許多像素,這些像素一起應該創建一條線。我的第一種方法是製作大量的布爾值,創建一個循環,並在相關的布爾值爲真時畫一個像素。如何在Canvas上高效地繪製多個像素?

當然這不是個好主意(該數組大約是200x300)。現在我只記得線的第一個像素的位置,並且每個下一個像素都必須記住他的追隨者。它工作得很好,但是當線條變長(但還不是很長)時,效率很差(在4000幀後20幀/秒)。

這是我用來畫線的功能(現在只有一個)。任何人都可以幫助我提高效率嗎?

public void drawLine(Canvas canvas, int beginx, int beginy) { 
    Paint paint = new Paint(Paint.ANTI_ALIAS_FLAG); 
    paint.setColor(Color.RED); 
    paint.setStrokeWidth(3); 

    int x = beginx; 
    int y = beginy; 
    while(C.mGrid[x][y].nx != -1) { 
     //canvas.drawLine(x, y, C.mGrid[x][y].nx, C.mGrid[x][y].ny, paint); 
     canvas.drawPoint(x, y, paint); 
     Grid temp = C.mGrid[x][y]; 
     if ((C.mGrid[x][y].nx == x) && (C.mGrid[x][y].ny == y)) break; 
     x = temp.nx; 
     y = temp.ny; 
    } 
} 

和Grid.java:

package com.qwak.achtung; 

public float x = 0,y = 0; 
public int px = -1, py = -1, nx = -1, ny = -1; 

public Grid(float x, float y) { 
    this.x = x; 
    this.y = y; 
} 

public void set(int px, int py, int nx, int ny) { 
    this.px = px; 
    this.py = py; 
    this.nx = nx; 
    this.ny = ny; 
} 

public void setp(int px, int py) { 
    this.px = px; 
    this.py = py; 
} 

public void setn(int nx, int ny) { 
    this.nx = nx; 
    this.ny = ny; 
} 

PS:它看起來像這樣http://c.wrzuta.pl/wi10559/11f7d10b00110e504e25ebd3/0/andek 14 FPS(我的手機(三星角宿一)更好運行 - 40但經過一段時間就減少到20甚至更少),983是所有幀數。

回答

4

畫布對象中有一個drawLine方法。

使用這裏的例子:How to draw a line in android

canvas.drawLine(0, 0, 20, 20, paint); 

如果你想繪製一條曲線。找到曲線的功能。拋物線例如是x = y^2。你可以從曲線上得到點:1 = 1,2 = 4,3 = 9,4 = 16 ...等等。如果你逐個像素地繪製圖形,你可以插入你的x並得到你的y並繪製它。

Paint paint = new Paint(Paint.ANTI_ALIAS_FLAG); paint.setColor(Color.RED); (3); paint.setStrokeWidth(3);

for(int i = beginx; i < CanvasWidth; i++) 
{ 
    int x = i; 
    int y = i * i; //x=y^2 
    canvas.drawPoint(x, y, paint); 
} 

要保留進行了走訪,你可以做以下幾點的記錄:

class Point 
{ 
    int x; 
    int y; 
} 


List<Point> points = new List<Point>(); 

onMove(int newX, int newY) 
{ 
    Point p = new Point(); 
    p.x = newX; 
    p.y = newY; 

    points.add(p); 
} 


onDraw() 
{ 
    for(Point p : points) 
    { 
     canvas.drawPoint(p.x, p.y, paint); 
    } 
} 
+0

我知道如何寫行,但它更像曲線(?英語不是我的第一語言),它不能被描述爲2點之間的簡單線條,但它們之間很多。 –

+0

您將需要找到該行的功能。即x = y^2(曲線),那麼您可以插入要繪製的每個點。這比使用數組更有效。我將添加到我原來的帖子。 –

+0

它看起來像這樣http://c.wrzuta.pl/wi10559/11f7d10b00110e504e25ebd3/0/andek 14是fps(在我的手機上(三星Spica),它運行得更好--40但過了一段時間它減少到20甚至更少)而983是所有幀數。 –

0

你想看看布氏算法。 bresenham算法是繪製或柵格化一條線的方法。它與某個角度的網格細分有些不同,例如一個莫頓曲線。這有點像計算每個角度的標量產品,例如在這裏召回Traversing a 2D array in an angle

+0

是的,我用它來檢查2個點之間創建的2個點之間的像素。 (我想讓它在數組中檢查)。它目前關閉,因爲我有效地解決問題;/ –

+0

@SyntaxTerror:我已經糾正了我的答案。 – Bytemain

相關問題