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

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

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

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

Q&A

解決済

1回答

841閲覧

渡した引数が反映されない。

blotors

総合スコア4

Java

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

0グッド

0クリップ

投稿2023/01/22 12:33

編集2023/01/23 20:07

お世話になります。以下の事象を解決したく思いまして投稿させていただきます。
Javaのプログラムです。

STPanel.java

player.setxySizeShift(150,300,32,6);
bgd.maptipSet(1);
mSize = bgd.getMapSize();
System.out.println("STPanel.mSize[0] " + mSize[0] + " " + "mSize[1] " + mSize[1]);
enemy.enemySet("テスト",500,300,32,4);

public void run() {
time++;
if(time % 2 == 0){
System.out.println("run bgd.mapSize[0] " + mSize[0] + " " + "bgd.mapSize[1] " + mSize[1]);
player.playerMove();
System.out.println("run2 bgd.mapSize[0] " + mSize[0] + " " + "bgd.mapSize[1] " + mSize[1]);
int[] pxy = player.getxySizeShift();
System.out.println("run player.pxy[0] " + pxy[0] + " " + "pxy[1] " + pxy[1]);
enemy.enemyHitCheck();
int[] pxy2 = player.getxySizeShift();
System.out.println("run player.pxy2[0] " + pxy2[0] + " " + "pxy2[1] " + pxy2[1]);
}
}

この状態でmainメソッド(STFrame.java)を実行してコンソールに表示します。
すると、player.playerMove()のmSize = bgd.getMapSize();にてBackGroundクラスのmapSizeを取得したいのですが
mSize[0] 0 mSize[1] 0となってしまい取得できません。既に3200,608を渡しているはずなのに何故なのかわかりません。
また、enemy.enemyHitCheck()のint pxy[] = player.getxySizeShift()にてPlayerクラスのxを取得したいのですが
pxy[0] 0となってしまい取得できません。既に150を渡しているはずなのに何故なのかわかりません。
ここで渡したい数値が渡せないのでプログラムが進まずに困っています。
しかしrunメソッドの中でplayer.getxySizeShift()するとしっかり値が取得されているようです。

以上、わかりにくいと思いますが、ソースコードをご覧になられてコンソールに出力されれば解ると思います。
どなたかご教授お願いします。

<STFrame.java> import java.awt.BorderLayout; import javax.swing.JFrame; public class STFrame extends JFrame { private STPanel panel = null; public STFrame() { super(); super.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); super.setLayout(new BorderLayout()); panel = new STPanel(); super.setContentPane(panel); super.setVisible(true); super.pack(); super.requestFocus(); panel.requestFocus(); } public static void main(String[] args){ STFrame stFlame = new STFrame(); } } ---------------------------- <STPanel.java> import java.awt.Dimension; import java.util.TimerTask; import javax.swing.JOptionPane; import javax.swing.JPanel; public class STPanel extends JPanel { private java.util.Timer timerThis = null; private int time = 0; public Player player = null; public Enemy enemy = null; public BackGround bgd = null; private int[] mSize = null; public STPanel() { super(); try{ init(); super.setPreferredSize(new Dimension(800, 608)); super.setLayout(null); player = new Player(); enemy = new Enemy(); bgd = new BackGround(); player.setxySizeShift(150,300,32,6); bgd.maptipSet(1); mSize = bgd.getMapSize(); System.out.println("STPanel.mSize[0] " + mSize[0] + " " + "mSize[1] " + mSize[1]); enemy.enemySet("テスト",500,300,32,4); timerThis = new java.util.Timer(); timerThis.scheduleAtFixedRate(new TimerActionListener(), 1000l, 8l); }catch(Exception ex){ ex.printStackTrace(); JOptionPane.showMessageDialog(this, "ERROR : " + ex.toString()); } } public void init() { mSize = new int[4]; } private class TimerActionListener extends TimerTask { @Override public void run(){ STPanel.this.run(); } } public void run() { time++; if(time % 2 == 0){ System.out.println("run bgd.mapSize[0] " + mSize[0] + " " + "bgd.mapSize[1] " + mSize[1]); //player.keyCheck(keyPressTbl); //bgd.mapMove(1); player.playerMove(); System.out.println("run2 bgd.mapSize[0] " + mSize[0] + " " + "bgd.mapSize[1] " + mSize[1]); int[] pxy = player.getxySizeShift(); System.out.println("run player.pxy[0] " + pxy[0] + " " + "pxy[1] " + pxy[1]); enemy.enemyHitCheck(); int[] pxy2 = player.getxySizeShift(); System.out.println("run player.pxy2[0] " + pxy2[0] + " " + "pxy2[1] " + pxy2[1]); } } } ---------------------------- <Player.java> public class Player { private double x = 0; private double y = 0; private int shift = 0; private int size = 0; private int[] mSize = null; public BackGround bgd = null; public Player() { init(); } public void init() { bgd = new BackGround(); mSize = new int[4]; } public int[] getxySizeShift() { int[] xyss = {(int)x,(int)y,size,shift}; return xyss; } public void setxySizeShift(double x,double y,int size,int shift) { this.x = x; this.y = y; this.size = size; this.shift = shift; } public void playerMove() { mSize = bgd.getMapSize(); //System.out.println("playerMove x " + x + " " + "y " + y + " mSize[0] " + mSize[0]); System.out.println("playerMove mSize[0] " + mSize[0] + " " + "mSize[1] " + mSize[1]); } } ---------------------------- <Enemy.java> import java.util.ArrayList; import java.util.List; public class Enemy { private String name = null; private int shift = 0; private double x = 0; private double y = 0; public BackGround bgd = null; public Player player = null; public BlockObject bObject = null; public int moveCount = 0; private int size = 0; public List <Enemy> enemies = null; public Enemy() { init(); } public void init() { enemies = new ArrayList<>(); player = new Player(); bgd = new BackGround(); bObject = new BlockObject(); } public int[] getxySizeShift() { int[] xyss = {(int)x,(int)y,size,shift}; return xyss; } public void enemySet(String name,double x,double y,int size,int shift) { Enemy eobj = new Enemy(); eobj.name = name; eobj.x = x; eobj.y = y; eobj.size = size; eobj.shift = shift; enemies.add(eobj); } public void enemyHitCheck() { int oSize = enemies.size(); if (oSize >= 1) { int pxy[] = player.getxySizeShift(); for (int i = 0; i <= oSize-1; i++) { int exy[] = enemies.get(i).getxySizeShift(); System.out.println("enemyHitCheck oSize " + oSize + " " + "pxy[0] " + pxy[0] + " " + "exy[0] " + exy[0]); } } } } ---------------------------- <BackGround.java> public class BackGround { private double x = 0; private double y = 0; private int[] mapSize = null; public BackGround() { init(); } public void init() { mapSize = new int[4]; for (int i = 0; i <= mapSize.length-1; i++) { mapSize[i] = 0; } } public int[] getxy() { int[] xy = {(int)this.x,(int)this.y}; return xy; } public int[] getMapSize() { int[] ms = mapSize; return ms; } public void setMapSize(int stageNum) { if (stageNum == 1) { this.mapSize[0] = 3200; this.mapSize[1] = 608; } } public void maptipSet(int stageNum) { setMapSize(stageNum); } }

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

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

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

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

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

y_waiwai

2023/01/22 12:58

このままではコードが読みづらいので、質問を編集し、</>(コードの挿入)ボタンを押し、出てくる’’’の枠の中にコードを貼り付けてください
jimbe

2023/01/22 15:36 編集

マークダウンはファイル毎に分け、そのファイル内に書いてある事のみが入るようにしてください。(ファイル名等は外に書いてください。) コピペして実行する際に編集が必要だと間違いが起きる可能性があります。 BlockObject がありません。 JFrame.setVisible(true) の後は Swing のコンポーネントの操作を Swing の イベントディスパッチスレッド以外から行わないでください。
m.ts10806

2023/01/22 20:38

理想 ---------- ファイル名 ```言語名 コード ``` ファイル名 ```言語名 コード ``` マークダウンといってもあくまで「ルールに則った文字で登録すると、表示時に見やすいような演出に変換される」というものなので、特性を知ったうえで見ている人に配慮してもらえると、解決も早くなります(ヘルプページも熟読のこと)
guest

回答1

0

ベストアンサー

player.playerMove()のmSize = bgd.getMapSize();にてBackGroundクラスのmapSizeを取得したいのですが
mSize[0] 0 mSize[1] 0となってしまい取得できません。

player.playerMove() で使っている bgd は init() で new BackGround() しているオブジェクトで、このオブジェクトは他にある BackGround オブジェクトとは全く関係ありません。

enemy.enemyHitCheck()のint pxy[] = player.getxySizeShift()にてPlayerクラスのxを取得したいのですが
pxy[0] 0となってしまい取得できません。

こちらも、 player は init() で new Player() しているオブジェクトで、他とは関係ありません。

ついでに、 Enemy クラスは単体の enemy を表すのですから、 enemies を持っているのはおかしいでしょう。

投稿2023/01/22 15:47

編集2023/01/22 15:53
jimbe

総合スコア12601

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

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

blotors

2023/01/23 10:02

ご指摘ありがとうございます。オブジェクトをNewすると別のオブジェクトが作られてそこから違うオブジェクトにセットした数値を取得しようとしてもできないのは当然だと気づきました。bgd player と、変数の名を同じにしていたので気づきませんでした。 Enemyクラスにリストのenemiesを作らずに、別のクラスに作成した方が良いのでしょうか? super.setVisible(true);の後の部分をそれより前の行に移動してみましたが問題なく動くようです。 マークダウンについては、注意喚起されているにも関わらず質問に回答してくださりありがとうございます。現状利用法が解らないので今後質問する時は使えるようにします。
jimbe

2023/01/23 11:07 編集

>Enemyクラスにリストのenemiesを作らずに、別のクラスに作成した方が良いのでしょうか? 「良い」かどうかの絶対的・普遍的な基準はありませんが、例えば敵の体内(?)に敵が何匹も居るのでしょうか? STPanel からすれば、一人のプレイヤーと対する複数の敵を表すのに Player player = new Player(~); //プレイヤー List<Enemy> enemies = new ArrayList<Enemy>(); enemies.add(new Enemy(~)); //一匹目 enemies.add(new Enemy(~)); //二匹目… といった感じのほうが player vs enemies の構図がコードとしても見えてくるのではないでしょうか。 >super.setVisible(true);の後の部分をそれより前の行に移動してみましたが問題なく動くようです setVisible(true) の後に Swing を弄ってはいけないのは、 Swing が main のスレッド等とは別スレッドで動作するからです。 setVisible(true) を実行した瞬間からいわゆる「マルチスレッド」状態となるため、 main から弄るとデータの整合性を破壊する可能性があり、それは何時どのように発現するか分からない時限爆弾です。 その為個人的に Swing の開始は以下のように main を書き、 MainFrame のコンストラクタでは setVisible しないようにしています。 public class MainFrame extends JFrame { public static void main(String[] args) { SwingUtilities.invokeLater(() -> new MainFrame().setVisible(true)); } MainFrame() { //以下略 } ※SwingUtilities.invokeLater で実行しているので既に Swing のスレッドになっていてやる必要は無いのですけど^^;
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.49%

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

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

質問する

関連した質問