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

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

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

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

Android Studio

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

Kotlin

Kotlinは、ジェットブレインズ社のアンドリー・ブレスラフ、ドミトリー・ジェメロフが開発した、 静的型付けのオブジェクト指向プログラミング言語です。

Q&A

解決済

2回答

886閲覧

画面遷移ができません

Jhon_McClane

総合スコア48

Java

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

Android Studio

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

Kotlin

Kotlinは、ジェットブレインズ社のアンドリー・ブレスラフ、ドミトリー・ジェメロフが開発した、 静的型付けのオブジェクト指向プログラミング言語です。

0グッド

0クリップ

投稿2020/04/02 10:00

https://codeforfun.jp/android-studio-catch-the-ball-intro/
上記のサイトでゲームアプリを作ったのですが結果画面への遷移ができません。
画面の遷移には条件があるのでしょうか。

package com.example.catchtheball; import androidx.appcompat.app.AppCompatActivity; import android.content.Intent; import android.graphics.Point; import android.os.Bundle; import android.os.Handler; import android.view.Display; import android.view.MotionEvent; import android.view.View; import android.view.WindowManager; import android.widget.FrameLayout; import android.widget.ImageView; import android.widget.TextView; import java.util.Timer; import java.util.TimerTask; public class MainActivity extends AppCompatActivity { private TextView scoreLabel; private TextView startLabel; private ImageView box; private ImageView orange; private ImageView black; private ImageView pink; //位置 private float boxY; private float orangeX; private float orangeY; private float blackX; private float blackY; private float pinkX; private float pinkY; //スコア private int score = 0; //サイズ private int frameHeight; private int boxSize; private int screenWidth; private int screenHeight; //Handler & Timer private Handler handler = new Handler(); private Timer timer = new Timer(); //Status private boolean action_flag = false; private boolean start_flag = false; //ゲーム開始前(false) プレイ中(true) //speed private int boxSpeed; private int orangeSpeed; private int blackSpeed; private int pinkSpeed; //Sound private SoundPlayer soundPlayer; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); soundPlayer = new SoundPlayer(this); scoreLabel = findViewById(R.id.scoreLabel); startLabel = findViewById(R.id.startLabel); box = findViewById(R.id.box); orange = findViewById(R.id.orange); black = findViewById(R.id.black); pink = findViewById(R.id.pink); //ScreenSize WindowManager wm = getWindowManager(); Display display = wm.getDefaultDisplay(); Point size = new Point(); display.getSize(size); screenWidth = size.x; screenHeight = size.y; boxSpeed = Math.round(screenHeight / 60f); orangeSpeed = Math.round(screenWidth / 60f); blackSpeed = Math.round(screenWidth / 45f); pinkSpeed = Math.round(screenWidth / 36f); orange.setX(-80.0f); orange.setY(-80.0f); pink.setX(-80.0f); pink.setY(-80.0f); black.setX(-80.0f); black.setY(-80.0f); scoreLabel.setText("score : 0"); //ゲームスタート時点のスコア表示 } public void changePos(){ //changePos 内でボックスとボールを動かす前に、毎回 hitCheck を呼ぶことで衝突判定を行います。 hitCheck(); //Boxの処理 if(action_flag){ boxY -= boxSpeed; //UP }else{ boxY += boxSpeed; //DOWN } if(boxY < 0 ) boxY = 0; if(boxY > frameHeight -boxSize) boxY = frameHeight - boxSize; box.setY(boxY); //orange-Ballの処理 orangeX -= orangeSpeed; if(orangeX < 0){ orangeX = screenWidth + 20; orangeY = (float)Math.floor(Math.random() * (frameHeight - orange.getHeight())); } orange.setX(orangeX); orange.setY(orangeY); //black-Ballの処理 blackX -= blackSpeed; if(blackX < 0){ blackX = screenWidth + 10; blackY = (float)Math.floor(Math.random() * (frameHeight - black.getHeight())); } black.setX(blackX); black.setY(blackY); //pink-Ballの処理 pinkX -= pinkSpeed; if(pinkX < 0){ pinkX = screenWidth + 5000; pinkY = (float)Math.floor(Math.random() * (frameHeight - pink.getHeight())); } pink.setX(pinkX); pink.setY(pinkY); scoreLabel.setText("Score : " +score); } public void hitCheck(){ //orange-Ball float orangeCenterX = orangeX + orange.getWidth() / 2; float orangeCenterY = orangeY + orange.getHeight() / 2; if(hitStatus(orangeCenterX, orangeCenterY)){ orangeX = -10.0f; score += 10; soundPlayer.playHitSound(); } //pink-Ball float pinkCenterX = pinkX + pink.getWidth() / 2; float pinkCenterY = pinkY + pink.getHeight() / 2; if(hitStatus(pinkCenterX, pinkCenterY)){ pinkX = -10.0f; score += 30; soundPlayer.playHitSound(); } // Black-ball float blackCenterX = blackX + black.getWidth() / 2; float blackCenterY = blackY + black.getHeight() / 2; if(hitStatus(blackCenterX, blackCenterY)){ soundPlayer.playOverSound(); // Game Over! if (timer != null) { timer.cancel(); timer = null; } // 結果画面へ Intent intent = new Intent(getApplicationContext(),ResultActivity.class); intent.putExtra("SCORE",score); startActivity(intent); } } public boolean hitStatus(float centerX,float centerY){ return (0 <= centerX && centerX <= boxSize && boxY <= centerY && centerY <= boxY + boxSize) ? true : false; } @Override public boolean onTouchEvent(MotionEvent event) {//onTouchEvent では、初めて画面がタップされた時に if (start_flag == false) { start_flag = true; // start_flg を true にする FrameLayout frame = findViewById(R.id.frame); frameHeight = frame.getHeight(); boxY = box.getY(); boxSize = box.getHeight(); /*startLabel.setVisibility(View.INVISIBLE); startLabel.setVisibility(View.GONE); INVISIBLE は非表示にするだけ、GONE は完全に消すという違いがあります*/ startLabel.setVisibility(View.GONE); //startLabel を消す //タイマーを開始 という処理を行います。 //schedule(TimerTask task, long delay, long period) //task : 実行する処理 //delay : タスクを実行するまでに待機する時間(ミリ秒で指定) //period : タスクの実行間隔(ミリ秒で指定) timer.schedule(new TimerTask() { @Override public void run() { handler.post(new Runnable() { @Override public void run() { changePos(); } }); } }, 0, 20); } else { if (event.getAction() == MotionEvent.ACTION_DOWN) { //boxの位置を上に移動させます. フラグをオンにする action_flag = true; } else if (event.getAction() == MotionEvent.ACTION_UP) { action_flag = false; } } return true; } @Override public void onBackPressed() { super.onBackPressed(); } }
package com.example.catchtheball; import androidx.appcompat.app.AppCompatActivity; import android.content.Intent; import android.content.SharedPreferences; import android.os.Bundle; import android.view.View; import android.widget.TextView; public class ResultActivity extends AppCompatActivity { @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_result); TextView scoreLabel = findViewById(R.id.scoreLabel); TextView highScoreLabel = findViewById(R.id.highScoreLabel); int score = getIntent().getIntExtra("SCORE",0); //setTextには文字列を指定する必要がありますが、score はint型です。 //このような場合は「 + ""」とするだけで文字列として扱えるようになります。 scoreLabel.setText(score + ""); SharedPreferences sharedPreferences = getSharedPreferences("GAME_DATA",MODE_PRIVATE); int highScore = savedInstanceState.getInt("HIGH_SCORE : ",score); if(score > highScore) { highScoreLabel.setText("HIGH_SCORE : " + score); SharedPreferences.Editor editor = sharedPreferences.edit(); editor.putInt("HIGH_SCORE" ,score); editor.apply(); }else{ highScoreLabel.setText("HIGH_SCORE : "+ highScore); } } public void tryAgain(View view){ startActivity(new Intent(getApplicationContext(),MainActivity.class)); } @Override public void onBackPressed() { super.onBackPressed(); } }
package com.example.catchtheball; import androidx.appcompat.app.AppCompatActivity; import android.content.Intent; import android.os.Bundle; import android.view.View; public class StartActivity extends AppCompatActivity { @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_start); } public void startGame(View view){ startActivity(new Intent(getApplicationContext(),MainActivity.class)); } }

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

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

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

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

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

jimbe

2020/04/02 11:46

> 遷移ができません どうなるのでしょう.
keicha_hrs

2020/04/02 14:01

タグにKotlinが付けられていますが、提示された情報にKotlinによるコードはありませんので、外すべきでしょう。
guest

回答2

0

ベストアンサー

ResultActivityにある

java

1 int highScore = savedInstanceState.getInt("HIGH_SCORE : ",score);

の意図が不明です。savedInstanceStateはonCreate()の引数として受け取っていますが、この変数の値は普通にActivityが生成された場合にはnullです。ですから、上記のような処理を行うと、確実に「nullであるsavedInstanceStateを参照した」ことによりNullPointerExceptionが発生し、アプリが落ちます。

savedInstanceStateの役割は別途調べていただくとして(検索すればすぐに出てきます)、なぜこの処理を必要としたのか今一度精査し、nullではないときに参照するようにコードを書き換えるなど、改良が必要でしょう。


参考にしたというページを見てみると、

java

1 SharedPreferences sharedPreferences = getSharedPreferences("GAME_DATA", MODE_PRIVATE); 2 int highScore = sharedPreferences.getInt("HIGH_SCORE", 0);

のようになっているようですね。単純にsharedPreferencesとすべきところを、誤ってsavedInstanceStateと打ち間違えた(補完候補で出てきた別変数を選択してしまった)だけなのでしょうかね。

投稿2020/04/02 14:00

編集2020/04/02 14:06
keicha_hrs

総合スコア6768

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

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

Jhon_McClane

2020/04/03 11:49

ありがとうございます。解決しました。打ち間違いによるものでした。
guest

0

LogCat を見ると

plain

1 java.lang.RuntimeException: Unable to start activity ComponentInfo{com.example.q250947/com.example.q250947.ResultActivity}: java.lang.NullPointerException: Attempt to invoke virtual method 'int android.os.Bundle.getInt(java.lang.String, int)' on a null object reference 2 at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2913) 3 at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:3048) 4 at android.app.servertransaction.LaunchActivityItem.execute(LaunchActivityItem.java:78) 5 at android.app.servertransaction.TransactionExecutor.executeCallbacks(TransactionExecutor.java:108) 6 at android.app.servertransaction.TransactionExecutor.execute(TransactionExecutor.java:68) 7 at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1808) 8 at android.os.Handler.dispatchMessage(Handler.java:106) 9 at android.os.Looper.loop(Looper.java:193) 10 at android.app.ActivityThread.main(ActivityThread.java:6669) 11 at java.lang.reflect.Method.invoke(Native Method) 12 at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:493) 13 at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:858) 14 Caused by: java.lang.NullPointerException: Attempt to invoke virtual method 'int android.os.Bundle.getInt(java.lang.String, int)' on a null object reference 15 at com.example.q250947.ResultActivity.onCreate(ResultActivity.java:30) 16 at android.app.Activity.performCreate(Activity.java:7136) 17 at android.app.Activity.performCreate(Activity.java:7127) 18 at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1271) 19 at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2893) 20 at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:3048)  21 at android.app.servertransaction.LaunchActivityItem.execute(LaunchActivityItem.java:78)  22 at android.app.servertransaction.TransactionExecutor.executeCallbacks(TransactionExecutor.java:108)  23 at android.app.servertransaction.TransactionExecutor.execute(TransactionExecutor.java:68)  24 at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1808)  25 at android.os.Handler.dispatchMessage(Handler.java:106)  26 at android.os.Looper.loop(Looper.java:193)  27 at android.app.ActivityThread.main(ActivityThread.java:6669)  28 at java.lang.reflect.Method.invoke(Native Method)  29 at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:493)  30 at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:858) 

と NullPointerException が発生しています. (パッケージを com.example.q250947 としています.)

ResultActivity.java:30 辺りにある savedInstanceState.getInt が間違えていないか確認してください.

投稿2020/04/02 12:39

jimbe

総合スコア12632

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

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

Jhon_McClane

2020/04/03 11:48

ありがとうございます。解決しました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問