2014-03-03 60 views
3

我想在兩點之間移動精靈。從點到點移動精靈

第一點是x=0y=0,第二點是用戶觸摸屏幕的點。

爲了移動,我想用一個方程來通過兩點,即y=ax+b

我試圖在方法move()但這個精靈不動。

請幫忙。

類顯示:

package com.example.name; 

import android.content.Context; 
import android.graphics.Bitmap; 
import android.graphics.BitmapFactory; 
import android.graphics.Canvas; 
import android.graphics.Color; 
import android.view.MotionEvent; 
import android.view.SurfaceHolder; 
import android.view.SurfaceView; 

public class Display extends SurfaceView { 
private Bitmap bmp; 
private SurfaceHolder holder; 
private GameLoopThread gameLoopThread; 
private Sprite sprite; 
private long lastClick; 
private float x = 0.0F; 
private float y = 0.0F; 

public Display(Context context) { 
    super(context); 

    bmp = BitmapFactory.decodeResource(getResources(), R.drawable.gonia); 
    sprite = new Sprite(this, bmp, x, y, x, y); 

    gameLoopThread = new GameLoopThread(this); 
    holder = getHolder(); 
    holder.addCallback(new SurfaceHolder.Callback() { 

     @Override 
     public void surfaceDestroyed(SurfaceHolder holder) { 
      boolean retry = true; 
      gameLoopThread.setRunning(false); 
      while (retry) { 
       try { 
        gameLoopThread.join(); 
        retry = false; 
       } catch (InterruptedException e) { 
       } 
      } 
     } 

     @Override 
     public void surfaceCreated(SurfaceHolder holder) { 
      gameLoopThread.setRunning(true); 
      gameLoopThread.start(); 
     } 

     @Override 
     public void surfaceChanged(SurfaceHolder holder, int format, 
       int width, int height) { 
     } 
    }); 

} 

@Override 
protected void onDraw(Canvas canvas) { 
    canvas.drawColor(Color.BLACK); 
    sprite.onDraw(canvas); 
} 

@Override 
public boolean onTouchEvent(MotionEvent event) { 
    if (System.currentTimeMillis() - lastClick > 500) { 
     lastClick = System.currentTimeMillis(); 
     x = (float) sprite.ostatniaWartoscX(); 
     y = (float) sprite.ostatniaWartoscY(); 
     float gotox = (float) event.getX(); 
     float gotoy = (float) event.getY(); 
     synchronized (getHolder()) { 
      sprite = new Sprite(this, bmp, x, y, gotox, gotoy); 

     } 
    } 
    return true; 
} 

} 

類雪碧:

package com.example.name; 

import android.graphics.Bitmap; 
import android.graphics.Canvas; 


public class Sprite { 


private float a; 
private float b; 

private float x; 
private float y; 
private float gotox; 
private float gotoy; 
private int executeMove = 0; 
private Display display; 
private Bitmap bmp; 


public Sprite(Display display, Bitmap bmp, float x, float y, float gotox, 
     float gotoy) { 
    this.display = display; 
    this.bmp = bmp; 
    this.x = x; 
    this.y = y; 
    this.gotox = gotox; 
    this.gotoy = gotoy; 
} 

void update() { 

    if (x < gotox) {x++;executeMove = 1;} 
    if (x > gotox) {x--;executeMove = 1;} 

    if (executeMove == 1) {move();} 
    executeMove = 0; 


} 

void move() { 
    float x1 = x; 
    float y1 = y; 
    float x2 = gotox; 
    float y2 = gotoy; 

    a = (y2-y1)/(x2-x1); 
    b = y1 - x1*a; 
    y = x1 * a + b; 


} 


public float ostatniaWartoscX() { 
    return x; 
} 

public float ostatniaWartoscY() { 
    return y; 
} 

public void onDraw(Canvas canvas) { 
    update(); 
    canvas.drawBitmap(bmp, x, y, null); 
} 

} 

謝謝!

回答

2

下面是代碼的例子我使用移動的兩點之間的對象。

Math.atan2計算的θ角(-pi到+ pi),其是所述對象需要行進的軌跡。 Delta是此更新和上次更新之間的時間,速度是對象的期望速度。這些都需要相乘,然後添加到當前位置以獲得新位置。

@Override 
protected void update(float delta) { 
     double theta = Math.atan2(targetPos.y - pos.y, targetPos.x - pos.x); 

     double valX = (delta * velocity) * Math.cos(theta); 
     double valY = (delta * velocity) * Math.sin(theta); 

     pos.x += valX; 
     pos.y += valY; 
} 
3

您需要 Bresenham's line algorithm來移動您的播放器。你甚至可以簡化它,你只需要計算下一個運動(而不是整個線)。這是一個簡單/容易和低卡路里算法。

您必須根據需要調整它。

public static ArrayList<Point> getLine(Point start, Point target) { 
    ArrayList<Point> ret = new ArrayList<Point>(); 

    int x0 = start.x; 
    int y0 = start.y; 

    int x1 = target.x; 
    int y1 = target.y; 

    int sx = 0; 
    int sy = 0; 

    int dx = Math.abs(x1-x0); 
    sx = x0<x1 ? 1 : -1; 
    int dy = -1*Math.abs(y1-y0); 
    sy = y0<y1 ? 1 : -1; 
    int err = dx+dy, e2; /* error value e_xy */ 

    for(;;){ /* loop */ 
     ret.add(new Point(x0,y0)); 
     if (x0==x1 && y0==y1) break; 
     e2 = 2*err; 
     if (e2 >= dy) { err += dy; x0 += sx; } /* e_xy+e_x > 0 */ 
     if (e2 <= dx) { err += dx; y0 += sy; } /* e_xy+e_y < 0 */ 
    } 

    return ret; 
}