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

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

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

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

Android Studio

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

Q&A

1回答

600閲覧

生成した乱数を元に画像の出現位置(Y座標)を設定したい。

Reon

総合スコア3

Java

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

Android Studio

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

0グッド

0クリップ

投稿2023/01/12 05:17

はじめまして!
AndroidStudio(使用言語はJavaです)でキャッチングゲームを作成してました。
流れてきた画像を流し直す際にY座標を乱数を元に設定したいのですが乱数生成の箇所でエラーが出てしまいました。
ご回答よろしくお願いいたします。

実現したいこと

・乱数を生成して、生成した乱数を元に画像のY座標を設定したい。

該当のソースコード

Java

1package com.example.mogmogapp; 2 3import androidx.appcompat.app.AppCompatActivity; 4import androidx.constraintlayout.widget.ConstraintLayout; 5 6import android.content.Intent; 7import android.graphics.Point; 8import android.os.Bundle; 9import android.os.Handler; 10import android.view.Display; 11import android.view.MotionEvent; 12import android.view.View; 13import android.view.WindowManager; 14import android.widget.Button; 15import android.widget.ImageView; 16import android.widget.TextView; 17 18import java.util.Random; 19import java.util.Timer; 20 21public class PlayActivity extends AppCompatActivity { 22 23 private Timer PlayTimer; // タイマー用 24 private int timecount = 40;// タイマーカウント 25 private int scoreVal = 0; // スコア 26 private int count = 1000; 27 private final Handler mHandler = new Handler(); //UI Threadへのpost用ハンドラ 28 private final Handler mHandler2 = new Handler(); 29 30 private Runnable runnable; 31 private Runnable runnable2; 32 33 34 private Random random = new Random(); 35 private int a = 0; 36 private int b = 0; 37 private int c = 0; 38 39 private ConstraintLayout layout; 40 41 42 /*テキスト*/ 43 private TextView textTimeVal; 44 private TextView counttext; 45 46 /*スコア*/ 47 private TextView scoreText; 48 49 /*サイズ*/ 50 private int huntersize; 51 52 /*画像用*/ 53 private ImageView raou; 54 private ImageView hunter; 55 private ImageView maikusa; 56 private ImageView yakuza; 57 private ImageView udekumi; 58 59 /*ボタン用*/ 60 private Button upbtn; 61 private Button dwnbtn; 62 63 /*座標位置用*/ 64 private float raouX = 2200f; 65 private float raouY; 66 private float maikusaX = 1900f; 67 private float maikusaY; 68 private float udekumiX= 2500f; 69 private float udekumiY; 70 private float yakuzaX = 2300f; 71 private float yakuzaY; 72 private float hunterX; 73 private float hunterY; 74 75 76 /*画面のサイズ用*/ 77 private float screenx; 78 private float screeny; 79 80 81 @Override 82 protected void onCreate(Bundle savedInstanceState) { 83 super.onCreate(savedInstanceState); 84 setContentView(R.layout.activity_play); 85 86 // imageViewのIDの取得 87 raou = findViewById(R.id.raou); 88 maikusa = findViewById(R.id.maikusa); 89 udekumi = findViewById(R.id.udekumi); 90 yakuza = findViewById(R.id.yakuza); 91 hunter = findViewById(R.id.hunter); 92 scoreText = findViewById(R.id.scoreText); 93 counttext = findViewById(R.id.counttext); 94 95 textTimeVal = findViewById(R.id.textTimeVal); 96 97 // ボタンのIDの取得 98 upbtn = findViewById(R.id.Upbtn); 99 dwnbtn = findViewById(R.id.Dwnbtn); 100 101 //プレイ範囲の獲得 102 //layout = findViewById(R.id.play_activity); 103 104 // 画面範囲の取得 105 layout = findViewById(R.id.play_activity); 106 screenx = layout.getWidth(); 107 screeny = layout.getHeight() - textTimeVal.getHeight(); 108 109 110 // 座標セット 111 raou.setX(raouX); 112 maikusa.setX(maikusaX); 113 udekumi.setX(udekumiX); 114 yakuza.setX(yakuzaX); 115 116 117 // タイマーインスタンス生成 118 this.PlayTimer = new Timer(); 119 this.textTimeVal = (TextView) findViewById(R.id.textTimeVal); 120 121 122 // タイマーセット 123 runnable = new Runnable() { 124 @Override 125 public void run() { 126 if (timecount == 0) { 127 // 画面遷移(ランキング画面へ) 128 Intent intent = new Intent(getApplicationContext(), RankingDisp.class); 129 //intent.putExtra("YOUR_SCORE", scoreVal); 130 startActivity(intent); 131 132 133 } else { 134 timecount--; 135 textTimeVal.setText(String.valueOf(timecount)); 136 mHandler.postDelayed(runnable, 1000); 137 } 138 } 139 }; 140 mHandler.postDelayed(runnable, 1000); 141 textTimeVal.setText(String.valueOf(timecount)); 142 143 144 // 獲物の動きスピード設定 145 runnable2 = new Runnable() { 146 @Override 147 public void run() { 148 149 150 // ここでx座標の値を変更する 151 if (timecount != 0) { 152 153 //ラ王の画像移動処理 154 raouX -= 15f; 155 if (raouX < screenx){ 156 raouX = 2185f; 157 158 /*ここで乱数生成*/ 159 Random random = new Random(); 160 int y = random.nextInt((int)screeny); 161 raouY = y; 162 163 164 } 165 raou.setX(raouX);// 2185 166 raou.setY(raouY);// 0.0 167 168 169 //舞草の画像移動処理 170 maikusaX -= 15f; 171 if (maikusaX < screenx){ 172 maikusaX = 1900f; 173 } 174 maikusa.setX(maikusaX); 175 176 177 //腕組の画像移動処理 178 udekumiX -= 15f; 179 if (udekumiX < screenx){ 180 udekumiX = 2500f; 181 } 182 udekumi.setX(udekumiX); 183 184 185 //やくざの画像移動処理 186 yakuzaX -= 15f; 187 if (yakuzaX < screenx){ 188 yakuzaX = 2300f; 189 } 190 yakuza.setX(yakuzaX); 191 192 193 //count--; 194 counttext.setText(String.valueOf(count)); 195 mHandler2.postDelayed(runnable2, 100); 196 } 197 else { 198 //count--; 199 counttext.setText(String.valueOf(count)); 200 mHandler2.postDelayed(runnable2, 100); 201 } 202 } 203 }; 204 mHandler2.postDelayed(runnable2, 100); 205 counttext.setText(String.valueOf(count)); 206 207 208 209 /*上ボタンの挙動設定*/ 210 upbtn.setOnClickListener(new View.OnClickListener() { 211 @Override 212 public void onClick(View v) { 213 hunterY = hunter.getY(); 214 hunter.setY(hunterY - 20f); 215 } 216 }); 217 218 /*下ボタンの挙動設定*/ 219 dwnbtn.setOnClickListener(new View.OnClickListener() { 220 @Override 221 public void onClick(View v) { 222 hunterY = hunter.getY(); 223 hunter.setY(hunterY + 20f); 224 } 225 }); 226 } 227 228 229 230 231 232 public void onClick(View v) { 233 // runnableを無効にする 234 mHandler.removeCallbacks(runnable); 235 236 // intentでリクエストする 237 Intent intent = new Intent(this, RankingDisp.class); 238 startActivity(intent); 239 finish(); 240 } 241 242}

試したこと

乱数の生成位置を変更してみましたが結果は変わらず。

補足情報(FW/ツールのバージョンなど)

android-studio-2021.2.1.15-windows

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

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

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

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

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

jimbe

2023/01/12 17:08 編集

エラーの詳細を提示してください。 Random#nextInt で IllegalArgumentException であれば、 screeny が 0 (以下) の可能性があります。 表示されていない onCreate の実行の段階では View の大きさがまだ決まらず、 getHeight() 等が 0 を返す場合があります。 時々ゲームのキャラとして View を用いる方がいらっしゃいますが、 View は TextView, EditText から Button までほぼ全てのコンポーネントの親クラスで多数のフィールドを持つかなり巨大なオブジェクトであり、ただ移動する画像のためだけに使うのは無駄が多すぎます。 SurfaceView 土台に各キャラ画像を直接表示する方法でも手間は同じで、アプリとしては軽くなると思います。 AndroidのSurfaceViewの基礎 https://qiita.com/croquette0212/items/24dc2b6de3730e831aab
Reon

2023/01/13 00:15

ご回答ありがとうございます。! エラーは出てないんですけど、実行してYの座標が切り替わる処理の時にアプリが落ちてしまう状態でして。
jimbe

2023/01/13 02:35 編集

「エラーが出てしまいました」と書かれていますけど。 落ちたときに出ているはずです。
guest

回答1

0

乱数生成の箇所でエラーが出てしまいました。

「どんなエラーが出たか」は問題解決の際とても大きな情報です。原文そのまま明記してください。それだけ解決が早くなります。

軽く見た感じ、

public class PlayActivity extends AppCompatActivity { private Timer PlayTimer; // タイマー用 private int timecount = 40;// タイマーカウント private int scoreVal = 0; // スコア private int count = 1000; private final Handler mHandler = new Handler(); //UI Threadへのpost用ハンドラ private final Handler mHandler2 = new Handler(); private Runnable runnable; private Runnable runnable2; private Random random = new Random();

ここで既に乱数用インスタンスを生成しているのに

/*ここで乱数生成*/ Random random = new Random(); int y = random.nextInt((int)screeny); raouY = y;

同じ変数名で再生成してるのが原因じゃないかなぁと思いますが

投稿2023/01/12 05:59

pig_vba

総合スコア807

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

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

Reon

2023/01/13 00:21

ご回答ありがとうございます。! エラーは出てないんですけど、実行してYの座標が切り替わる処理の時にアプリが落ちてしまう状態でして。 よろしくお願いいたします。
pig_vba

2023/01/13 00:37

エラーが出るのとアプリの強制終了(クラッシュ)は全く意味が異なります。それは質問文に明記するべき情報なので質問文の修正をお願いします。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問