質問: 0; i < 100; i++){ zikidamaX[0] -= 30; } System.out.println(zikidamaX[0]);//座標確認用 System.out.println(zikidamaY[0]); } } } } ```
回答: 弾を動かすためには一定時間ごとに移動させるようにすればよいです。自機の移動も「キーを押した時のみ移動」ではなく「キーを押して(keyPressed)から、離す(keyReleased)までの間、一定時間ごとに移動」とすれば滑らかな移動になります。 一定時間ごとに何かをするにはswingアプリケーションではjavax.swing.Timerクラスを利用するのが典型的な方法です。考えやすい方法としてjavax.swing.Timerは常に動かしっぱなしにし、毎回「弾が表示中か・自機の移動中か」を判定して、しかるべき動きをさせるように考えるとよいかと思います。 追記:javax.swing.Timerの単純なサンプルを書いてみました。 ``` import javax.swing.*; import java.awt.*; public class TimerSample extends JFrame { public static void main(String[] args) { new TimerSample().setVisible(true); } final int PanelWidth = 300; JLabel movingLabel; int labelX = 0; TimerSample() { super("timer sample"); Container content = getContentPane(); JPanel panel = new JPanel(null); panel.setPreferredSize(new Dimension(PanelWidth, 200)); content.add(panel, BorderLayout.CENTER); movingLabel = new JLabel("moving"); movingLabel.setBackground(Color.CYAN); movingLabel.setOpaque(true); movingLabel.setSize(80, 20); panel.add(movingLabel); initTimer(); setDefaultCloseOperation(EXIT_ON_CLOSE); pack(); } void initTimer() { Timer timer = new Timer(30, event -> { // このラムダ式が30ミリ秒ごとに自動的に実行される labelX += 2; if (labelX > PanelWidth - movingLabel.getWidth()) { labelX = 0; } movingLabel.setLocation(labelX, 90); }); timer.start(); } } ``` この例ではTimerを使って、30ミリ秒ごとにラムダ式が永久に実行されるようにしています。ラムダ式の中では、ラベルを左から少しずつ右へ移動しつつ、右端に達したらまた左端へ戻すようにしています。このラムダ式の中で一定時間ごとにやりたいアニメーションの処理を色々と書けばよいわけです。 (ラムダ式はJava8以降でしか使えないので念のため。業務でない限りJava7以前ではないだろうと推測してJava8の文法で書いています)