Andengineを使用して、スプライトをフリング/スワイプ方向(斜めに)で動かす方法
質問
私はゲームに取り組んでいます AndEngine
. 。その中で、私はオブジェクトをで移動することができます Right to Left
, Top to Bottom
およびその逆。しかし、私の問題は、どのようにしてスプライトオブジェクトを移動できるかということです Direction of Fling
?それは、ユーザーが任意の方向に投げかけている場合、スプライトオブジェクトが投げ目の座標を移動し、先に進むべきであることを意味します。
誰かが提案できるなら、正確なものを取得する方法 X and Y co-ordinates
また、私はスプライトオブジェクトを座り込みに自分自身を動かすことができます。
あなたも見ることができます ビデオ - パイレーツサブ
ビデオで Launcher
に来る FLING
どんな方向からも、私が探しているものです。
前もって感謝します。スリ・サハニ。
解決
さて、あなたはこのコードを試すことができます.....
float slope = (y2 - y1) / (x2 - x1);
float angle = (float) Math.atan(slope);
float angleInDegree = (float) Math.toDegrees(angle);
c = y1 - (slope * x1);
onfling()メソッドは、すべての方向に対してこのように見えます。
@Override
public boolean onFling(MotionEvent e1, MotionEvent e2, float velocityX,float velocityY) {
float c;
// Checks if LifeLine is there or not and enable or disable Fling
// Operation.
float sx = 0, sy = 0;
float x1 = e1.getX();
float y1 = e1.getY();
float x2 = e2.getX();
float y2 = e2.getY();
float slope = (y2 - y1) / (x2 - x1);
float angle = (float) Math.atan(slope);
float angleInDegree = (float) Math.toDegrees(angle);
c = y1 - (slope * x1);
/**
* bottom right to left top
*/
if (x1 > x2 && y1 > y2) {
sx = CAMERA_WIDTH;
sy = (slope * sx) + c;
missile = new Missile(sx, sy,
this.mFaceTextureRegionMissileLeftToRight);
missile.setVelocity(-(float) (600 * (Math.cos(angle))),
-(float) (600 * (Math.sin(angle))));
scene.getTopLayer().addEntity(missile);
missile.setRotation(angleInDegree + 180);
}
/**
* left top corner to right
*/
else if (x2 > x1 && y2 > y1) {
sx = -100;
sy = (slope * sx) + c;
missile = new Missile(sx, sy,
this.mFaceTextureRegionMissileLeftToRight);
missile.setVelocity((float) (300 * (Math.cos(angle))),
(float) (300 * (Math.sin(angle))));
scene.getTopLayer().addEntity(missile);
missile.setRotation(angleInDegree);
}
/**
* left bottom corner to right up
*/
else if (x2 > x1 && y1 > y2) {
sx = -100;
sy = (slope * sx) + c;
missile = new Missile(sx, sy,
this.mFaceTextureRegionMissileLeftToRight);
missile.setVelocity((float) (300 * (Math.cos(angle))),
(float) (300 * (Math.sin(angle))));
scene.getTopLayer().addEntity(missile);
missile.setRotation(angleInDegree);
}
/**
* Right corner to left bottom down
*/
else if (x1 > x2 && y2 > y1) {
sx = CAMERA_WIDTH;
sy = (slope * sx) + c;
missile = new Missile(sx, sy,
this.mFaceTextureRegionMissileLeftToRight);
missile.setVelocity((float) (-600 * (Math.cos(angle))),
-(float) (600 * (Math.sin(angle))));
scene.getTopLayer().addEntity(missile);
missile.setRotation(angleInDegree + 180);
}
return false;
}
他のヒント
上記の例に基づいてこれを作成しました。
ublic abstract class onupdowngestureLelistenerはontouchlistenerを実装しています{
private final GestureDetector gdt = new GestureDetector(new GestureListener());
@Override
public boolean onTouch(final View v, final MotionEvent event) {
gdt.onTouchEvent(event);
return true;
}
private final class GestureListener extends SimpleOnGestureListener {
@Override
public boolean onSingleTapConfirmed(MotionEvent e) {
click();
return true;
}
@Override
public boolean onFling(MotionEvent e1, MotionEvent e2, float velocityX, float velocityY) {
float x1 = e1.getX();
float y1 = e1.getY();
float x2 = e2.getX();
float y2 = e2.getY();
/**
* bottom right to left top
*/
if (x1 > x2 && y1 > y2) {
onBottomToTop();
}
/**
* left top corner to right
*/
else if (x2 > x1 && y2 > y1) {
onTopToBottom();
}
/**
* left bottom corner to right up
*/
else if (x2 > x1 && y1 > y2) {
onBottomToTop();
}
/**
* Right corner to left bottom down
*/
else if (x1 > x2 && y2 > y1) {
onTopToBottom();
}
return false;
}
}
public abstract void onRightToLeft();
public abstract void click();
public abstract void onLeftToRight();
public abstract void onBottomToTop();
public abstract void onTopToBottom();
}
所属していません StackOverflow