前提・問題・実現したいこと
いつもお世話になっております。
AndroidStudioで簡単なゲームアプリを作っています。
上から降ってくるアイテムを、
下にいるプレイヤーが左右に動いてキャッチするというのを完成形として目指しています。
エラーではないのですが、
できれば改善したいことがあります。
以下のようにコードを書き、
アプリが起動するとゲームプレイ画面に飛び、
背景とプレイヤーが表示されるようにしました。
onTouchEventを使い、
画面の右半分をタップすると右へ、左半分をタップすると左へプレイヤーが動きます。
右を長押しすると右に進み続け、左も同様です。
ここで、例えば右に長押しで移動している最中に、慌てて左に行きたくなったとき、
本来であれば、画面右をタップ(長押し)している指をいったん離して、
ACTION_UP判定がされて、プレイヤーを止めてから、
画面左をタップ(長押し)してもらえれば、意図した動作になるのですが、
画面右を長押ししている指がACTION_UP判定されないうちに、
画面左の長押しを始めてしまい、
「画面右長押し→画面左長押し(両側を長押し状態)→画面右の指を離す(画面左だけ長押し状態)」
という動作になった場合、
画面右を長押しし続けているものと判断されてしまうようで、
プレイヤーが永遠に右に進み続けてしまいます。
遊んでいる人としては、
左を押してるのになぜか右に進み続ける!とびっくりしてしまうようです。
ACTION_UP判定されないうちに、逆方向を長押しし始めてしまった場合でも、
押している方向にプレイヤーを進ませる方法はありますでしょうか?
よろしくお願いします。
該当のソースコード
java
1package com.hachiya.candyzombie; 2import android.app.Activity; 3import android.content.pm.ActivityInfo; 4import android.os.Bundle; 5import android.util.DisplayMetrics; 6import android.view.SurfaceView; 7 8public class MainActivity extends Activity{ 9 10 private SurfaceView view; 11 12 //画面サイズ 13 protected static int screenWidth; 14 protected static int screenHeight; 15 16 @Override 17 protected void onCreate(Bundle savedInstanceState) { 18 super.onCreate(savedInstanceState); 19 setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE); 20 21 DisplayMetrics dMetrics = new DisplayMetrics(); 22 getWindowManager().getDefaultDisplay().getMetrics(dMetrics); 23 24 screenWidth = dMetrics.widthPixels; 25 screenHeight = dMetrics.heightPixels; 26 27 setScreenPlay(); 28 } 29 30 //プレイ画面 31 public void setScreenPlay(){ 32 33 view = new MainView(this); 34 setContentView(view); 35 } 36}
java
1package com.hachiya.candyzombie; 2 3import android.content.Context; 4import android.content.res.Resources; 5import android.graphics.Bitmap; 6import android.graphics.BitmapFactory; 7import android.graphics.Canvas; 8import android.view.MotionEvent; 9import android.view.SurfaceHolder; 10import android.view.SurfaceView; 11 12// SurfaceViewクラスを継承したクラスを作成 13public class MainView extends SurfaceView implements SurfaceHolder.Callback, Runnable { 14 15 private Bitmap playBgImg1; 16 private Bitmap playBgImg1_1; 17 18 private int canvasWidth = MainActivity.screenWidth; 19 private int canvasHeight = MainActivity.screenHeight; 20 private int canvasCX = MainActivity.screenWidth / 2; 21 private int canvasCY = MainActivity.screenHeight / 2; 22 23 private Bitmap player; 24 private Bitmap player_1; 25 26 private int playerX = canvasCX; 27 private int playerY = canvasHeight - 250; 28 private int playerVX; 29 30 SurfaceHolder surfaceHolder; 31 Thread thread; 32 33 //コンストラクタ 34 public MainView(Context context) { 35 super(context); 36 37 surfaceHolder = getHolder(); 38 surfaceHolder.addCallback(this); 39 40 Resources res = this.getContext().getResources(); 41 42 //画像変換 43 playBgImg1 = BitmapFactory.decodeResource(res, R.drawable.bgimg3); 44 playBgImg1_1 = Bitmap.createScaledBitmap(playBgImg1, canvasWidth, canvasHeight, true); 45 46 player = BitmapFactory.decodeResource(res, R.drawable.player); 47 player_1 = Bitmap.createScaledBitmap(player, 120, 160, true); 48 } 49 50 @Override 51 public void surfaceCreated(SurfaceHolder holder) { 52 thread = new Thread(this); 53 thread.start(); 54 } 55 56 @Override 57 public void surfaceDestroyed(SurfaceHolder holder) { 58 thread = null; 59 } 60 61 @Override 62 public void surfaceChanged(SurfaceHolder holder, int format, int width, int height) { 63 64 } 65 66 //処理内容 67 @Override 68 public void run() { 69 70 Canvas canvas = null; 71 72 while (thread != null) { 73 74 try { 75 playerX += playerVX; 76 if (playerX > canvasWidth + 100) { 77 playerX = -100; 78 } else if (playerX < -100) { 79 playerX = canvasWidth + 100; 80 } 81 82 //描画開始 83 canvas = surfaceHolder.lockCanvas(); 84 85 //背景表示 86 canvas.drawBitmap(playBgImg1_1, 0, 0, null); 87 88 //プレイヤー表示 89 canvas.drawBitmap(player_1, playerX, playerY, null); 90 91 //描画終了 92 surfaceHolder.unlockCanvasAndPost(canvas); 93 } 94 catch (Exception e) { } 95 } 96 } 97 98 //タップされたとき 99 public boolean onTouchEvent(MotionEvent me) { 100 101 int x = (int) me.getX(); 102 int y = (int) me.getY(); 103 104 if (me.getAction() == MotionEvent.ACTION_DOWN) { 105 106 if (x > canvasCX) { 107 playerVX = 20; 108 } else { 109 playerVX = -20; 110 } 111 } 112 113 if (me.getAction() == MotionEvent.ACTION_UP) { 114 playerVX = 0; 115 } 116 117 return true; 118 } 119} 120 121
補足情報

回答2件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2018/06/22 12:52