0

タッチ ポイント (dx、dy) 間の関数を計算しようとすると、計算関数を呼び出すときにエラーが発生します。

ここに私の移動機能があります:

public class Mice {

public Movement getRatio;
public static float MX;
public static float MY;

public Mice(float x, float y){
    MX = x;
    MY = y;
}

public void move(float dx, float dy){
    float[] ratio = new float[2];
    //below this comment is my error:
    ratio = getRatio.getPath(dx, dy, MX, MY);
    MX++;
    MY = MY + ratio[1];
    GameActivity.mpx = MX;
    GameActivity.mpy = MY;
}

}

(MX, MY) は、オブジェクトが現在画面上にある別のポイントです。

これが私の計算関数です:

public class Movement {

public float[] getPath(float dx, float dy, float mX, float mY){
    float[] ratio = new float[2];
    ratio[0] = 1;
    float a;
    float Ry1;
    float Ry2;
    float Rx1 = 1;
    float Rx2 = 2;
    a = (dy-mY)/(dx-mX);
    Ry1=a*(Rx1-dx)+dy;
    Ry2=a*(Rx2-dx)+dy;
    ratio[1] = Math.abs(Ry1-Ry2);

    return ratio;
}

}

私の onTouchEvent

@Override
public boolean onTouchEvent(MotionEvent event){

dx = event.getX();
dy = event.getY();


if(event.getAction()==1){
thread = new MiceThread(mice, mview, dx, dy);
thread.start();
}

return true;
}

そして、ここに私のスレッドがあります:

public class MiceThread extends Thread {

private Mice gameMice;
private MiceView gameView;
private float x;
private float y;

public MiceThread(Mice theMice, MiceView theView, float x, float y){
    this.gameMice = theMice;
    this.gameView = theView;
    this.x = x;
    this.y = y;
}

public void run(){
    while(1<2){
        this.gameMice.move(x, y);
        this.gameView.postInvalidate();

        try
        {
            MiceThread.sleep(5);

        }
        catch (InterruptedException e)
        {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }

    }
}

}

コードの最初のブロックで指定された場所でエラーが発生しています。

ありがとう!

4

1 に答える 1

2

Null Pointer を取得した場合、初期化されていないことがわかりますMovement getRatio

それをコンストラクターに追加します。

public Mice(float x, float y){
MX = x;
MY = y;
getRatio = new Movement();
}

移動に必要なパラメーターを入力します...

static次のように、ムーブメント内にメソッドを作成することもできます。

public class Movement {

    public static float[] getPath(float dx, float dy, float mX, float mY){
       ...
    }
}

次のように使用します。

public void move(float dx, float dy){
    float[] ratio = Movement.getPath(dx, dy, MX, MY);
    MX++;
    MY = MY + ratio[1];
    GameActivity.mpx = MX;
    GameActivity.mpy = MY;
}

あなたのgetPath(...)機能はそれとは何の関係もありません。

編集:

情報が不足しているため、本当に役に立ちません。ほんの少しのメモ...

避ける

if(event.getAction()==1){
  thread = new MiceThread(mice, mview, dx, dy);
  thread.start();
}

みたいにやってみる

if(event.getAction()==1){
    if (thread =! null){
        //kill Thread First. instead of while(1<2) add a boolean inside MiceThread.run 
        // and set it to false at this point.... 
        // if you don't this Thread may live as long as GC doesn't kill it.
    }
    thread = new MiceThread(mice, mview, dx, dy);
    thread.start();
}

それで

public void run(){
while(someBool){
    this.gameMice.move(x, y);
    //does your Mice View has a reference to this.gameMice???
    //if not update your Mice inside this.gameView....
    // I Cannot tell you how, because I don't know what MiceView is doing...
    //postInvalidate() works ONLY, if Something inside the VIEW had changed...
    this.gameView.postInvalidate();

    try
    {
        MiceThread.sleep(5);

    }
    catch (InterruptedException e)
    {
        // TODO Auto-generated catch block
        e.printStackTrace();
    }

}
}
于 2012-05-16T15:20:23.390 に答える