質問をすることでしか得られない、回答やアドバイスがある。

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

新規登録して質問してみよう
ただいま回答率
85.50%
Java

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

Android

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

Android Studio

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

Q&A

解決済

2回答

662閲覧

ゲーム的なアプリ スタートボタンについて

S.I

総合スコア48

Java

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

Android

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

Android Studio

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

0グッド

1クリップ

投稿2017/11/20 07:32

編集2017/11/25 08:15

画面右側は問題、操作画面(上下左右)、左側でねこが動きます。現段階では、操作ボタン(button1…うえ、button2…した、button3…ひだり、button4…みぎ)を押したら猫が一マスずつ移動します。また、障害物である犬の位置に到達すると初期位置に戻るためのダイアログが発生し、家に到達すると「せいかい!」のダイアログが発生します。さらに、ボタンを押した際、プログラムの流れの欄に矢印マーク(↑↓→←)が順番に表示されます。
ここでは、猫の位置を管理するために変数xと変数yを使用しています。

実現したいことは、猫をうえ、した、ひだり、みぎのボタンを押した際に動かすのではなく、「スタートボタン」を押した際に、「プログラムの流れ」欄に表示された通りに猫を動かし、ダイアログを発生させることです。
データベースを用いる必要はあるのか…

java

1public class MainActivity extends AppCompatActivity implements Animator.AnimatorListener { 2 final static float TRANSLATE_X = 310.0f; // 1回の操作でX軸方向にいくつ動かすか 3 final static float TRANSLATE_Y = 310.0f; // 1回の操作でY軸方向にいくつ動かすか 4 5 // 盤面上の開始座標を初期値として設定する 6 private int x = 0; 7 private int y = 0; 8 private String text; 9 private ArrayList<Integer> arrayList ; 10 11 @Override 12 protected void onCreate(Bundle savedInstanceState) { 13 super.onCreate(savedInstanceState); 14 setContentView(R.layout.activity_main); 15 16 Button btn1 = (Button) findViewById(R.id.button1); // うえ 17 Button btn2 = (Button) findViewById(R.id.button2); // した 18 Button btn3 = (Button) findViewById(R.id.button3); // ひだり 19 Button btn4 = (Button) findViewById(R.id.button4); // みぎ 20 Button btn5 = (Button) findViewById(R.id.button5); // やりなおし 21 Button btn6 = (Button) findViewById(R.id.button6); // スタート 22 23 text = ""; 24 final TextView result = (TextView) findViewById(R.id.result); 25 result.setText(""); 26 27 arrayList = new ArrayList<>(); 28 29 30 btn1.setOnClickListener(new View.OnClickListener() { 31 @Override 32 public void onClick(View v) { 33 arrayList.add(upAnimation(); 34 // 「うえ」を押したときの処理 35 if (y > -3) { 36 TextView result = (TextView) findViewById(R.id.result); 37 text += "<font color=#98fb98>↑</font>"; 38 result.setText(Html.fromHtml(text)); 39 } 40 } 41 }); 42 btn2.setOnClickListener(new View.OnClickListener() { 43 @Override 44 public void onClick(View v) { 45 arrayList.add(downAnimation(); 46 // 「した」を押したときの処理 47 if (y < 0) { 48 TextView result = (TextView) findViewById(R.id.result); 49 text += "<font color=#fffacd>↓</font>"; 50 result.setText(Html.fromHtml(text)); 51 } 52 } 53 }); 54 btn3.setOnClickListener(new View.OnClickListener() { 55 @Override 56 public void onClick(View v) { 57 arrayList.add(leftAnimation(); 58 // 「ひだり」を押したときの処理 59 if (x > 0) { 60 TextView result = (TextView) findViewById(R.id.result); 61 text += "<font color=#ffc0cb>←</font>"; 62 result.setText(Html.fromHtml(text)); 63 } 64 } 65 }); 66 btn4.setOnClickListener(new View.OnClickListener() { 67 @Override 68 public void onClick(View v) { 69 arrayList.add(rightAnimation(); 70 // 「みぎ」を押したときの処理 71 if (x < 2) { 72 TextView result = (TextView) findViewById(R.id.result); 73 text += "<font color=#afeeee>→</font>"; 74 result.setText(Html.fromHtml(text)); 75 } 76 } 77 }); 78 btn5.setOnClickListener(new View.OnClickListener() { 79 @Override 80 public void onClick(View v) { 81 text = ""; 82 TextView result = (TextView) findViewById(R.id.result); 83 result.setText(""); 84 } 85 }); 86 btn6.setOnClickListener(new View.OnClickListener(){ 87 @Override 88 public void onClick(View v) { 89 for(int i=0; i< arrayList.size(); i++){ 90 } 91 } 92 }); 93 } 94 95 private void animationImageView(String property, float start, float end) { 96 ImageView imageView = (ImageView) findViewById(MyCat); 97 ObjectAnimator animator = ObjectAnimator.ofFloat(imageView, property, start, end); 98 animator.setDuration(1000); 99 animator.addListener(this); 100 animator.start(); 101 } 102 103 private void animationImageReset() { 104 final ImageView MyCat = (ImageView) findViewById(R.id.MyCat); 105 ObjectAnimator.ofFloat(MyCat, "translationX", 0.0f, 0.0f).start(); 106 ObjectAnimator.ofFloat(MyCat, "translationY", 0.0f, 0.0f).start(); 107 } 108 109 private void encountDog() { 110 if (x == 1 && y == -2) { 111 AlertDialog.Builder dl = new AlertDialog.Builder(MainActivity.this); 112 dl.setTitle("ざんねん!!"); 113 dl.setMessage("いぬはしょうがいぶつだよ"); 114 dl.setPositiveButton("OK", new DialogInterface.OnClickListener() { 115 @Override 116 public void onClick(DialogInterface dialog, int which) { 117 x = 0; 118 y = 0; 119 animationImageReset(); 120 121 text = ""; 122 TextView result = (TextView) findViewById(R.id.result); 123 result.setText(""); 124 } 125 }); 126 dl.show(); 127 } 128 if (x == 2 && y == -3) { 129 AlertDialog.Builder dl = new AlertDialog.Builder(MainActivity.this); 130 dl.setTitle("せいかい!!"); 131 dl.setPositiveButton("こたえ", new DialogInterface.OnClickListener() { 132 @Override 133 public void onClick(DialogInterface dialog, int which) { 134 AlertDialog.Builder dl = new AlertDialog.Builder(MainActivity.this); 135 dl.setTitle("こたえ"); 136 dl.setMessage("①→→↑↑↑②↑↑↑→→③→↑→↑↑など"); 137 dl.setPositiveButton("つぎのもんだいへすすむ", null); 138 dl.show(); 139 } 140 }); 141 dl.setNegativeButton("つぎのもんだいへすすむ", null); //ボタン 142 dl.show(); 143 } 144 } 145 @Override 146 public void onAnimationStart(Animator animation) { 147 } 148 149 @Override 150 public void onAnimationEnd(Animator animation) { 151 // アニメーションが終了するとここが実行される 152 } 153 154 @Override 155 public void onAnimationCancel(Animator animation) { 156 } 157 158 @Override 159 public void onAnimationRepeat(Animator animation) { 160 } 161 162 private void upAnimation(){ 163 // 「うえ」を押したときの処理 164 if (y > -3) { 165 float start = TRANSLATE_Y * y; 166 float end = start - TRANSLATE_Y; 167 animationImageView("translationY", start, end); 168 y--; 169 encountDog(); 170 } 171 } 172 private void downAnimation(){ 173 // 「した」を押したときの処理 174 if (y < 0) { 175 float start = TRANSLATE_Y * y; 176 float end = start + TRANSLATE_Y; 177 animationImageView("translationY", start, end); 178 y++; 179 encountDog(); 180 } 181 } 182 private void leftAnimation(){ 183 // 「ひだり」を押したときの処理 184 if (x > 0) { 185 float start = TRANSLATE_X * x; 186 float end = start - TRANSLATE_X; 187 animationImageView("translationX", start, end); 188 x--; 189 encountDog(); 190 } 191 } 192 private void rightAnimation(){ 193 // 「みぎ」を押したときの処理 194 if (x < 2) { 195 float start = TRANSLATE_X * x; 196 float end = start + TRANSLATE_X; 197 animationImageView("translationX", start, end); 198 x++; 199 encountDog(); 200 } 201 } 202}

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

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

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

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

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

keicha_hrs

2017/11/20 08:23

「プログラムの流れの順番通り」というのは、うえ、したなどのボタンで操作して、「プログラムのながれ」欄に記録された操作履歴の通りに動かしたい、という解釈でいいのでしょうか?
S.I

2017/11/20 08:36

そうです。
S.I

2017/11/20 08:44

わかりにくくてすみません、修正します!
keicha_hrs

2017/11/20 09:01

いや、そうとしか受け取れないよな−と思いつつ念の為だったので・・・
guest

回答2

0

私は趣味でC++やっています。

ボタン押すたびに移動...じゃなくて 一括で移動 ( 上上下右... とユーザ側が動かしたい向き? をいくつも入れて、"OK" を押すと そのリスト通りに動く... っていう ) したいっていうことですよね。

それなら、

私なら、Javaなら ArrayListに データを突っ込んでその通りに動かします。

まず、例えば

UML風に書くと

  • moveButtonClicked(...) // "OK"ボタンが押されたとき
  • addDataToArray(...) // 上, 下, ...とかのボタンが押された
  • list : ArrayList<int>

があるとしたら、

addDataToArray: 上を指定したら listに 1, 下なら 2, 右なら 3, ...という風に追加していく これだけだとわかりにくいので、GUI側にも "上", "下"... を記述する moveButtonClicked: for( Object l : list ){ // キャラの移動 }

みたいにする。

そうすれば一度に処理できる。

別に 上: 1, 下: 2 ...みたいにする必要はないですが、思いついたので。

で、moveButtonClickedメソッドの for( Object l... ) は 名称は忘れましたが、

C++だと

C++

1for( auto a : 配列 ){ 2 3}

みたいに、配列やリストの長さ分行うやつ。

JavaはすべてのクラスはObjectを継承しているようなので、

Objectとして受け取っています。

C++でいうautoはJavaではどうやるか

投稿2017/11/20 08:33

BeatStar

総合スコア4958

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

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

S.I

2017/11/20 08:42

ありがとうございます。ArrayListで試してみようと思います。
guest

0

ベストアンサー

これは意外と厄介ですね。

操作の履歴を記録するのは、先に出ている答えの通りArrayListを用いればいいでしょうが、再現を行う処理はいろいろ考える必要がありそうです。当然、アニメーションしながら再現を行うことを考えておられると思いますが、ArrayListから取り出した端から処理をボンボン行うのではなく、1つのアニメーションが終わるのを待ってから次のアニメーションを実行しないと、思ったように再現されないでしょう。そこをうまく考える必要があります。

「1つのアニメーションが終わるのを待つ」というところが、「意外と厄介」になる部分です。Javaには時間稼ぎをするためのメソッドも存在しますが、単純にそれを「待つ」部分に突っ込んでしまうと、アプリが強制終了してしまうことでしょう。onCreateやonClickなどAndroidのイベントによって実行されるメソッドは、迅速に処理を終えて抜けるのが大原則です。それらの中で時間がかかる処理を行うと、強制終了されてしまいます。

それを避けるためには、Handlerを用いたり、ThreadやAsyncTaskのような別スレッドとして動作するオブジェクトを作成して、非同期処理として実装したりといったことが必要になります。まずはその辺りのキーワードを検索して、下調べしてみてはどうでしょうか。


非同期処理は必要なさそうですね。

アニメーション処理には、「アニメーションが始まった」「アニメーションが終わった」のようなイベントを取得するためのAnimator.AnimatorListenerというインターフェイスがあります。それを下のようにして実装します。

Java

1// 末尾にimplements Animator.AnimatorListenerを加える 2public class MainActivity extends AppCompatActivity implements Animator.AnimatorListener { 3 4 // 中略 5 6 private void animationImageView(String property, float start, float end) { 7 ImageView imageView = (ImageView) findViewById(MyCat); 8 ObjectAnimator animator = ObjectAnimator.ofFloat(imageView, property, start, end); 9 animator.setDuration(1000); 10 animator.addListener(this); // この行を加える 11 animator.start(); 12 } 13 14 // 中略 15 16 // 下記の4つのメソッドを加える 17 // 実装必須なのですることがなくても空のメソッドを記述する必要あり 18 @Override 19 public void onAnimationStart(Animator animation) { 20 } 21 22 @Override 23 public void onAnimationEnd(Animator animation) { 24 // アニメーションが終了するとここが実行される 25 } 26 27 @Override 28 public void onAnimationCancel(Animator animation) { 29 } 30 31 @Override 32 public void onAnimationRepeat(Animator animation) { 33 } 34}
  • 履歴を記録するためのArrayList
  • 再生処理中であることを示すフラグ
  • 何手目まで再生したか数えるカウンター

をフィールド変数として用意しておけばいいでしょう。

「スタート」ボタンを押したら
0. ArrayListが空っぽでなければ
0. フラグを有効にして
0. ArrayListから1手目を取り出してアニメーション開始

というところまでをonClickに記述します。

onAnimationEndには、
0. フラグが有効だったら
0. ArrayListに格納されている数がカウンターの値未満だったら
0. カウンターを1増やして
0. ArrayListからカウンターの値に従った手を取り出してアニメーション開始

という処理を実装すればいいんじゃないですかね。そうすれば、アニメーションが終わる度にonAnimationEndが呼び出され、カウンターの値がArrayListの格納数に満ちるまで繰り返してくれます。

そんな感じでいけるんじゃないかな?


(2017/11/24 15:25追記)
このような感じにしたらというサンプルです。

Java

1public class MainActivity extends AppCompatActivity implements Animator.AnimatorListener { 2 3 // 中略 4 5 private ArrayList<Integer> mHistory; // 履歴を格納するリスト 6 private boolean mReplayFlag; // 再生中であることを示すフラグ 7 private int mReplayCount; // 再生経過のカウンター 8 9 // 中略 10 11 @Override 12 protected void onCreate(Bundle savedInstanceState) { 13 super.onCreate(savedInstanceState); 14 setContentView(R.layout.activity_main); 15 16 // 初期値をセット 17 mHistory = new ArrayList<>(); 18 mReplayFlag = false; 19 mReplayCount = 0; 20 21 // 中略 22 23 btn6.setOnClickListener(new View.OnClickListener() { 24 // スタートボタンを押したときの処理 25       @Override 26 public void onClick(View v) { 27 // isEmpty()でリストが空っぽではない(1手以上の記録がある)か調べる 28 if (!mHistory.isEmpty()) { 29 // 猫を最初の位置に戻す 30 x = 0; 31 y = 0; 32 animationImageReset(); 33 34 mReplayFlag = true; // 再生中にする 35 animationReplay(); // 再生する(ここでは1手目だけ、以後はonAnimationEndに任せる) 36 } 37 } 38 }); 39 40     // 中略 41 } 42 43 private void animationReplay() { 44 if (mReplayFlag) { 45 int dir = mHistory.get(mReplayCount); // リストから取り出し 46 47 switch (dir) { 48 case 0: // 0は上を意味する 49 upAnimation(); 50 break; 51 case 1: // 1は下を意味する 52 downAnimation(); 53 break; 54 case 2: // 2は左を意味する 55 leftAnimation(); 56 break; 57 case 3: // 3は右を意味する 58 rightAnimation(); 59 break; 60 } 61 62 mReplayCount++; // カウンターを増やす 63 64 // 再生終了したらフラグをクリアする 65 if (mReplayCount == mHistory.size()) { 66 mReplayFlag = false; 67 mReplayCount = 0; 68 } 69 } 70 } 71 72 // 中略 73 74 // アニメーションが終了したらこのメソッドが実行される 75 @Override 76 public void onAnimationEnd(Animator animation) { 77 if (mReplayFlag) { 78 animationReplay(); // 再生する 79 } 80 } 81

投稿2017/11/20 10:03

編集2017/11/24 07:08
keicha_hrs

総合スコア6766

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

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

S.I

2017/11/20 10:30

仰る通り、アニメーションで考えています。そのままArrayListを用いたとしても、データが重くてアプリが終了するため別スレッドにて実装する必要があるということですね!(違ったらすみません…) コメントいただいたキーワードをもとに調べてみます!
S.I

2017/11/21 10:52

HandlerやThreadやAsyncTaskなどいずれを使うにしても、操作の履歴を記録するためのArrayListは使用するのでしょうか。
keicha_hrs

2017/11/21 13:48

あー。非同期処理なんか使わなくてもできそうだなあ。ちょっと待ってください、よく考えて例を示すつもりなので・・・。 記録のためにArrayListを使うというのは変わりないです。
keicha_hrs

2017/11/21 16:24

こう作ってみたらというプランを回答に追記しました。非同期処理は使わなくても実現できますね。混乱させて申し訳ないです。
S.I

2017/11/22 11:41

コードを変更したのですが、btn1~4のonClick内arrayList.add(upAnimation();部分の「;」に赤線のエラーが発生してしまいました、なにかが足りないのでしょうか…。また、再生処理中であることを示すフラグと何手目まで再生したか数えるカウンターがよくわからないのですが、もう少し詳しく教えていただくことは可能でしょうか…すみません…
keicha_hrs

2017/11/22 16:28

どこから手をつければいいんだろ。参ったな^^; ArrayListはこの課題をちょっと離れて、普通のJava学習サイトの課題を勉強した方がいいような気はします。例えばこんなところとか。 https://www.javadrive.jp/start/arraylist/index1.html なんか「メソッドを突っ込もう」としているように感じるのですが、それは無茶ですね。 private ArrayList<Integer> arrayList ; のように宣言されていますが、これも何となくだったのかな?ただ、これで「Integer型の値を格納するArrayList」という宣言になっていますので、この宣言で活用できますよね。例えば0~3の数値にそれぞれ上、下、左、右という意味を持たせることにすれば、例えば上ボタンの処理では btn1.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { // 「うえ」を押したときの処理 if (y > -3) { upAnimation(); TextView result = (TextView) findViewById(R.id.result); text += "<font color=#98fb98>↑</font>"; result.setText(Html.fromHtml(text)); arrayList.add(0); // 0は上を意味する } } }); のようにすればいいんじゃないですか。 残りはちょっと明日にさせてください・・・。
S.I

2017/11/24 04:53

ご回答ありがとうございます。 private ArrayList<Integer> arrayList ; という宣言は、他サイトを参考にしました。勉強不足なので、Java学習も並行していきます… arrayList.add(0); という部分に「上」という意味を持たせるためにはどうするのでしょうか…
keicha_hrs

2017/11/24 07:08 編集

遅くなりましたが、このような感じにしたらどうかというサンプルを回答欄に追加しました。ArrayListに追加した数値に意味を持たせるのは、自分のプログラムで行う「仕事」です。それを行っているのがanimationReplayというメソッドですが、0なら上の処理、1なら下の処理というように、取り出した値によって処理を振り分けます。「値に意味を持たせる」というのが誤解を招いたかな?意味は「自分で作る」のです。
S.I

2017/11/25 02:30

わかりました。ありがとうございます!
S.I

2017/11/25 08:14

実機で再生できました!説明が本当にわかりやすくて助かります…本当にありがとうございます(T_T);
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問