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ページで確認できます。
またクリップした質問に回答があった際、通知やメールを受け取ることができます。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
回答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
総合スコア18394
あなたの回答
tips
太字
斜体
打ち消し線
見出し
引用テキストの挿入
コードの挿入
リンクの挿入
リストの挿入
番号リストの挿入
表の挿入
水平線の挿入
プレビュー
質問の解決につながる回答をしましょう。 サンプルコードなど、より具体的な説明があると質問者の理解の助けになります。 また、読む側のことを考えた、分かりやすい文章を心がけましょう。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2017/04/17 23:01
2017/04/18 01:14