方法①
シーンにIOnSceneTouchListenerをimplementsして
・onSceneTouchEventでタッチ座標取得
・タッチ座標がスプライトの上かどうか判定
・処理を行う
あんまりよくない方法(最初はこれ使ってた)
IOnSceneTouchListenerで行うのは、画面のフリップとかそういうのを判定させる場所にするべきだと思う
方法②
シーンにIOnAreaTouchListenerをimplemantsして
・onAreaTouchedでタッチしたスプライト情報を取得
・スプライトの種類やタグから判定
・処理を行う
一般的な方法
方法③
スプライト生成時にスプライトの中のonAreaTouchedをオーバーライドする
かっこいい方法。
↓AngEngine本のUtilとかを使う場合はこんな感じに書けばいい
final AnimatedSprite ap = new AnimatedSprite(pX, pY, (ITiledTextureRegion) getBaseActivity().getResourceUtil().getAnimatedSprite("image.png",6,4).getTiledTextureRegion(), this.getBaseActivity().getVertexBufferObjectManager()){ @Override public boolean onAreaTouched(final TouchEvent pSceneTouchEvent, final float pTouchAreaLocalX, final float pTouchAreaLocalY) { Log.d("ae", "ここにタッチした時の処理を書く"); return true; } }; attachChild(ap); registerTouchArea(ap);
ここのところAndEnjine関連の記事を拝見させていただいています。
返信削除わかりやすくためになる記事が大変ありがたいです。ご苦労さまです。
今回コメントさせていただきますのは今記事の事で質問があり、またこの質問が安達様の目に止まればと思い書き込んだ次第です。
肝心の質問は今記事にあるonAreaTouchedメソッド内に書いた画像をタッチスライドさせる処理についてです。コードは次の通りです。
//書き足した変数
//px, pyの初期化
private float px = -100;
private float py = -100;
//ACTION_MOVE開始点
private float touchStartPointX = 0;
private float touchStartPointY = 0;
//ACTION_MOVE経過点
private float touchEndPointX = 0;
private float touchEndPointY = 0;
//onAreaTouched内の処理コード
float x = pSceneTouchEvent.getX();
float y = pSceneTouchEvent/getY();
if(pSceneTouchEvent.getAction() == TouchEvent.ACTION_MOVE){
touchEndPointX = x;
touchEndPointY = y;
px = (touchEndPointX - (px));
py = (touchEndPointY - (py));
ap.setX(px);
ap.setY(py);
}
AnimatedSpriteをSpriteに変え、配置した画面の3倍(CameraWidth =480,CameraHeight =800
SpriteWidth =1440,SpriteHeight =2400)の画像をMOVEでtouchEndPointとpxpyの差異分タッチスライドさせる予定です。
しかしです。仮にpSceneTouchEventのxyを両方共200と過程しxy0方向にスライドさせた場合、touchEndPointの200にpxpyの初期値-100を引いた値と足した値、つまり-100と+300の二つ値が二枚のpxpyにそれぞれ代入されてしまいます。そしてその値を開始点としてその二枚がチカチカと交互に表示されながらそれぞれ同じ方向へとスライドをしていきます。
この同じ画像が二枚、違った位置で交互に表示されるというのは何が原因なのでしょうか。
突然の質問で申し訳ありません。お目に止まれば幸いです。
スプライトのタッチ&ドラッグを行いたいということでよろしいでしょうか?
返信削除バグのような動きをする理由は初期値点のpx,pyの更新方法がおかしいためでしょう
pxの更新を順番に考えてみればわかりやすいと思います
初期値px=-100でtouchEndPointX = 200のあたりをタッチをした場合
①ある瞬間:px=-100でtouchEndPointX = 200
→次のpx=200-(-100)=300
②次の一瞬:px=300でtouchEndPointX = 200
→次のpx=200-(300)=-100
以下ループ、となります
このため、「二枚がチカチカと交互に表示されながらそれぞれ同じ方向へとスライド」となります
簡単なタッチ&ドラッグ操作の実装としては、以下のような形式がわかりやすいかと思います。
final Sprite sp = new Sprite(-100, -100, CameraWidth*3, CameraHeight*3, (TextureRegion) getBaseActivity().getResourceUtil().getSprite("test_01.png").getTextureRegion(), this.getBaseActivity().getVertexBufferObjectManager()){
// 追加変数
private float touchDownLocalX=0;
private float touchDownLocalY=0;
@Override
public boolean onAreaTouched(final TouchEvent pSceneTouchEvent, final float pTouchAreaLocalX, final float pTouchAreaLocalY) {
//onAreaTouched内の処理コード
float x = pSceneTouchEvent.getX();
float y = pSceneTouchEvent.getY();
if(pSceneTouchEvent.isActionDown()){
this.touchDownLocalX = pTouchAreaLocalX;
this.touchDownLocalY = pTouchAreaLocalY;
}else if(pSceneTouchEvent.isActionMove()){
this.setX(x-this.touchDownLocalX);
this.setY(y-this.touchDownLocalY);
}
return true;
}
};
sp.setBlendFunction(GL10.GL_SRC_ALPHA, GL10.GL_ONE_MINUS_SRC_ALPHA);
sp.setAlpha(1.0f);
this.registerTouchArea(sp);
this.attachChild(sp);
画面全体での移動のような動作を行うのであれば、AndEngineのカメラ自体を動かす方がよいかもしれません。もし余裕があればそちらも記事にしたいと思います。
はい、おっしゃる通り普通にタッチ&ドラッグをさせたかったのです。
削除お忙しい中突然の質問にお応えをいただき、大変感謝しています。
おかげでタッチ&ドラッグやpTouchAreaLocalのやり方、意味を学ぶことができました。
どうもありがとうございます。
また、まことに勝手ながらカメラを動かす方法の記事も楽しみにさせていただきたく思います。
ありがとうございました。
お役に立てたようでなによりです
削除