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

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

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

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

Android Studio

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

Q&A

2回答

1459閲覧

AndroidStudio(java)で画面遷移ができません

Oncho

総合スコア6

Java

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

Android Studio

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

0グッド

0クリップ

投稿2020/01/11 08:11

前提・実現したいこと

今、学校の課題でAndroidStudio/JAVAでの簡単なゲームを作成しなければならず、
シューティングゲームのようなものを作成しようとしています。

まだプログラミング自体も初心者で、サンプルのプログラムから作成しようとしていて
https://blog.goo.ne.jp/marunomarunogoo/e/f3d3ebc180046b2c5bf238fb5ed72c8c
のサイトのものが動作的にも分かりやすく、参考にさせていただいていて、これ自体では、正常に動いたのですが、ここに画面遷移を導入したく、まずスタート画面(MainActivity)を表示してそこにボタンを配置し、クリックされたら、ゲームの動作画面(CanvasView)に遷移する、というようなものを作成しようとしてます。

プログラムのコードにはエラー表示もないのですが、エミュレーターに表示させようとすると落ちて、-keeps stoppingと出てしまいます。

分かる方がいらっしゃれば、回答お願いします。
私自身プログラミング自体、初心者なので、細かく教えていただければ幸いです。

目標としては、敵が横移動していて、自機をタップすると球が出て、当たれば、あたり判定が行われる。というような単純なもので、もしほかにおススメのサンプルコードなどありましたら、そちらも教えていただければ幸いです。

よろしくお願いします。

発生している問題・エラーメッセージ

エラーメッセージ

該当のソースコード

MainActivity

import androidx.appcompat.app.AppCompatActivity;
import androidx.appcompat.widget.AppCompatImageView;

import android.content.Context;
import android.content.Intent;
import android.os.Bundle;
import android.view.View;
import android.widget.ImageView;

class MainActivity extends AppCompatActivity{

@Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); } public void onButton(View view){ Intent intent = new Intent(this,CanvasView.class); startActivity(intent); }

}

画面遷移先↓

CanvasView

import androidx.appcompat.app.AppCompatActivity;
import androidx.appcompat.widget.AppCompatImageView;
import android.content.Context;
import android.graphics.Canvas;
import android.graphics.Color;
import android.graphics.Paint;
import android.os.Bundle;
import android.util.AttributeSet;
import android.view.MotionEvent;
import android.widget.ImageView;
import android.widget.TextView;

public class CanvasView extends AppCompatImageView {

public CanvasView(Context context) { super(context); } public static final int BLOCK_SIZE = 20; public static final int NOT_VISIBLE = -1; public static final int DRAWING_INTERVAL = 50; public static final int[][] INVADER_IMAGE = { { 0, 0, 0, 1, 0, 1, 0, 0, 0 }, { 1, 0, 1, 1, 1, 1, 1, 0, 1 }, { 1, 1, 1, 0, 1, 0, 1, 1, 1 }, { 0, 0, 1, 1, 1, 1, 1, 0, 0 }, { 0, 0, 1, 1, 0, 1, 1, 0, 0 }, { 0, 0, 1, 0, 0, 0, 1, 0, 0 }, }; public static final int INVADER_WIDTH = INVADER_IMAGE[0].length * BLOCK_SIZE; public static final int INVADER_HEIGHT = INVADER_IMAGE.length * BLOCK_SIZE; public static final int INVADER_COLOR = Color.GREEN; public static final int INVADER_HITL_COLOR = Color.RED; public static final int INVADER_MOVING_UNIT = 1; public static final int DIRECTION_LEFT = -1; public static final int DIRECTION_RIGHT = 1; public static final int[][] GUN_IMAGE = { { 0, 0, 1, 1, 0, 0 }, { 1, 1, 1, 1, 1, 1 }, }; public static final int GUN_WIDTH = GUN_IMAGE[0].length * BLOCK_SIZE; public static final int GUN_HEIGHT = GUN_IMAGE.length * BLOCK_SIZE; public static final int GUN_MOVING_UNIT = 5; public static final int GUN_COLOR = Color.BLUE; public static final int[][] BULLET_IMAGE = { { 1 }, }; public static final int BULLET_WIDTH = BULLET_IMAGE[0].length * BLOCK_SIZE; public static final int BULLET_HEIGHT = BULLET_IMAGE.length * BLOCK_SIZE; public static final int BULLET_MOVING_UNIT = 50; public static final int BULLET_COLOR = Color.GREEN; private int score = 0; private int invaderPointX = 0; private int invaderPointY = 0; private int invaderMovingUnit = DIRECTION_RIGHT * INVADER_MOVING_UNIT; // (5) private int invaderColor = INVADER_COLOR; private int gunPointX; private int gunPointY; private int bulletPointX = NOT_VISIBLE; // 弾は最初は非表示 private int bulletPointY = NOT_VISIBLE; // 弾は最初は非表示 private TextView scoreView; public CanvasView(Context context, AttributeSet attrs, int defStyle) { super(context, attrs, defStyle); init(); } pubuic CanvasView(Context context, AttributeSet attrs) { super(context, attrs); init(); } private void init() { score = 0; invaderPointX = 0; invaderPointY = 0; invaderMovingUnit = DIRECTION_RIGHT * INVADER_MOVING_UNIT; invaderColor = INVADER_COLOR; bulletPointX = NOT_VISIBLE; bulletPointY = NOT_VISIBLE; System.out.printf("Canvas: (%d, %d)%n", getWidth(), getHeight()); System.out.printf("Invader: (%d, %d)%n", invaderPointX, invaderPointY); System.out.printf("Gun: (%d, %d)%n", gunPointX, gunPointY); System.out.printf("Bullet: (%d, %d)%n", bulletPointX, bulletPointY); } @Override protected void onSizeChanged(int w, int h, int oldw, int oldh) { super.onSizeChanged(w, h, oldw, oldh); System.out.printf("onSizeChanged: (%d, %d)%n", w, h); gunPointX = (w - GUN_WIDTH) / 2; gunPointY = h - GUN_HEIGHT; System.out.printf("Gun: (%d, %d)%n", gunPointX, gunPointY); } @Override protected void onDraw(Canvas canvas) { super.onDraw(canvas); clearScreen(canvas); drawInvader(canvas, invaderPointX, invaderPointY, invaderColor); invaderColor = INVADER_COLOR; drawBullet(canvas, bulletPointX, bulletPointY, BULLET_COLOR); drawGun(canvas, gunPointX, gunPointY, GUN_COLOR); invaderPointX = invaderPointX + invaderMovingUnit; if (isBorder(invaderPointX, INVADER_WIDTH)) { invaderMovingUnit = -invaderMovingUnit; } bulletPointY = bulletPointY - BULLET_MOVING_UNIT; if (isHit()) { score++; invaderColor = INVADER_HITL_COLOR; bulletPointX = NOT_VISIBLE; bulletPointY = NOT_VISIBLE; drawScore(score); } try { Thread.sleep(DRAWING_INTERVAL); } catch (InterruptedException e) { e.printStackTrace(); } } @Override public boolean onTouchEvent(MotionEvent event) { switch (event.getAction()) { case MotionEvent.ACTION_DOWN: assert true; break; case MotionEvent.ACTION_MOVE: moveGun((int) event.getX()); break; case MotionEvent.ACTION_UP: shot(); break; default: assert true; break; } invalidate(); return true; } private boolean isHit() { return bulletPointY >= 0 && (bulletPointY + BULLET_HEIGHT < invaderPointY + INVADER_HEIGHT) && (invaderPointX < bulletPointX) && (bulletPointX + BULLET_WIDTH < invaderPointX + INVADER_WIDTH); } private boolean isBorder(int x, int width) { return (x < 0) || (x > getWidth() - width); } private void clearScreen(Canvas canvas) { invalidate(); } private void drawInvader(Canvas canvas, int x, int y, int color) { Paint paint = new Paint(); paint.setColor(color); drawImage(canvas, paint, x, y, INVADER_IMAGE); } private void drawBullet(Canvas canvas, int x, int y, int color) { Paint paint = new Paint(); paint.setColor(color); drawImage(canvas, paint, x, y, BULLET_IMAGE); } private void drawGun(Canvas canvas, int x, int y, int color) { Paint paint = new Paint(); paint.setColor(color); drawImage(canvas, paint, x, y, GUN_IMAGE); } private void drawImage(Canvas canvas, Paint paint, int x, int y, int[][] image) { if (x == NOT_VISIBLE || y == NOT_VISIBLE) { return; } for (int i = 0; i < image.length; i++) { for (int j = 0; j < image[0].length; j++) { if (image[i][j] == 1) { canvas.drawRect(x + j * BLOCK_SIZE, y + i * BLOCK_SIZE, x + j * BLOCK_SIZE + BLOCK_SIZE, y + i * BLOCK_SIZE + BLOCK_SIZE, paint); // (11) } } } } private void drawScore(int score) { assert scoreView != null; scoreView.setText(Integer.toString(score)); } public void shot() { bulletPointX = gunPointX + (GUN_WIDTH - BULLET_WIDTH) / 2; bulletPointY = gunPointY; } private void moveGun(int x) { gunPointX = Math.max(Math.min(x, getWidth() - GUN_WIDTH), 0); } public TextView getScoreView() { return scoreView; } public void setScoreView(TextView scoreView) { this.scoreView = scoreView; }

}

試したこと

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

API16:Android 4.1(Jelly Bean)でやってます。
エミュレーター:Nexus6 API29

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

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

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

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

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

jimbe

2020/01/11 12:57

コードは専用のフォーマット枠があります. ファイル毎に, 入力枠の上辺にある <code> を押すと出てくる ``` で囲まれた "コード" という文字列を置き換える形で入力(コピペ)してください. その際, ``` の右にある "ここに言語を入力" を "java" と置き換えて頂きますと, さらに言語に合わせてフォント等が微調整されます. ご質問は編集できます. 入力枠の下にはプレビューもありますのでご確認ください.
guest

回答2

0

まずは簡単なActivity遷移のプログラムを作成して練習してみてはどうでしょうか。

[Android] アプリの画面を遷移させる - nyan のアプリ開発

AndroidにおけるActivityとは、1画面の機能を提供する部品です。このActivityの上に、ButtonやTextView、ImageViewなどの部品を配置することで、1画面を構成します。部品配置した編集結果はXMLファイルとして出力されるので、そのIDをsetContentView()で指定することで画面に描画することができます。

Activityの上に載せる部品は、そのまま使用するだけではなく、それを継承したクラスを自作することで機能拡張することができます。質問にあるCanvasViewはImageViewを継承したもので、Activityに載せるための1部品という位置付けです。「CanvasViewを呼び出す」のではなく、「レイアウトでCanvasViewを載せたActivityを呼び出す」という発想を持たなければなりません。

質問者様の目的を果たすには、最低でも

  • スタート画面となるActivity(Java)
  • スタート画面のレイアウト(XML)
  • ゲーム画面のActivity(Java)
  • ゲーム画面に載せるImageViewを継承したCanvasView(Java)
  • ゲーム画面のレイアウト(XML)

という5つの要素が必要になるでしょう。

下3つは参考ページにすでにあるものが使えるのですから、上2つを自分で新規に作成することになるでしょう。(jimbeさんがご指摘のサンプルが良くないという点はとりあえず置いておきます。)

また、プログラムを実行したときに最初に起動するActivityは、AndroidManifest.xmlというファイルで指示されています。これも編集する必要があります。もしここがよくわからなければ、「スタート画面となるActivity」を最初に作るActivityとしてプロジェクトを最初から作ってみるのも一つの方法かと思います。

投稿2020/01/12 08:00

keicha_hrs

総合スコア6768

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

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

Oncho

2020/01/12 09:15

とても分かりやすく、詳細に説明していただき、ありがとうございます。ロジックが分かってきたので、頑張ってみます!
guest

0

ぱっと見ですが

Intent intent = new Intent(this,CanvasView.class); startActivity(intent);

startActivity は名前の通り Activity を起動するものです.
CanvasView は

public class CanvasView extends AppCompatImageView

Activity ではありません.

投稿2020/01/11 13:04

jimbe

総合スコア12670

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

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

Oncho

2020/01/11 17:57

返信ありがとうございます。 遷移をさせるには、どのように改変するべきでしょうか? 勉強不足で申し訳ありません。
jimbe

2020/01/11 18:02

startActivity で画面遷移をするサンプルもどこかにあると思いますので, 探してみては如何でしょうか.
Oncho

2020/01/11 19:46

ちなみ、CanvasViewクラスとActivityのクラス間での画面遷移は可能なのでしょうか 理解不足ですみません。探してみます。
jimbe

2020/01/11 20:46

回答に書きました通りです. そもそも CanvasView 自体が何らかの Activity に配置されていなければ「これ自体では、正常に動いた」はずはありません. それをそのまま, ご提示の MainActivity から startActivity すれば良いのではないでしょうか.
jimbe

2020/01/11 21:00

只今参考にされたというサイトのコードを見たのですが, 作者さんは C++ 辺りの方なのでしょうか. (参考にされているので当然ご提示のコードもそうですが) onDraw で sleep などしてはいけません. その意味で android のサンプルとしては良くないように思います.
Oncho

2020/01/12 09:11

なるほどです。 色々いじってみます!ありがとうございます!!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

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

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

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

ただいまの回答率
85.47%

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

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

質問する

関連した質問