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

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

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

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

Q&A

解決済

2回答

1383閲覧

java eclipseについて

syo17

総合スコア11

Java

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

0グッド

0クリップ

投稿2017/04/17 06:32

編集2017/04/18 03:32

java eclipseでスライドパズルを作成しています。
9枚の画像で作成しており、現在は9枚の画像を実行するたびにランダムで表示するところまでいきました。
その後ですが9枚の画像のうち一枚を空白にし、上下左右のキーを押すと空白になった部分と対応した押したキーの位置にあるピースが入れ替わるようにしたいのですが時間がかかっておりなかなか進めません。

コード ```public interface Gazo { public static final String s[] = { "画像1枚目【実際はここに画像の位置を入力しています。 デスクトップにある場合 C:\Users\ユーザー名\Desktop】", "画像2枚目", "画像3枚目", "画像4枚目", "画像5枚目", "画像6枚目", "画像7枚目", "画像8枚目", "画像9枚目" }; }

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

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

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

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

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

guest

回答2

0

ベストアンサー

アニメーション方式の参考にサンプルを書いてみました。

  • アニメーションの基本的制御

Timerによる周期処理を使ってます。

  • GridLayout

グリッド枠からずれた位置にタイルを描画する関係上GridLayoutは使ってません。

java

1import javax.imageio.ImageIO; 2import javax.swing.*; 3import java.awt.*; 4import java.awt.event.*; 5import java.awt.image.BufferedImage; 6import java.io.IOException; 7 8public class SlideSample extends JFrame { 9 public static void main(String[] args) { 10 SwingUtilities.invokeLater(() - > { // ラムダ式 11 new SlideSample().setVisible(true); 12 }); 13 } 14 15 SlideSample() { 16 super("Slide sample"); 17 getContentPane().add(new SlidePane(), BorderLayout.CENTER); 18 setDefaultCloseOperation(EXIT_ON_CLOSE); 19 pack(); 20 } 21} 22 23class SlidePane extends JComponent { 24 static final int MAX_ANIMATION_FRAME = 5; 25 int animationFrame; 26 Timer timer = new Timer(20, this::animation); //メソッド参照(this::animation) 27 final int w, h; // タイル一つの幅・高さ 28 int toRow = 0, toCol = 0; // 空白タイルの行・列位置 29 int fromRow, fromCol; // 移動中タイルの行・列位置 30 Image[][] images = new Image[3][3]; 31 32 SlidePane() { 33 BufferedImage im; 34 try { //画像は100x100 pixel程度を想定 35 im = ImageIO.read(getClass().getResource("sample.jpg")); 36 } catch (IOException e) { 37 throw new RuntimeException(e); 38 } 39 w = im.getWidth(); 40 h = im.getHeight(); 41 // 本来は8種類の画像にすべきだが省略(8枚とも同じ画像) 42 for (int i = 0; i < 9; i++) 43 if (i != 0) images[i / 3][i % 3] = im; 44 setPreferredSize(new Dimension(w * 3, h * 3)); 45 setFocusable(true); // キーイベントを捕捉するために必要 46 addKeyListener(keyListener); 47 } 48 49 static boolean isValidRowCol(int v) { 50 return 0 <= v && v < 3; 51 } 52 53 KeyListener keyListener = new KeyAdapter() { 54 @Override public void keyPressed(KeyEvent ev) { 55 if (timer.isRunning()) return; // アニメーション中はキー入力無視 56 fromRow = toRow; 57 fromCol = toCol; 58 switch (ev.getKeyCode()) { 59 case KeyEvent.VK_UP: fromRow++; break; 60 case KeyEvent.VK_DOWN: fromRow--; break; 61 case KeyEvent.VK_LEFT: fromCol++; break; 62 case KeyEvent.VK_RIGHT: fromCol--; break; 63 default: return; 64 } 65 if (!isValidRowCol(fromRow) || !isValidRowCol(fromCol)) return; 66 timer.setRepeats(true); 67 animationFrame = 0; 68 timer.start(); 69 ev.consume(); 70 } 71 }; 72 73 void animation(ActionEvent ev) { 74 if (++animationFrame == MAX_ANIMATION_FRAME) { 75 images[toRow][toCol] = images[fromRow][fromCol]; 76 images[fromRow][fromCol] = null; 77 toRow = fromRow; 78 toCol = fromCol; 79 timer.stop(); 80 animationFrame = 0; 81 } 82 repaint(); 83 } 84 85 @Override public void paintComponent(Graphics g) { 86 int toX = toCol * w, toY = toRow * h; 87 for (int rc = 0; rc < 9; rc++) { 88 int row = rc / 3, col = rc % 3; 89 if (row == toRow && col == toCol) continue; 90 int x = col * w, y = row * h; 91 if (row == fromRow && col == fromCol) { 92 x = x + (toX - x) * animationFrame / MAX_ANIMATION_FRAME; 93 y = y + (toY - y) * animationFrame / MAX_ANIMATION_FRAME; 94 } 95 g.drawImage(images[row][col], x, y, this); 96 } 97 } 98}

Java8前提でラムダ式、メソッド参照を使ってます。

投稿2017/04/17 16:18

KSwordOfHaste

総合スコア18394

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

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

syo17

2017/04/17 23:01

回答ありがとうございます!(^_^) とても参考になりましたが、出来れば質問で挙げた3つのクラスで9枚の画像のうち一枚を空白にし、上下左右のキーを押すと空白になった部分と対応した押したキーの位置にあるピースが入れ替わるようにしたいです。 自分でも参考書やネットで調べてやっているのですがなかなか進めません…
KSwordOfHaste

2017/04/18 01:14

質問者さんのコードを踏襲し回答として不自然さがないよう設計するのは手間がかかるものなのでそこはご勘弁ください。自分の回答意図はあくまで「アニメーション機能の実装ヒントの提示」であり、「要求されたコードの提供」ではありません。 多分お気づきでないと思いますが、こうしたサイトで新たな機能(アニメーションなど)を実装したコードそのものを要求するのは丸投げとみなされ歓迎されないと思います。 初学者と経験者では設計にかかる時間は何倍~何十倍もの差がありますが、その差を埋めるには数か月~年単位の時間が必要ですし、一挙には埋まるものでもありません。早道は完成品のコードを得ることではなく、自ら設計・コード化をする訓練の方だと思います。
guest

0

回答者のアドバイスや知り合いからのアドバイスによって解決いたしました。

投稿2017/04/18 01:38

syo17

総合スコア11

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.47%

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

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

質問する

関連した質問