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

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

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

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

Q&A

1回答

2762閲覧

Java ブロック崩しのブロック表示

fuj1ringo

総合スコア8

Java

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

0グッド

1クリップ

投稿2016/03/16 08:02

編集2016/03/16 22:24

java初心者です。
ブロック崩しのようなものを作りたいのですが、アプレットでブロックを表示する事ができません。
以下のコードにどのような間違いがあるのでしょうか?(htmlは別で作ってあります。)
玉を描いて動かすところまではできています。それにブロックのコードを足してもブロックが表示されないので困っています。
よろしくお願いいたします。

import java.awt.Graphics;
import java.applet.Applet;
import java.awt.*;

public
class ball extends Applet implements Runnable{

int x,y; int vx; int vy; Thread thread; int xz[]; int yz[]; public ball(){ vx=2; vy=2; thread = new Thread (this); thread.start(); int xz[] = new int [19]; int yz[] = new int [19]; } public void paint(Graphics g){ g.fillOval(x,y,10,10); for(int i=0;i<=19;i++){ if(i<=9){ xz[i] = i*30; yz[i] = 0; } if(i>9){ xz[i] = (i-10)*30; yz[i] = 10; } g.fillRect(xz[i],yz[i],30,10); } } public void run(){ while(true){ x +=vx; y +=vy; if(x + 10>=300 || x <=0){ vx *= -1; } if(y + 10>=450 || y <= 0){ vy *= -1; } try{ Thread.sleep(50); }catch(InterruptedException e){} repaint(); } } }

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

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

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

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

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

guest

回答1

0

java

1public 2class ball extends Applet implements Runnable{ 3 4 public ball(){ 5 6 vx=2; 7 vy=2; 8 9 thread = new Thread (this); 10 thread.start(); 11 12 int xz[] = new int [19]; 13 int yz[] = new int [19]; 14 15 }

この初期化処理ですが、Appletの場合は、コンストラクタではなくて、public void init() メソッドに書きます。なので、public ball()public void init() に書き換えれば動きそうな気がします。試してみてください。


2016年3月17日追記

元のままでも玉は表示されていて、コンストラクタを init() に変えてもダメだったのですね。

コンストラクタ内のコードですが、よく見ると2つ問題があります:

  1. int xz[] = ... としているが、これだと、コンストラクタ内にローカル変数を新たに作ってしまうので、メンバ変数 xzyz が初期化できてない。
  2. xzyz を初期化する前に、スレッドをスタートさせている。

おそらく今は1つ目の理由で、スタートしたスレッドが玉を描いて、次にブロックを描こうとした瞬間に、NullPointerException が起きて、プログラムが終了しているのだと思います。また、1だけを直して、2を直さないと、タイミングによっては、やはり NullPointerException になってしまいます。

以下のように書き換えてみてください。なお2つ目の問題については、コンストラクタは変数の初期化を行い、init() ではスレッドをスタートするようにしてみました。(あと、Javaではクラス名の頭文字は大文字にする慣習があるので、ballBallに変更してます。)

Java

1public class Ball extends Applet implements Runnable { 2 3 public Ball() { 4 vx=2; 5 vy=2; 6 xz = new int[19]; 7 yz = new int[19]; 8 } 9 10 public void init() { 11 thread = new Thread(this); 12 thread.start(); 13 }

投稿2016/03/16 13:57

編集2016/03/17 05:00
tatsuya6502

総合スコア2035

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

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

fuj1ringo

2016/03/16 22:23

ご回答ありがとうございます。 initにしてもダメでした。すみません。補足しますと、ball()でも玉を描いて動かすところまではできています。それにブロックのコードを足してもブロックが表示されないので困っています。
tatsuya6502

2016/03/17 04:57

補足情報、ありがとうございました。コメントだとコード部分の書式が変えられないので、回答の方に追記しました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

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

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

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問