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

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

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

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

Swing

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

Q&A

解決済

1回答

4013閲覧

java キー入力で画像を表示させてそのあと左に移動させたい

Alpa

総合スコア80

Java

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

Swing

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

0グッド

0クリップ

投稿2017/09/30 15:08

Aキーを押したら弾の画像が表示されて
そのあと左に連続で移動するようにしたいです
どうしたらいいでしょうか?

シューティングゲームで弾の発射に使うつもりです
(本当はもっと滑らかにできればいいのですが・・・)
(なんなら自機の移動ももっと・・・)

弾の画像サイズはX:20 Y:20 です
自機のサイズはX:80 Y:40 です

java

1 2import javax.swing.JFrame; 3import javax.swing.JPanel; 4import javax.swing.JLabel; 5import javax.swing.ImageIcon; 6 7import java.awt.BorderLayout; 8import java.awt.event.KeyEvent; 9 10public class MyGame extends JFrame{ 11 12 int zikiX[] = {750}; 13 int zikiY[] = {225}; 14 15 int zikidamaX[] = {zikiX[0]-30}; 16 int zikidamaY[] = {zikiY[0]}; 17 18 ImageIcon icon1 = new ImageIcon 19 ("C:\Users\miyab\Desktop\シューティングゲーム\自機.png");//画像ファイル指定 20 ImageIcon icon2 = new ImageIcon 21 ("C:\Users\miyab\Desktop\シューティングゲーム\自機弾.png"); 22 23 JLabel ziki = new JLabel(icon1);//JLabelに自機の画像ファイル設定 24 JLabel zikizahyou = new JLabel();//自機の座標を生成 25 JLabel zikidama = new JLabel(icon2);//JLabelに自機の弾の画像ファイル設定 26 27 JPanel panel = new JPanel();//panel設定 28 29 public static void main(String[] args){ 30 31 MyGame frame = new MyGame();//ウィンドウを内部的に作成 32 frame.setSize(900, 550);//ウィンドウサイズ設定 33 frame.setTitle("シューティングゲーム"); 34 frame.setLocationRelativeTo(null);//ウィンドウの位置を中央に設定 35 36 frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 37 //ウィンドウを×で閉じるようにする設定 38 39 frame.setVisible(true);//ウィンドウを可視化 40 41 } 42 43 MyGame(){ 44 45 panel.setLayout(null);//レイアウトマネージャー無効化 46 47 ziki.setBounds(zikiX[0], zikiY[0], 80, 40);//zikiのサイズと座標設定 48 zikizahyou.setText("X座標:"+zikiX[0]+" Y座標:"+zikiY[0]);//自機の座標を設定 49 zikizahyou.setBounds(5, 5, 150, 15);//自機の座標の座標とサイズを設定 50 51 panel.add(ziki);//自機画像をpanelに追加 52 panel.add(zikizahyou);//自機の座標を画面に表示 53 54 getContentPane().add(panel, BorderLayout.CENTER);//??? 55 56 enableEvents(java.awt.AWTEvent.KEY_EVENT_MASK);//キーイベントの有効化 57 58 } 59 60 protected void processKeyEvent(java.awt.event.KeyEvent e){//キーイベントの関数 61 62 if(e.getID() == java.awt.event.KeyEvent.KEY_PRESSED){ 63 64 if(e.getKeyCode() == java.awt.event.KeyEvent.VK_LEFT){ 65 66 zikiX[0] -= 10;//座標を左に移動 67 if(zikiX[0] <= 0){//座標が画面外に行ったら左端に戻す 68 69 zikiX[0] = 0;//zikiのX座標を0に設定 70 71 } 72 ziki.setLocation(zikiX[0],zikiY[0]);//座標を再設定 73 zikizahyou.setText("X座標:"+zikiX[0]+" Y座標:"+zikiY[0]);//座標表示を更新 74 75 } 76 77 if(e.getKeyCode() == java.awt.event.KeyEvent.VK_RIGHT){ 78 79 zikiX[0] += 10;//座標を右に移動 80 if(zikiX[0] >= 804){//座標が画面外に行ったら右端に戻す 81 82 zikiX[0] = 804;//zikiのX座標を804に設定 83 84 } 85 ziki.setLocation(zikiX[0],zikiY[0]);//座標を再設定 86 zikizahyou.setText("X座標:"+zikiX[0]+" Y座標:"+zikiY[0]);//座標表示を更新 87 88 } 89 90 if(e.getKeyCode() == java.awt.event.KeyEvent.VK_UP){ 91 92 zikiY[0] -= 10;//座標を上に移動 93 if(zikiY[0] <= 1){//座標が画面外に行ったら上端に戻す 94 95 zikiY[0] = 1;//zikiのY座標を1に設定 96 97 } 98 ziki.setLocation(zikiX[0],zikiY[0]);//座標を再設定 99 zikizahyou.setText("X座標:"+zikiX[0]+" Y座標:"+zikiY[0]);//座標表示を更新 100 101 } 102 103 if(e.getKeyCode() == java.awt.event.KeyEvent.VK_DOWN){ 104 105 zikiY[0] += 10;//座標を下に移動 106 if(zikiY[0] >= 471){//座標が画面外に行ったら下端に戻す 107 108 zikiY[0] = 471;//zikiのY座標を471に設定 109 110 } 111 ziki.setLocation(zikiX[0],zikiY[0]);//座標を再設定 112 zikizahyou.setText("X座標:"+zikiX[0]+" Y座標:"+zikiY[0]);//座標表示を更新 113 114 } 115 116 if(e.getKeyCode() == java.awt.event.KeyEvent.VK_A){ 117 118 zikidama.setBounds(zikidamaX[0], zikidamaY[0], 20, 20); 119 panel.add(zikidama); 120 121 for(int i = 0; i < 100; i++){ 122 123 zikidamaX[0] -= 30; 124 125 } 126 127 System.out.println(zikidamaX[0]);//座標確認用 128 System.out.println(zikidamaY[0]); 129 130 } 131 132 } 133 } 134 135} 136 137

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

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

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

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

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

guest

回答1

0

ベストアンサー

弾を動かすためには一定時間ごとに移動させるようにすればよいです。自機の移動も「キーを押した時のみ移動」ではなく「キーを押して(keyPressed)から、離す(keyReleased)までの間、一定時間ごとに移動」とすれば滑らかな移動になります。

一定時間ごとに何かをするにはswingアプリケーションではjavax.swing.Timerクラスを利用するのが典型的な方法です。考えやすい方法としてjavax.swing.Timerは常に動かしっぱなしにし、毎回「弾が表示中か・自機の移動中か」を判定して、しかるべき動きをさせるように考えるとよいかと思います。


追記:javax.swing.Timerの単純なサンプルを書いてみました。

java

1import javax.swing.*; 2import java.awt.*; 3 4public class TimerSample extends JFrame { 5 public static void main(String[] args) { 6 new TimerSample().setVisible(true); 7 } 8 9 final int PanelWidth = 300; 10 JLabel movingLabel; 11 int labelX = 0; 12 13 TimerSample() { 14 super("timer sample"); 15 Container content = getContentPane(); 16 17 JPanel panel = new JPanel(null); 18 panel.setPreferredSize(new Dimension(PanelWidth, 200)); 19 content.add(panel, BorderLayout.CENTER); 20 21 movingLabel = new JLabel("moving"); 22 movingLabel.setBackground(Color.CYAN); 23 movingLabel.setOpaque(true); 24 movingLabel.setSize(80, 20); 25 panel.add(movingLabel); 26 27 initTimer(); 28 29 setDefaultCloseOperation(EXIT_ON_CLOSE); 30 pack(); 31 } 32 33 void initTimer() { 34 Timer timer = new Timer(30, event -> { 35 // このラムダ式が30ミリ秒ごとに自動的に実行される 36 labelX += 2; 37 if (labelX > PanelWidth - movingLabel.getWidth()) { 38 labelX = 0; 39 } 40 movingLabel.setLocation(labelX, 90); 41 }); 42 timer.start(); 43 } 44}

この例ではTimerを使って、30ミリ秒ごとにラムダ式が永久に実行されるようにしています。ラムダ式の中では、ラベルを左から少しずつ右へ移動しつつ、右端に達したらまた左端へ戻すようにしています。このラムダ式の中で一定時間ごとにやりたいアニメーションの処理を色々と書けばよいわけです。
(ラムダ式はJava8以降でしか使えないので念のため。業務でない限りJava7以前ではないだろうと推測してJava8の文法で書いています)

投稿2017/09/30 15:57

編集2017/10/01 10:03
KSwordOfHaste

総合スコア18392

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

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

Alpa

2017/10/01 08:05

ありがとうございます Timerクラスを使ってみます
Alpa

2017/10/01 09:07

すいません 使い方が調べてもよくわからないので例を教えていただけないでしょうか?
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問