###前提・実現したいこと
パネルに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というように設定しているから
こんな感じですかね
まだ回答がついていません
会員登録して回答してみよう