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

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

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

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

Swing

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

Q&A

解決済

1回答

8951閲覧

JAVA Swing キー入力で画像の移動をリアルタイムでしたい

Alpa

総合スコア80

Java

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

Swing

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

1グッド

0クリップ

投稿2017/09/29 14:01

編集2017/09/29 14:03

画像をキー入力したら上下左右に移動するようにしたいのですがどうしたらいいのでしょうか?
自作シューティングゲームで使うつもりのプログラムです

java

1 2 3import javax.swing.JFrame; 4import javax.swing.JPanel; 5import javax.swing.JButton; 6import javax.swing.JLabel; 7import javax.swing.ImageIcon; 8 9import java.awt.BorderLayout; 10 11public class MyGame extends JFrame{ 12 13 int zikiX[] = {750}; 14 int zikiY[] = {225}; 15 16 public static void main(String[] args){ 17 18 MyGame frame = new MyGame();//ウィンドウを内部的に作成 19 frame.setSize(900, 550);//ウィンドウサイズ設定 20 frame.setTitle("シューティングゲーム"); 21 frame.setLocationRelativeTo(null);//ウィンドウの位置を中央に設定 22 23 frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 24 //ウィンドウを×で閉じるようにする設定 25 26 frame.setVisible(true);//ウィンドウを可視化 27 28 } 29 30 MyGame(){ 31 32 JPanel panel = new JPanel();//panel設定 33 panel.setLayout(null);//レイアウトマネージャー無効化 34 35 JButton button = new JButton("button");//button設定 36 button.setBounds(10, 10, 100, 50);//画像の位置とサイズ設定 37 38 ImageIcon icon1 = new ImageIcon 39 ("C:\Users\miyab\Desktop\シューティングゲーム\自機.png");//画像ファイル指定 40 JLabel ziki = new JLabel(icon1);//JLabelに画像ファイル設定 41 ziki.setBounds(zikiX[0], zikiY[0], 80, 40);//zikiのサイズと座標設定 42 43 panel.add(ziki);//自機画像をpanelに追加 44 45 getContentPane().add(panel, BorderLayout.CENTER);//??? 46 47 enableEvents(java.awt.AWTEvent.KEY_EVENT_MASK); 48 49 } 50 51 protected void processKeyEvent(java.awt.event.KeyEvent e){ 52 53 if(e.getID() == java.awt.event.KeyEvent.KEY_PRESSED){ 54 System.out.println("キー" +e.getKeyCode()+ "が押されました"); 55 56 if(e.getKeyCode() == java.awt.event.KeyEvent.VK_LEFT){ 57 58 zikiX[0] = zikiX[0]+10; 59 System.out.println(zikiX[0]); 60 61 } 62 63 } 64 65 } 66 67} 68 69
退会済みユーザー👍を押しています

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

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

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

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

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

guest

回答1

0

ベストアンサー

初期設定コードで

ziki.setBounds(zikiX[0], zikiY[0], 80, 40);

のように指定してますね?これで最初の位置と大きさを指定しているわけですが、キー操作によって位置を変えたいならキーイベントのハンドラー内で同様のことをして新たな位置を指定すればよいです。

java

1import java.awt.event.KeyEvent; 2... 3@Override 4protected void processKeyEvent(KeyEvent e) { 5 ... 6 if (...) { 7 if (e.getKeyCode() == KeyEvent.VK_LEFT) { 8 zikiX[0] -= 10; // 左に移動するならX座標は増やすのではなく減らすのでは? 9 ziki.setLocation(zikiX[0], zikiY[0]); // 新たな位置を設定 10 } 11 } 12}

さて上記のようにするためにはイベントハンドラー(processKeyEvent)の中でzikiにアクセスできなければなりません。現状のコードではzikiはコンストラクター内部のローカル変数ですので他のメソッドからはアクセスできません。ということでzikiをローカル変数ではなくMyGameクラスのフィールドにしてください。


余談:

ちなみにコード上ではJButtonをコンポーネント階層上へ追加していませんが、これを表示されるようにしたとたん、現状のコードではキーイベントは受け取れなくなります。というのは画面が最初に表示された時、JButtonがフォーカスを奪ってしまうためです。とりあえずゲームを手軽に作る目的なら標準でフォーカスが移動するようなコントロール(ボタンやリストなど代表的なほとんどのコンポーネント)は使わずにフォーカスが移動しないようなもの(単に表示するために用いるようなラベルやパネル)のみを使って画面を構成する方が簡単と思います。

swingが提供するボタンやリストなど豊富な機能を使うにはフォーカスなどのトピックについて「しかるべき作法」を学んでおく必要があるのですが、swingを学びたてで「とりあえず動く簡単なゲームを作りたい」という場面ではこのようなトピックを学ぶのは少々まどろっこしく感じるかも知れません。というのもそれなりにややこしいからです。それを回避するため「ラベルやパネルのみで画面を構成し、swingのフォーカスの振る舞いに影響を受けずに済むようにする」というのは一つの作戦になると思います。もし普通のswingアプリを作る機会がいつかくれば、そのときになって学んでも遅くはないと思います。まずは動くものを作って楽しみながら学ぶということでいいんじゃないかと思います。

投稿2017/09/30 00:35

KSwordOfHaste

総合スコア18394

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

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

Alpa

2017/09/30 09:06

丁寧な文で教えていただきありがとうございます いろいろ参考にしたいと思います
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問