teratail header banner
teratail header banner
質問するログイン新規登録
Java

Javaは、1995年にサン・マイクロシステムズが開発したプログラミング言語です。表記法はC言語に似ていますが、既存のプログラミング言語の短所を踏まえていちから設計されており、最初からオブジェクト指向性を備えてデザインされています。セキュリティ面が強力であることや、ネットワーク環境での利用に向いていることが特徴です。Javaで作られたソフトウェアは基本的にいかなるプラットフォームでも作動します。

Android

Androidは、Google社が開発したスマートフォンやタブレットなど携帯端末向けのプラットフォームです。 カーネル・ミドルウェア・ユーザーインターフェイス・ウェブブラウザ・電話帳などのアプリケーションやソフトウェアをひとつにまとめて構成。 カーネル・ライブラリ・ランタイムはほとんどがC言語/C++、アプリケーションなどはJavaSEのサブセットとAndroid環境で書かれています。

Android Studio

Android Studioは、 Google社によって開発された、 Androidのネイティブアプリケーション開発に特化した統合開発ツールです。

Q&A

解決済

2回答

1189閲覧

AndroidStudio onTouchEvent中の動作について教えていただきたいです。

hacchan

総合スコア14

Java

Javaは、1995年にサン・マイクロシステムズが開発したプログラミング言語です。表記法はC言語に似ていますが、既存のプログラミング言語の短所を踏まえていちから設計されており、最初からオブジェクト指向性を備えてデザインされています。セキュリティ面が強力であることや、ネットワーク環境での利用に向いていることが特徴です。Javaで作られたソフトウェアは基本的にいかなるプラットフォームでも作動します。

Android

Androidは、Google社が開発したスマートフォンやタブレットなど携帯端末向けのプラットフォームです。 カーネル・ミドルウェア・ユーザーインターフェイス・ウェブブラウザ・電話帳などのアプリケーションやソフトウェアをひとつにまとめて構成。 カーネル・ライブラリ・ランタイムはほとんどがC言語/C++、アプリケーションなどはJavaSEのサブセットとAndroid環境で書かれています。

Android Studio

Android Studioは、 Google社によって開発された、 Androidのネイティブアプリケーション開発に特化した統合開発ツールです。

0グッド

0クリップ

投稿2018/06/18 17:53

編集2018/06/18 17:58

0

0

前提・問題・実現したいこと

いつもお世話になっております。

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

補足情報

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答2

0

ベストアンサー

要はマルチタッチに対応したいということだと思います。MotionEventはマルチタッチに関する情報を含んでいるので、それを適切に処理するようにしてください。

java

1public boolean onTouchEvent(MotionEvent me) { 2 // 最新のタッチに関する座標を取得 3 int actionIndex = me.getActionIndex(); 4 int x = (int) me.getX(actionIndex); 5 int y = (int) me.getY(actionIndex); 6 7 switch (me.getActionMasked()) { 8 case MotionEvent.ACTION_DOWN: 9 // 最初のタッチ時の処理 10 case MotionEvent.ACTION_POINTER_DOWN: 11 // 2つ目以降のタッチ時の処理 12 if (x > canvasCX) { 13 playerVX = 20; 14 } else { 15 playerVX = -20; 16 } 17 break; 18 case MotionEvent.ACTION_POINTER_UP: 19 // 2つ目以降のタッチが離されたときの処理 20 break; 21 case MotionEvent.ACTION_UP: 22 // すべてのタッチが離されたときの処理 23 playerVX = 0; 24 break; 25 } 26}

参考:
https://developer.android.com/training/gestures/multi
https://qiita.com/tobira-code/items/a4e97ee775921da3334e

投稿2018/06/21 02:56

編集2018/06/21 02:56
kakajika

総合スコア3133

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

hacchan

2018/06/22 12:52

やりたかったことが実装できました。 ありがとうございました! マルチタッチという用語もわからず、下手な説明になってしまいましたが、 意図を汲み取っていただけて助かりました。
guest

0

画面のどこをタッチしているか、を読んで判定すればいいのでは

投稿2018/06/18 21:31

y_waiwai

総合スコア88180

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

hacchan

2018/06/19 03:46

onTouchEventの中で、どこをタッチしているかをint xとして取得して判定しているつもりなのですが、質問のような動作になってしまいます。
y_waiwai

2018/06/19 04:20

onTouchEventではタッチ/離したときだけの処理となるのでそうなりますね ここは、別スレッドを作り、常時タッチ位置監視するスレッドを走らせておいて、そこでタッチ位置で処理を変えるような司令メッセージを出して動作を変えさせる、とかなんとかする必要がありますね
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.30%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問