コード追記場所はMainLoop内onTouchEventメソッドです。
ACTION_MOVE値を取得すると、画面タップしたあとに移動したかどうかがわかります。なのでタップした指にキャラがついてくるような移動方法になります。タップした場所が自機クラスで定めた範囲であれば移動するようにしているため、ワープっぽく移動してしまうようなことを防いでいます。
Objectクラスの追記
OMoveメソッドで移動を実装しています。ただ単にタップしている場所に座標を置き換えているだけです。いまある座標を保存し、移動後に画面外にでるようなら保存している座標に戻しています。
OgetTapRectメソッドは、タップをちょっと早くするとどうしても処理の速さの関係上画像がタップ移動についてこれなくなりタップ位置から画像がはなれてついてこれなくなります。それを画像の範囲よりもちょっと幅広に設定してあげることにより余裕をもたせて、ある程度タップ位置が画像から離れても大丈夫なようにするための処理です。
|
ファイル名「MainLoop.java」
008 | package and.roid.shooting2; |
010 | import android.content.Context; |
011 | import android.content.res.Resources; |
012 | import android.graphics.Bitmap; |
013 | import android.graphics.BitmapFactory; |
014 | import android.graphics.Canvas; |
015 | import android.graphics.Color; |
016 | import android.graphics.Paint; |
017 | import android.graphics.drawable.Drawable; |
018 | import android.util.AttributeSet; |
019 | import android.view.MotionEvent; |
020 | import android.view.SurfaceHolder; |
021 | import android.view.SurfaceView; |
023 | public class MainLoop extends SurfaceView implements SurfaceHolder.Callback,Runnable{ |
024 | private SurfaceHolder holder; |
025 | private Thread thread; |
028 | private Shooting2Activity s2a; |
030 | private float disp_w,disp_h; |
031 | private Drawable jikiimg,tamaimg; |
043 | public MainLoop(Context context) { |
048 | public MainLoop(Context context, AttributeSet attrs) { |
049 | super(context, attrs); |
053 | public void init(Context context){ |
054 | holder = getHolder(); |
055 | holder.addCallback( this ); |
056 | holder.setFixedSize(getWidth(), getHeight()); |
064 | s2a = (Shooting2Activity)context; |
069 | Resources resources = context.getResources(); |
072 | Bitmap img= BitmapFactory.decodeResource(resources,and.roid.shooting2.R.drawable.jiki); |
076 | Bitmap jikibit = Bitmap.createBitmap(img,0,0,img.getWidth()/2,img.getHeight()); |
077 | Bitmap tamabit = Bitmap.createBitmap(img,img.getWidth()/2,0,img.getWidth()/2,img.getHeight()); |
083 | jiki = new Jiki(disp_w,disp_h); |
084 | jiki.Oint(jikibit, 240, 800, 0, 0, jikibit.getWidth(), jikibit.getHeight()); |
092 | Paint p = new Paint(); |
093 | p.setAntiAlias( true ); |
095 | while (thread != null ){ |
096 | c = holder.lockCanvas(); |
098 | c.drawColor(Color.BLACK); |
102 | holder.unlockCanvasAndPost(c); |
106 | } catch (Exception e){} |
110 | public boolean onTouchEvent(MotionEvent event ){ |
111 | int action = event .getAction(); |
112 | int x = ( int ) event .getX(); |
113 | int y = ( int ) event .getY(); |
115 | case MotionEvent.ACTION_DOWN: |
117 | case MotionEvent.ACTION_UP: |
119 | case MotionEvent.ACTION_MOVE: |
124 | if (ms.RectTap(x, y, jiki.OgetTapRect()) == true ) jiki.OMove(x, y); |
131 | public void surfaceChanged(SurfaceHolder arg0, int arg1, int arg2, int arg3) {} |
133 | public void surfaceCreated(SurfaceHolder arg0) {thread = new Thread( this );thread.start();} |
135 | public void surfaceDestroyed(SurfaceHolder arg0) {thread = null ;} |
前回書き忘れたのでちょっと細かく表記しています
ファイル名「Object.java」
09 | package and.roid.shooting2; |
11 | import android.graphics.Bitmap; |
12 | import android.graphics.Canvas; |
13 | import android.graphics.Rect; |
14 | import android.graphics.drawable.BitmapDrawable; |
15 | import android.graphics.drawable.Drawable; |
17 | public abstract class Object { |
18 | private Mesod ms = new Mesod(); |
19 | private float disp_w,disp_h; |
27 | private float spx,spy; |
29 | private int imgw,imgh; |
32 | public Object( float dw, float dh){ |
37 | public void Oint(Bitmap imgb, float x, float y, float sx, float sy, int w, int h){ |
38 | img = new BitmapDrawable(imgb); |
39 | cx = ms.setSizeX(disp_w, x); |
40 | cy = ms.setSizeY(disp_h, y); |
47 | public void ODraw(Canvas c){ |
51 | img.setBounds(( int )(cx-imgw/2),( int )(cy-imgh/2),( int )(cx+imgw/2),( int )(cy+imgh/2)); |
62 | public void OMove( int x, int y){ |
68 | if (cx-imgw/2<0 || cx+imgw/2>disp_w) cx = cxx; |
69 | if (cy-imgh/2<0 || cy+imgh/2>disp_h) cy = cyy; |
78 | public Rect OgetTapRect(){ |
79 | Rect taprect = new Rect( |
80 | img.getBounds().left-50,img.getBounds().top-50, |
81 | img.getBounds().right+50,img.getBounds().bottom+50); |
 |