2010-10-14 54 views

Trả lời

0

Hãy xem thư viện này. Nó sẽ giúp bạn di chuyển, và tôi nghĩ rằng kéo các đối tượng như hình ảnh, vv - PhysicsLayout. Ở đây bạn có thể thấy di chuyển với hai hướng - X, Y. Nếu bạn muốn di chuyển bao gồm Z, chỉ có một cách duy nhất để thực hiện nó, bạn nên sử dụng quy mô đơn giản.

Nếu bạn muốn một cái gì đó nhiều hơn, có rất nhiều khung công tác mạnh mẽ và đẹp mắt, Môi trường.

enter image description here

+0

Mục tiêu ở đây là để làm cho nó di chuyển theo một đường thẳng từ vị trí hiện tại đến vị trí đích. Nhìn nó như băng qua một ô vuông. Đó là một hành vi trò chơi và có thể không có bất kỳ bổ trợ hoặc tiện ích nào – Zoe

+0

Những gì tôi đang cố gắng nói là câu trả lời này quan tâm đến vật lý liên quan đến chuyển động, nhưng không phải cách thực hiện điều này theo nghĩa điều hướng tự động trên canvas. – Zoe

+0

Tôi vẫn cố hiểu) Ví dụ, sử dụng phương thức từ View.java - setTranslationX (float x), lấy tọa độ và chỉ vẽ lại bằng Canvas. Bạn muốn triển khai vẽ Canvas dựa trên vị trí? – GensaGames

0

Sau khi nhận được một bài giảng toán học, nó quay ra rằng điều này rất dễ dàng để giải quyết. Đầu tiên, chúng ta cần lấy góc mà mục tiêu sẽ di chuyển.

float deltaX = targetX - startX; 
float deltaY = targetY - startY; 
float angle = Math.atan2(deltaY, deltaX); 

startX/Y có thể là hiện tại X/Y.

Bây giờ chúng ta đã tính toán góc, chúng ta có thể áp dụng nó vào các tọa độ hiện tại:

currentX += speed * Math.cos(angle);//Using cos 
currentY += speed * Math.sin(angle);//or sin 

để xử lý các tính toán bao nhiêu X và Y sẽ được tăng thêm. Sử dụng tốc độ làm biến tùy chỉnh nếu bạn cũng cần có tốc độ tùy chỉnh. Nếu bạn không cần tốc độ cao hơn, hãy xóa biến.

Và để di chuyển các đối tượng, áp dụng X/Y để các đối tượng:

c.drawBitmap(bm, x, y, null); 

Ví dụ:

int speed = 10; 
int x, y; 
int targetX = 100, targetY = 600; 
int startX = 900, startY = 100; 
public void render(Canvas c){ 
    super.draw(c); 
    float deltaX = targetX - startX; 
    float deltaY = targetY - startY; 
    float angle = Math.atan2(deltaY, deltaX); 
    x += speed * Math.cos(angle);//Using cos 
    y += speed * Math.sin(angle);//or sin 
    c.drawBitmap(bm, x, y, null); 
    (...) 
} 
1

Tôi không thể hiểu những gì bạn thực sự muốn nhưng đây là một cái gì đó tôi Đã thử.

interface coordinateListener 
{ 
    public void currentPosition(float x,float y); 
} 

public class ImageView extends View{ 
    int width; 
    int height; 
    RectF rect = new RectF(); 
    float x=0f,y=0f; 
    float dX,dY; 
    float mStartX,mStartY; 
    float mEndX,mEndY; 
    Paint paint = new Paint(); 
    Bitmap mBitmap; 
    TranslateAnimation anim; 
    View view; 
    coordinateListener mListener; 
    public ImageView(Context context) { 
     super(context); 
     init(); 
    } 

    public ImageView(Context context, AttributeSet attrs) { 
     super(context, attrs); 
     init(); 
    } 

    public ImageView(Context context, AttributeSet attrs, int defStyleAttr) { 
     super(context, attrs, defStyleAttr); 
     init(); 
    } 

public void init() 
{ 
    view = this; 
} 
@Override 
protected void onMeasure(int widthMeasureSpec,int heightMeasureSpec) 
{ 
    super.onMeasure(widthMeasureSpec,heightMeasureSpec); 
    width = getMeasuredWidth(); 
    height = getMeasuredHeight(); 
    rect.set(0,0,width,height); 
} 

@Override 
protected void onDraw(Canvas canvas) 
{ 
    super.onDraw(canvas); 
    if(mBitmap!=null) { 
     canvas.drawBitmap(mBitmap,0,0,paint); 
    } 
} 

@Override 
public boolean onTouchEvent(MotionEvent event) 
{ 
    int action = event.getAction() & MotionEvent.ACTION_MASK; 

    switch (action) 
    { 
     case MotionEvent.ACTION_DOWN: 
      dX = this.getX() - event.getRawX(); 
      dY = this.getY() - event.getRawY(); 
      break; 
     case MotionEvent.ACTION_MOVE: 
      y = event.getRawY(); 
      x = event.getRawX(); 
      y += dY; 
      x+=dX; 

      this.setY(y); 
      this.setX(x); 

      mListener = (coordinateListener)getContext(); 
      mListener.currentPosition(x,y); 

      invalidate(); 
      break; 
    } 
    return true; 
} 

public void startCoordinates(float x,float y) 
{ 
    mStartX = x; 
    mStartY = y; 
} 

public void endCoordinates(float x,float y) 
{ 
    mEndX = x; 
    mEndY = y; 
} 

public void startTranslation(long duration) 
{ 
    anim = new TranslateAnimation(mStartX,mEndX,mStartY,mEndY); 
    anim.setDuration(duration); 
    anim.setFillAfter(true); 

    anim.setAnimationListener(new Animation.AnimationListener() { 
     @Override 
     public void onAnimationStart(Animation animation) { 

     } 

     @Override 
     public void onAnimationEnd(Animation animation) { 
      view.setX((int)mEndX); 
      view.setY((int)mEndY); 
      animation.setFillAfter(false); 
     } 

     @Override 
     public void onAnimationRepeat(Animation animation) { 

     } 
    }); 

    this.startAnimation(anim); 
} 

} 

Bạn có thể kéo nó từ một vị trí khác hoặc bạn có thể sử dụng Dịch để di chuyển nó ... như thế này,

view.startCoordinates(0f,0f); 
view.endCoordinates(500f,0f); 
view.startTranslation(3000); 
+0

Nó không phải là một cái nhìn thực tế. Nó đang sử dụng surfaceview và bitmap.to – Zoe

Các vấn đề liên quan