2011-07-19 2 views
2

私はAndroidでJavaを使用して最初のゲームを作っています。私は一緒に線を作成する必要がある多くのピクセルを描画する必要があります。私の最初のアプローチは、ブール値の大きな配列を作成し、ループを作成し、関連付けられたブール値が真のときにピクセルを描画することでした。Canvasに多くのピクセルを効率的に描画するにはどうすればよいですか?

当然のことではありませんでした(配列は約200x300です)。今私はラインの最初のピクセルの位置だけを覚えており、次の各ピクセルはフォロワーを覚えていなければなりません。それはかなりうまくいきますが、ラインが長くなると(しかしそれほど長くはありません)、効率は悪いです(< 4000フレーム後に20fps)。

これは、私が線を描画するために使用する関数です(今のところ1つだけです)。誰も私の効率を改善するのに役立つことができますか?

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

canvasオブジェクトには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.ANTI_ALIAS_FLAG); paint.setColor(Color.RED); 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です(私の電話(samsung Spica)ではそれはより良い走りをしますが、40を超えた後は20とそれ以下に減少します) 983はフレーム数です。 –

0

あなたはブレゼンハムアルゴリズムに見てみたいし。 bresenhamアルゴリズムは、線を描画またはラスタライズする方法です。これは、モルモン曲線などの特定の角度でのグリッドの細分とは少し異なります。ここで思い出されるように、すべての角度に対してスカラー積を計算するのはちょっとです。Traversing a 2D array in an angle

+0

うん、私は2つのフレームで作成された2点の間のピクセルをチェックするためにそれを使用しました。 (私はそれを配列でチェックしたい)。私は効率的に問題があるので、現在はオフになっています;/ –

+0

@SyntaxTerror:私は答えを修正しました。 – Bytemain

関連する問題