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

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

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

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

Swing

SwingはJavaに標準で付属するグラフィック関連のクラスライブラリを指します。

解決済

同じJLabelを同じパネルに追加したい&座標設定がうまくいかない

Alpa
Alpa

総合スコア80

Java

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

Swing

SwingはJavaに標準で付属するグラフィック関連のクラスライブラリを指します。

1回答

0評価

0クリップ

65閲覧

投稿2017/10/04 11:39

編集2017/10/04 14:04

###前提・実現したいこと

パネルにzikidamaを追加して消したあともう一回zikidama追加したい
zikidamaの座標設定をzikiの左にしっかり設定したい

###発生している問題

・パネルにzikidamaを追加して消したあともう一回zikidama追加したい↓
消すまではできたがもう一回zikidamaを追加できない

・zikidamaの座標設定をzikiの左にしっかり設定したい↓
zikiを移動させても初期値の場所からしか発射されない

###該当のソースコード

java

import javax.swing.*; import java.awt.*; import java.awt.event.*; public class MyGame extends JFrame implements ActionListener, MouseMotionListener{ int zikiX[] = {750};//自機のX座標 int zikiY[] = {225};//自機のY座標 int zikidamaX[] = {zikiX[0]-30};//自機の弾のX座標 int zikidamaY[] = {zikiY[0]};//自機の弾のY座標 int count;//カウント感知用変数 ImageIcon icon1 = new ImageIcon ("C:\Users\***\Desktop\シューティングゲーム\自機.png"); //自機の画像ファイル指定;//ImageIconのicon1作成 ImageIcon icon2 = new ImageIcon ("C:\Users\***\Desktop\シューティングゲーム\自機弾.png"); //自機弾の画像ファイル指定;//ImageIconのicon2作成 JLabel ziki;//JLabelのziki作成 JLabel zikizahyou;//JLabelのzikizahyou作成 JLabel zikidamazahyou;////JLabelのzikidamazahyou作成 JLabel zikidama;//JLabelのzikidama作成 JPanel panel;//JPanelのpanel作成 Timer timer;//Timerのtimer作成 public static void main(String[] args){ MyGame frame = new MyGame();//ウィンドウを内部的に作成 frame.setSize(900, 550);//ウィンドウサイズ設定 frame.setTitle("シューティングゲーム"); frame.setLocationRelativeTo(null);//ウィンドウの位置を中央に設定 frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); //ウィンドウを×で閉じるようにする設定 frame.setVisible(true);//ウィンドウを可視化 } MyGame(){ panel = new JPanel();//panel設定 panel.setLayout(null);//レイアウトマネージャー無効化 ziki = new JLabel(icon1);//JLabelに自機の画像ファイル設定 zikizahyou = new JLabel();//自機の座標を入れる zikidamazahyou = new JLabel();//自機の弾の座標を入れる zikidama = new JLabel(icon2);//JLabelに自機の弾の画像ファイル設定 ziki.setBounds(zikiX[0], zikiY[0], 80, 40);//zikiのサイズと座標設定 zikizahyou.setText("自機 "+"X座標:"+zikiX[0]+" Y座標:"+zikiY[0]);//自機の座標を設定 zikizahyou.setBounds(5, 5, 200, 15);//自機の座標の座標とサイズを設定 zikidamazahyou.setText("自機の弾 "+"X座標:"+zikidamaX[0]+" Y座標:"+zikidamaY[0]);//自機の座標を設定 zikidamazahyou.setBounds(5, 17, 200, 15);//自機の座標の座標とサイズを設定 timer = new Timer(10, this); panel.add(ziki);//自機画像をpanelに追加 panel.add(zikizahyou);//自機の座標を画面に表示 panel.add(zikidamazahyou);//自機の弾の座標を画面に表示 pack(); getContentPane().add(panel, BorderLayout.CENTER);//??? enableEvents(java.awt.AWTEvent.KEY_EVENT_MASK);//キーイベントの有効化 addMouseMotionListener(this); } protected void processKeyEvent(java.awt.event.KeyEvent e){//キーイベントの関数 if(e.getID() == java.awt.event.KeyEvent.KEY_PRESSED){ if(e.getKeyCode() == java.awt.event.KeyEvent.VK_A){ zikidama.setBounds(zikidamaX[0], zikidamaY[0], 20, 20);//自機の弾のサイズと座標を設定 panel.add(zikidama);//panelにzikidamaを追加 timer.start(); } } } public void actionPerformed(ActionEvent e){ if(zikidamaX[0] <= 0){ timer.stop();//timerストップ panel.remove(zikidama); panel.repaint(); }else{ zikidamaX[0] -= 15;//zikidamaX[0]を-5 zikidama.setLocation(zikidamaX[0],zikidamaY[0]);//座標を再設定 zikidamazahyou.setText("自機の弾 "+"X座標:"+zikidamaX[0]+" Y座標:"+zikidamaY[0]); //座標表示を更新 } } public void mouseMoved(MouseEvent e){ Point point = e.getPoint(); zikiX[0] = point.x-43; zikiY[0] = point.y-45; if(zikiX[0] <= 0){//座標が画面外に行ったら左端に戻す zikiX[0] = 0;//zikiのX座標を0に設定 } if(zikiX[0] >= 804){//座標が画面外に行ったら右端に戻す zikiX[0] = 804;//zikiのX座標を804に設定 } if(zikiY[0] <= 1){//座標が画面外に行ったら上端に戻す zikiY[0] = 1;//zikiのY座標を1に設定 } if(zikiY[0] >= 471){//座標が画面外に行ったら下端に戻す zikiY[0] = 471;//zikiのY座標を471に設定 } ziki.setLocation(zikiX[0],zikiY[0]);//座標を再設定 zikizahyou.setText("自機 "+"X座標:"+zikiX[0]+" Y座標:"+zikiY[0]);//座標表示を更新 } public void mouseDragged(MouseEvent e){ } }

###試したこと
・パネルにzikidamaを追加して消したあともう一回zikidama追加したい↓
とくに何もしていない

・zikidamaの座標設定をzikiの左にしっかり設定したい↓
座標設定をzikiにしてみた

###追記

弾の発射処理について
まずAを押したらキーイベントで押したことを判定して
panelにzikidamaを追加
そのあとtimerをスタートさせて
画面の端に来たらtimerをストップさせ
zikidamaをpanelから削除して
そのあとpanelをrepaintしています

タイマーハンドラーについて
タイムハンドラーではzikidamaXが0になるまで
zikidamaX-15をしてそのあと座標を再設定
そしてzikidamaの座標の表示の更新をしています
そしてzikidamaXが0になったらtimerをストップして
zikidamaをpanelから消して
そのあとpanelをrepaintしています

弾の座標にどんな値が指定されているかについて
弾の座標にはzikiの X座標-30 Y座標±0 が設定されています
またそれはzikiの座標をまず X=750 Y=225 に設定していて
その座標の X-30 Y±0 をzikidamaのX,Yというように設定しているから

こんな感じですかね

良い質問の評価を上げる

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

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

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

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

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

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

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

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

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

KSwordOfHaste

2017/10/04 12:11

質問文の本文において、コードタグで囲むのはプログラムコード部分のみです。発生している問題(つまり通常の文章)はコードタグでは囲まないでください。
Alpa

2017/10/04 12:15

すいませんテンプレートをそのまま使ったので直します
KSwordOfHaste

2017/10/04 13:57 編集

タイマーハンドラーとはactionPerformedメソッドのことです。

まだ回答がついていません

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

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

ただいまの回答率
87.20%

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

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

質問する

関連した質問

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

Java

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

Swing

SwingはJavaに標準で付属するグラフィック関連のクラスライブラリを指します。