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

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

ただいまの
回答率

88.58%

変数を別クラスに移行したいんです。

解決済

回答 3

投稿

  • 評価
  • クリップ 0
  • VIEW 782
退会済みユーザー

退会済みユーザー

漸Javaのコンストラクタクラスを分配できたんですけど、次の問題がそしたら発生してしまって、
それが

 キー入力データを代入した変数を本元のクラスに移動したいんですけど、やり方が全く分からなくて困っています。

どうかどなたか教えて下さい!!。
後宜しければ更にKeyListenerのキーインベント処理も上手く可動しないのでそちらも教えて頂ければ嬉しいです。

メインクラス

//import
import java.awt.*;
import javax.swing.*;
import java.applet.Applet;
import java.awt.event.KeyEvent;
import java.awt.event.KeyListener;


class Mine extends JFrame{   

//メンバ変数
static boolean Speace_key=false;    

static boolean UP_key=false;
static boolean DOWN_key=false;
static boolean LEFT_key=false;
static boolean RIGHT_key=false;

  //メイン関数。
 public static void main(String args[]){

 MyFrame.EditFrame();
 MyFrame.key_inport();

 //変数宣言
int x=0; int y=0;

int HP=3; int score=0;
int Lv=1; int xp=0;

int tm_x=0; int tm_y=0;

int tx=0; int ty=0;

while(true){
if (Speace_key==false){System.out.println("キーが押されてないぜ?");}
if (Speace_key==true){System.out.println("キーが押されたぜ!");}
}




  }



}

コンストラクタクラス

//import
import java.awt.*;
import javax.swing.*;
import java.applet.Applet;
import java.awt.event.KeyEvent;
import java.awt.event.KeyListener;


public class MyFrame {

 static boolean Speace_key = false;

public static void EditFrame() {

Mine Mine = new Mine();

JFrame jf = new JFrame("Shoting game");

jf.setResizable(false);
jf.setVisible(true);

//ウィンドウを表示
jf.setSize(800, 700);
jf.setLocationRelativeTo(null);
jf.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
//ここから先が表示プログラム
jf.setLayout(new FlowLayout());



  //文字描画システム初期化
  JLabel Text = new JLabel("Starting game if please space key");
  Text.setPreferredSize(new Dimension(350, 310));
  Text.setFont(new Font(null,0,25));

  //JFrameにオブジェクトを追加
   jf.add(Text);
}
 public static void key_inport() {
  KeyListener code = new KeyListener() {


    @Override
    public void keyTyped(KeyEvent e) {
        throw new UnsupportedOperationException("Not supported yet."); //To change body of generated methods, choose Tools | Templates.
    }

    @Override
    public void keyPressed(KeyEvent e) {
        throw new UnsupportedOperationException("Not supported yet."); //To change body of generated methods, choose Tools | Templates.

    if (KeyEvent==KeyEvent.VK_SPACE){
    Speace_key=true;
    }
  }

    @Override
    public void keyReleased(KeyEvent e) {
        throw new UnsupportedOperationException("Not supported yet."); //To change body of generated methods, choose Tools | Templates.

     if (KeyEvent==KeyEvent.VK_SPACE){
     Speace_key=false;
     }


    }
  };
 }

}

どうかご回答宜しくお願いします。

ちなみにJavaSE JDKとも最新バージョンです。
使用クラスはswingです。(本当はAppletを使用したかったんですけどね、上手くエラーを修正して導入出来なかったんですよね・・。)

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

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

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

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 過去に投稿した質問と同じ内容の質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

回答 3

+2

パッとしか見てませんが、どのキーイベントも例外を最初に投げてるから動作しないのではないですか?


せっかくなので気になるところを指摘。
(指摘はしますが質問内容と外れるところが多いため、挙げたことを質問されてもここでは答えません。
復習するなり別途1つずつ質問を立てるなりしてください。)

 質問文の内容から

  • コンストラクタクラスという用語がわかりません。
  • 今現在appletに拘る理由がない気がしますが、なぜappletでやりたかったのでしょう? 

 質問文の書き方から

  • 「書き方がわからない」のと「動作しない」のでは意味が異なります。
    「動作しない」のであれば理想の出力と現状の出力、もしくはエラー文を提示しましょう。
  • 1質問1要件が理想です。ついでにーという質問が増えるのは回答しにくくなるのでおすすめしません。

 全体的なコードから

  • インデントを付けましょう。
  • 不必要な空行はなくしましょう。
  • 英単語はなるべく正しく書きましょう。(speace→space)
  • 大文字小文字の規則は統一させましょう。

 Mineクラスから

  • インポートしているものはJFrame以外ないので、import javax.swing.*以外不要です。
  • mainメソッドしかないならJFrameを継承している意味がないです。
  • whileループでキー判定をしていますが、MyFrameクラスのキーイベントで良いのでは?

 MyFrameクラスから

  • Mineクラスをインスタンス化している理由が不明です。
  • クラス名からこちらがJFrameクラスを継承すべきな気がします。
  • key_inportメソッド(これも誤字)はどこから呼び出されるのですか?

投稿

編集

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2018/10/31 19:53

    ・詳しい返信・
    Q, コンストラクタクラスという用語がわかりません。
    A, すいません僕がコンストラクタをするためのクラスという事から勝手ながら命名させて頂きました、
    分かりにくくてすいません。

    Q, 今現在appletに拘る理由がない気がしますが、なぜappletでやりたかったのでしょう?
    A, シューティングゲームを制作したいと思い、調べた所講座に多用されていたのでAppletの方を
    使用した方が良いのかと思い使用しようと思い至りました。

    Q, 「書き方がわからない」のと「動作しない」のでは意味が異なります。
    「動作しない」のであれば理想の出力と現状の出力、もしくはエラー文を提示しましょう。
    A, すいません頭が回っていなかった時に質問したので、変な質問文になっていましたね・・・、
    書き方が分からないという物が一応正解です。

    Q, 1質問1要件が理想です。ついでにーという質問が増えるのは回答しにくくなるのでおすすめしません。
    A, 確かにそうですね、今後の質問投稿の際は1つずつ質問したいと思います。

    Q, インデントを付けましょう。
    A, 勝手ながら僕が個人的に軽くインデントを見やすくするために省いていたというのと単純に書き加える
    事を前提として書いている途中の何もコードが整理されていない状態だったという事もあり、
    かなりインデントが抜けていました、見にくくて申し訳ありません。

    Q, 不必要な空行はなくしましょう。
    A, 色々試しながら書いていたので変に空行やら空白やらが出来て見にくくなってしまっていました、
    修正してから質問を投稿すれば良かったですね・・・。 修正して置きます。

    Q、 英単語はなるべく正しく書きましょう。(speace→space)
    A, スペルミスが多くてすいません、プログラムを修正して置きます。

    Q, 大文字小文字の規則は統一させましょう。
    A, キャメルケース等の事ですね、完全に忘れていました、修正して置きます。

    Q, インポートしているものはJFrame以外ないので、import javax.swing.*以外不要です。
    A, 色々と試験的に試していた時に追加したImport文が残っていました、プログラム修正と一緒に
    これも削除して置きますね。

    Q, mainメソッドしかないならJFrameを継承している意味がないです。
    A, 確かにそうですね、それなら関数に直接継承した方が良いですね。

    Q, whileループでキー判定をしていますが、MyFrameクラスのキーイベントで良いのでは?
    A, 一応コンストラクタとクラスで分けて無理やりコンストラクタを終了させて、ウィンドウを表示させた
    後にループ処理をさせようとしたらいつの間にかこうなっていました。

    Q, Mineクラスをインスタンス化している理由が不明です。
    A, 変数を移行させようとしてインスタンス化しました。(そもそもの所そんな事はせずMyFrameクラスをMineクラスに合成すればどうにかなったかも知れませんね。)

    Q, クラス名からこちらがJFrameクラスを継承すべきな気がします。
    A, そうですね、クラスに継承する必要がありませんでした。

    Q, key_inportメソッド(これも誤字)はどこから呼び出されるのですか?
    A, 一応Mineクラスから呼び出すつもりでいました。

    キャンセル

  • 2018/10/31 20:01

    わざわざ長い指摘に1つずつコメントしていただいたので最後にもう一つだけアドバイスを。
    開発においてというか質問する時は特に用語ひとつで話が食い違います。
    今回のコンストラクタクラスはおそらくオブジェクト指向におけるJavaの基本知識が
    まだちゃんと理解できていないからだと思います。
    ところどころ用語と意味が合ってなさそうなところがあるので、
    今作成されているものができたら今一度復習し直してみると良いでしょう。
    (作成途中で復習すると完成前にやる気が削がれちゃうかもなので、できてからで良いかと。)

    キャンセル

  • 2018/11/03 17:39

    アドバイスありがとうございます!、確かにそうですね★、もう一度あやふやな所を復習して見ます!!。
    ちなみに今回のプログラムの場合はまだコンストラクタと例外を上手く理解できていなかったからだと思います、詳しい情報まできめ細かく復習しないと行けなさそうですねw。

    キャンセル

+2

ごちゃごちゃしているので、しっかりとは見ていないのですが、

とりあえず、次の2点は問題になっていそうです。

 1.キーリスナーを作成しているが、どのにも関連付けされていない

リスナーというのは、聞き手(聞く人/物)ですが、何に対して聞くかはその時点では決まっていません。
聞く対象に対して、「聞き手がいます」と宣言をしてあげる必要があります

そうしないと聞く対象は、聞き手に対して何の情報も教えてはくれません。

聞く対象.add聞く内容Listener(聞き手)

という形で宣言をする必要があります。

例えば、KeyListenerであるkeyListenerが、JFrame型のjfに対し、Keyイベントを要求するには、

jf.addKeyKistener(keyListener);

となります。

 2.同じ名前の変数であっても、属しているクラスが違えば、両者は別のもの。staticであっても同様。

 
Mineクラスに定義したSpeace_key と MyFrameに定義したSpeace_key は別のものです。

これを同じものとして処理していませんか?

※ところで、「Speace」とは? 「空白」のスペースなら、「space」です

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2018/10/31 18:46 編集

    ご回答ありがとうございました!、とても丁寧に分かりやすくご回答くださってありがとうございます。
    とても参考になりました、KeyListenerが例外になっていたんですね!、他の方からのコメントと照らし合わせて見た所漸く理解できました!!。

    色々僕は曖昧に変な覚え方をしているようで、色々抜けていてなかなかコメントの中身が理解出来ませんでしたがどうにか、なりそうです!! 本当にありがとうございました。

    ちなみにSpaceをSpeaceと間違えて記載していました、ご指摘ありがとうございます。

    キャンセル

checkベストアンサー

0

dice142さんやngsvxさんの言う通りですが、
・まず現在の最新バージョンではAppletはほぼ無理です。というか無理です。JavaFXを使うべきです。
ネットでできるゲームにするなら Javascript 等の別言語を使用するのが妥当かと。

後、上の人の言っている「例外」とは

throw new UnsupportedOperationException("Not supported yet.");


です。この分を消して、実行したいことを書きましょう。

後、ぶっちゃけ言いますと、ソースを分ける必要がありません。
イメージでは、こんな感じでしょうか。(スパゲッティーだったり、エラーが出るかもしれませんが、
調べて、直してみてください。)

import java.awt.*;
import javax.swing.*;
import java.applet.*;
import java.awt.event.*;

class Mine extends JFrame{   

static boolean Speace_key=false;    

//static boolean Speace_key = false;   // 同じ変数(別クラスにあった)

static boolean UP_key=false;
static boolean DOWN_key=false;
static boolean LEFT_key=false;
static boolean RIGHT_key=false;

int HP=3; int score=0;
int Lv=1; int xp=0;

int tm_x=0; int tm_y=0;

int tx=0; int ty=0;
int x=0; int y=0;

public Mine( String title )
{
  super( title );
}

 public static void main(String args[]){

  EditFrame();
  key_inport();

  while(true){
    if (Speace_key==false){System.out.println("キーが押されてないぜ?");}
    if (Speace_key==true){System.out.println("キーが押されたぜ!");}
  }

public static void EditFrame() {

Mine Mine = new Mine();

//JFrame jf = new JFrame("Shoting game");  // Mine が JFrame です

setResizable(false);
setVisible(true);

setSize(800, 700);
setLocationRelativeTo(null);
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
//ここから先が表示プログラム
setLayout(new FlowLayout());

  //文字描画システム初期化
  JLabel Text = new JLabel("Starting game if please space key");
  Text.setPreferredSize(new Dimension(350, 310));
  Text.setFont(new Font(null,0,25));

  //JFrameにオブジェクトを追加
   add(Text);
}

 public static void key_inport() {
  KeyListener code = new KeyListener() {
    @Override
    public void keyTyped(KeyEvent e) {
        throw new UnsupportedOperationException("Not supported yet."); //To change body of generated methods, choose Tools | Templates.
    }

    @Override
    public void keyPressed(KeyEvent e) {
        throw new UnsupportedOperationException("Not supported yet."); //To change body of generated methods, choose Tools | Templates.

    if (KeyEvent==KeyEvent.VK_SPACE){
    Speace_key=true;
    }
  }

    @Override
    public void keyReleased(KeyEvent e) {
        throw new UnsupportedOperationException("Not supported yet."); //To change body of generated methods, choose Tools | Templates.

     if (KeyEvent==KeyEvent.VK_SPACE){
     Speace_key=false;
     }
    }
  };
 }
}

あとJavaの関数名はキャメルケースというルールを使用します。簡単に言うと、はじめは大文字、単語が出たら初めの文字だけ大文字・・・というやつです。

あとインスタンス化、継承、実装を理解されていますか?一回もう一度確認してみることをお勧めします。

長文失礼いたしました。

投稿

編集

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2018/10/31 11:27

    どうでもいいことですが、「上の人」だと並びが変わったときに通じなくなりますよ。

    キャンセル

  • 2018/10/31 12:40

    すぐ↑の「ngsvx」さんは例外とか言ってないような

    キャンセル

  • 2018/10/31 16:45

    すいません。修正しました

    キャンセル

  • 2018/10/31 18:52

    更に分かりやすく解説して下さってありがとうございます!!、もう一度頭の中を整理した所、
    クラスを一つに纏めて、クラスを同じソースコードに纏めて継承を無くして直接コンストラクタ後に、
    ループ処理内でキー処理を行いたいと思います。

    後それとキャメルケースの事を完全に忘れていました、これが無いと分かりにくいですよね・・・、
    付け足して置きます!!。

    キャンセル

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

  • ただいまの回答率 88.58%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

関連した質問

同じタグがついた質問を見る