java - 从一个点移动到另一个点

标签 java android

我想在两点之间移动 Sprite 。

第一个点是 x=0y=0,第二个点是用户触摸屏幕的点。

为了移动,我想用一个方程来通过 y=ax+b 这两个点。

我在方法 move() 中尝试过,但 Sprite 没有移动。

请帮忙。

类(class)展示:

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

}

Sprite 类:

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

}

谢谢!

最佳答案

你需要 Bresenham's line algorithm移动你的播放器。你甚至可以缩短它,你只需要计算下一个 Action (而不是整条线)。这是一个简单/容易且低热量的算法。

您必须根据自己的需要进行调整。

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

关于java - 从一个点移动到另一个点,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22157510/

相关文章:

android - 合并不同的 Android Studio 项目

android - firebase 错误 W/DynamiteModule : Local module descriptor class for com. 找不到 google.firebase.auth

android - RecyclerView 和 GridLayoutManager : making one cell bigger

java - 您将哪种 Java 类型用于 JPA 集合,为什么?

java - JLabel 文本 Y 绘制坐标

java - 如何在java中获取枚举的所有可能值? (不知 Prop 体的枚举)

android - Qt for Android 和 BoringSSL

java - 为什么应用程序中的音频停止播放?

java - ViewPager 中 Fragment 内的 TextView 在方向更改时为空

android:checkableBehavior ="single"在分组子菜单上不起作用