• 締切済み

画像を分割するには?【パズルゲーム製作】

プログラミングの勉強のため、 フラッシュゲームによくあるような、 15パズルを作ろうと思っています。 使用言語はJavaのSwingです。 最初に、次のようなコードで、 パズルに使用する画像をラベルに追加しましたが、 この画像を4*4に分割する方法が見つかりませんでした。 Icon icon = new ImageIcon(imageAddress[0]); int iconHeight = icon.getIconHeight(); int iconWidth = icon.getIconWidth(); JLabel lbl = new JLabel(icon); どうすればいいかアドバイスをいただけると助かります。 また、ゲーム作りや、画像処理関係で、 参考になる書籍などもあれば教えてほしいです。 よろしくお願いします。 参考になるかわかりませんが、 以下に全ソースをのせておきます。 import javax.swing.*; public class Game15 extends JFrame{ private static final long serialVersionUID = 1L; String[] imageAddress = { "2506723431_fe31da9b39.jpg", "2507551314_4800225620.jpg", "2949837591_e2ef3f5515.jpg", "3098905192_b7aa1f5715.jpg", "3830931070_76a5b67b85.jpg", "3830931616_16c6ef11ee.jpg"}; public Game15(String s){ super(s); JPanel p0 = new JPanel(); Icon icon = new ImageIcon(imageAddress[0]); int iconHeight = icon.getIconHeight(); int iconWidth = icon.getIconWidth(); JLabel lbl = new JLabel(icon); p0.add(lbl); add(p0); setSize(iconWidth + 16,iconHeight + 40); } public static void main(String[] args){ Game15 game15 = new Game15("15パズル"); game15.setDefaultCloseOperation(EXIT_ON_CLOSE); //game15.setSize(iconWidth,300); game15.setLocationRelativeTo(null); game15.setVisible(true); } }

  • Java
  • 回答数2
  • ありがとう数5

みんなの回答

  • HarukaV49
  • ベストアンサー率53% (48/89)
回答No.2

java.awt.image.BufferedImageクラスを使います。 そうすれば、  BufferedImage#getSubimage(int x, int y, int w, int h) を使って、簡単に任意位置の画像を切り出せます。

hiyokko7
質問者

お礼

なるほど。試してみようと思います。 ありがとうございました。

  • kyonn2008
  • ベストアンサー率22% (4/18)
回答No.1

ペイント系のソフト使って画像を4*4に分けては? そういうことではなくて?

hiyokko7
質問者

お礼

分割はソフト側でやったほうが手間がかからないのではと思ったのですが。 画像の枚数が少数なら分割するのもありですかね。 ありがとうございました。

関連するQ&A

  • Jave Swing 画像表示わからない

    java swingでGUIをプログラミングしている者です。 JLabelにImageIconの画像を貼り付けるプログラムです。↓ //画像を表示するプログラム //インポート import javax.swing.*; import java.awt.*; import java.awt.event.*; class gazopro extends JFrame{ JLabel l1; JButton b1; JPanel p; public static void main(String args[]) { //ウィンドウを作成また設定 gazopro frame = new gazopro(); frame.setBounds(300,200,700,400); frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); frame.setVisible(true); } gazopro(){ //コンポーネントを作成 p = new JPanel(); add(p); b1 = new JButton("画像を表示"); p.add(b1); ImageIcon icon = new ImageIcon("image.jpg"); l1 = new JLabel(icon); p.add(l1); } }   わからないところは、ImageIcon icon = new ImageIcon("image.jpg");のところです。 ImageIconの引数は、プログラミングを行っているパソコン(OS は Windows)のマイコンピューター→ Cドライブ→ MyJava→ image.jpgを指定しましたがこれで合ってますか? このプログラムでは、画像が表示されませんでした。 どうすればいいでしょうか? 解説と、ご指導宜しくお願いします。

    • ベストアンサー
    • Java
  • 画像がうまく切り替わらない

    画像がうまく切り替わらない 初心者なため、上記の通りうまく画像を切り替えることができません。 わかる方、申し訳ありませんがご協力お願いいたします。 QUIZフォルダにあるQ1.jpg~Q80.jpgまでの画像を問題文として使った、4択のクイズ形式のプログラムを作成しています。 このプログラムなのですが、1問目と2問目はうまく表示されますが、3問目から画像が切り替わらなくなってしまっています。 swingを使い、以下のような内容でJPanel pにQ80.jpgまで切り替えていこうとしていました。 p.remove(5); ImageIcon icon1 = new ImageIcon("./QUIZ/Q2.jpg"); JLabel label1 = new JLabel(icon1); p.add(label1); new ImageIconを使いすぎなのが原因かとも思っているのですが、どのように直していいものかわからないため、ご指導お願いします。

    • ベストアンサー
    • Java
  • Eclipseから実行すると画像が読み込まれない

    下記のコードをEclipseから実行すると画像が読み込まれないのですが、コマンドプロンプトから実行すると画像が読み込まれます。 コードが同じなのに不思議です…。 原因はどんなことが考えられるのでしょうか? class test extends JFrame{ public static void main(String args[]){ test frame = new test("タイトル"); frame.setVisible(true); } test(String title){ setTitle(title); setBounds(100, 100, 500, 500); setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); JPanel p = new JPanel(); ImageIcon icon1 = new ImageIcon("img.jpg"); JLabel label1 = new JLabel(icon1); p.add(label1); Container contentPane = getContentPane(); contentPane.add(p, BorderLayout.CENTER); } }

    • ベストアンサー
    • Java
  • Javaのプログラミング手伝ってください

    以下のソースコードを応用して、添付画像のような数字のかかれた画像を3つ並べてそれを回して7を揃えるというゲームを作りたいのですが全く進みません。どなたか完成させてくださいm(__)m使用する画像のファイル名は「slot1.jpeg」~「slot7.jpeg」です。 import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import javax.swing.ImageIcon; import javax.swing.JButton; import javax.swing.JFrame; import javax.swing.JLabel; import javax.swing.JPanel; import javax.swing.Timer; public class OneSlot extends JFrame implements ActionListener { private static final long serialVersionUID = 1L; final int MAX = 7; Timer timer = new Timer(150 , this); JLabel label= new JLabel("スタートで始まるよ",JLabel.CENTER); JButton[] bt = {new JButton("スタート"),new JButton("ストップ")}; JLabel slot= new JLabel(new ImageIcon("Slot1.jpg"),JLabel.CENTER); ImageIcon[] slot_icon = new ImageIcon[MAX]; int iCount = 0; OneSlot(String title) { super(title); timer.setActionCommand("timer"); setBounds(200, 200, 230, 150); setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); for(int i = 0;i < slot_icon.length; i++) slot_icon[i] = new ImageIcon("Slot" + (i+1) + ".jpg"); add("North",label); add("Center",slot); JPanel p = new JPanel(); for (int i = 0; i < bt.length;i++) { bt[i].addActionListener(this); p.add(bt[i]); } add("South",p); setVisible(true); } public static void main(String[] args) { new OneSlot("スロットマシン"); } public void actionPerformed(ActionEvent e) { String cmd = e.getActionCommand(); if(cmd.equals("timer")) { if(++iCount == slot_icon.length) iCount = 0; slot.setIcon(slot_icon[iCount]); } if(e.getSource() == bt[0] && !timer.isRunning()) { label.setText("7が当たりだよ"); timer.start(); } else if(e.getSource() == bt[1] && timer.isRunning()) { if(iCount+1 == MAX) label.setText("やった!!おめでとう"); else label.setText("残念でした"); timer.stop(); } } }

  • JAVAでの背景画像表示

    現在javaでゲームのメニュー画面を作っているのですが、ボタンを配置する所まではできたんですが、背景に画像を表示することができなくて困っています! import javax.swing.JFrame; import javax.swing.JPanel; import javax.swing.JLabel; import javax.swing.ImageIcon; import java.awt.Container; import java.awt.BorderLayout; import javax.swing.border.LineBorder; import javax.swing.border.EtchedBorder; import java.awt.Color; import java.awt.Container; public class Mati extends JFrame{ public static void main(String[] args){ Mati frame = new Mati(); frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); frame.setBounds(10, 10,650,650); frame.setTitle("街"); frame.setVisible(true); JPanel h = new JPanel(); h.setOpaque(false); ImageIcon icon1 = new ImageIcon("Mati.jpg"); JLabel label1 = new JLabel(icon1); JLabel label2 = new JLabel(); h.add(label1); } Mati(){ JButton button1 = new JButton("宿屋"); button1.setFont(new Font("Mairyo", Font.PLAIN, 30)); JButton button2 = new JButton("道具屋"); button2.setFont(new Font("Mairyo", Font.PLAIN, 30)); JButton button3 = new JButton("武器屋"); button3.setFont(new Font("Mairyo", Font.PLAIN, 30)); JButton button4 = new JButton("街を出る"); button4.setFont(new Font("Mairyo", Font.PLAIN, 30)); JPanel p = new JPanel(); p.setLayout(new BoxLayout(p, BoxLayout.Y_AXIS)); p.add(Box.createRigidArea(new Dimension(10,30))); p.add(button1); p.add(Box.createRigidArea(new Dimension(5,8))); p.add(button2); p.add(Box.createRigidArea(new Dimension(5,8))); p.add(button3); p.add(Box.createRigidArea(new Dimension(5,8))); p.add(button4); getContentPane().add(p, BorderLayout.CENTER); } } ソースはこのようになっています。これからどうすれば背景画像が表示されるか教えていただきたいです。 よろしくお願いします。

  • javaでスタート画面を作っていて困っています。

    現在javaでゲームのスタート画面を作っているのですが、パネルが透過されずに困っています。 プログラムソースは import javax.swing.JFrame; import javax.swing.JPanel; import javax.swing.JLabel; import javax.swing.ImageIcon; import java.awt.Container; import java.awt.BorderLayout; import javax.swing.*; import java.awt.Font; import java.awt.BorderLayout; import java.awt.Dimension; import java.awt.*; import java.awt.event.*; import javax.swing.JFrame; import javax.swing.JPanel; import javax.swing.JLabel; import javax.swing.ImageIcon; import java.awt.Container; import java.awt.BorderLayout; import javax.swing.border.LineBorder; import javax.swing.border.EtchedBorder; import java.awt.Color; import java.awt.Container; class Start最新版 extends JFrame{ public static void main(String args[]){ Start最新版 frame = new Start最新版("タイトル"); frame.setVisible(true); } Start最新版(String title){ setTitle(title); setBounds(10, 10, 1024, 768); setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); JPanel p = new JPanel(); p.setOpaque( false ); ImageIcon icon1 = new ImageIcon("Start.jpg"); JLabel label1 = new JLabel(icon1); JLabel label2 = new JLabel(); p.add(label1); Container contentPane = getContentPane(); contentPane.add(p, BorderLayout.CENTER); JButton button1 = new JButton("ゲームを始める"); button1.setFont(new Font("Mairyo", Font.PLAIN, 30)); JPanel n = new JPanel(); n.setOpaque(false); n.setLayout(new BoxLayout(n, BoxLayout.Y_AXIS)); n.add(Box.createRigidArea(new Dimension(290,30))); n.add(button1); となっています。「ゲームを始める」ボタンだけを残して、周りのパネルを透過して画像を表示させたいのですが、うまくいきません!解決方法をご存知の方どうか教えていただきたいです!よろしくお願いします。

  • 画像が表示されません。

    画像のRGBヒストグラムを表示するプログラムを以下のように作りました。 import java.awt.*; import java.awt.event.*; import java.awt.image.*; import javax.swing.*; import javax.swing.ImageIcon; import java.io.*; class RGBMain{ public static void main(String argv[]){ JFrame f=new JFrame("画像とそのヒストグラム"); JPanel p1=new JPanel(); JPanel p2=new JPanel(); JPanel p3=new JPanel(); JLabel l1=new JLabel("input photo"); JLabel l2=new JLabel(); JTextField tf=new JTextField(15); JButton b1=new JButton("open"); JButton b2=new JButton("start"); LoadFile lf=new LoadFile(tf, l2, p2); ShowHist sh=new ShowHist(tf, p3); tf.addKeyListener(lf); b1.addActionListener(lf); b2.addActionListener(sh); p1.add(l1); p1.add(tf); p1.add(b1); p1.add(b2); p2.add(l2); f.setDefaultCloseOperation(f.EXIT_ON_CLOSE); f.getContentPane().add(p1,BorderLayout.NORTH); f.getContentPane().add(p2,BorderLayout.WEST); f.getContentPane().add(p3,BorderLayout.EAST); f.setSize(800, 500); f.setVisible(true); } } class LoadFile implements ActionListener, KeyListener{ JTextField textField; JLabel label; JPanel panel; public LoadFile(JTextField Textfield, JLabel lbl, JPanel pnl){ textField=Textfield; label=lbl; panel=pnl; } public void actionPerformed(ActionEvent e){ if(getClass().getResource(textField.getText())==null) label.setText("ファイルが見つかりません。"); else{ ImageIcon imgicon=new ImageIcon(getClass().getResource(textField.getText())); label.setIcon(imgicon); } label.repaint(); panel.repaint(); } public void keyTyped(KeyEvent e){ if(e.getKeyCode()==e.VK_ENTER){ if(getClass().getResource(textField.getText())==null) label.setText("ファイルが見つかりません。"); else{ ImageIcon imgicon=new ImageIcon(getClass().getResource(textField.getText())); label.setIcon(imgicon); } label.repaint(); panel.repaint(); } } public void keyPressed(KeyEvent e){ } public void keyReleased(KeyEvent e){ } } class ShowHist implements ActionListener{ JTextField textField; JPanel p; public ShowHist(JTextField Textfield, JPanel pnl){ textField=Textfield; p=pnl; } public void actionPerformed(ActionEvent e){ try{ File f=new File(textField.getText()); BufferedImage bi=javax.imageio.ImageIO.read(f); int rgb; int[] rhist=new int[16]; int[] ghist=new int[16]; int[] bhist=new int[16]; int re, gr, bl; int width=bi.getWidth()/3*2/16; for(int y=0;y<=bi.getHeight();y++){ for(int x=0;x<=bi.getWidth();x++){ rgb=bi.getRGB(x, y); bl=rgb%256; gr=bl%256; re=gr%256; rhist[re/16]++; ghist[gr/16]++; bhist[bl/16]++; } } Graphics g=p.getGraphics(); g.setColor(Color.red); int i; int xx=0; for(i=0;i<16;i++){ g.fillRect(xx, bi.getHeight()/3, width, bi.getHeight()/3*(rhist[i]/(bi.getWidth()*bi.getHeight()))); xx+=width; } g.setColor(Color.green); xx=0; for(i=0;i<16;i++){ g.fillRect(xx, bi.getHeight()/3*2, width, bi.getHeight()/3*(ghist[i]/(bi.getWidth()*bi.getHeight()))); xx+=width; } g.setColor(Color.green); xx=0; for(i=0;i<16;i++){ g.fillRect(xx, bi.getHeight()/3*3, width, bi.getHeight()/3*(bhist[i]/(bi.getWidth()*bi.getHeight()))); xx+=width; } p.repaint(); }catch(IOException ex){ ex.printStackTrace(); } } } コンパイルは問題なく通り、 実行すると、ウィンドウは表示されるのですが、ファイル名を入力して openボタンをクリックしてもなにも反応がありません。特に例外も発生していないようなのですが、なぜでしょうか。 ちなみに、画像ファイル名はtrain.jpgで、javaソースファイル、各classファイルと同じディレクトリに置いています。 どなたかよろしくお願いします。

  • JButtonの画像をactionPerformedメソッド内で再描画

    JButtonの画像をactionPerformedメソッド内で再描画したい。 以下のソースのようにして、再描画したいのです。 setIconメソッドではなく、 JButtonに対して描画したものに対して再描画したいです。 Graphics2DクラスについてJAVA APIで調べましたが、 仕組の理解に至りませんでした。 仕組みと方法を教えて頂きたいです。 よろしくお願いいたします。 import java.awt.Graphics; import java.awt.Graphics2D; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import javax.swing.ImageIcon; import javax.swing.JButton; import javax.swing.JComponent; import javax.swing.JFrame; public class test extends JFrame implements ActionListener{ JButton b= new JButton(); public static void main(String a[]) { new test(); } public test() { super(); this.setSize(100,100); b.addActionListener(this); b.add(new Zoom(new ImageIcon("img1.jpg"),0,0,50,50)); this.add(b); this.setVisible(true); } class Zoom extends JComponent { private static final long serialVersionUID = 1L; private ImageIcon icon = null; private int x = 0; private int y = 0; private int h = 0; private int w = 0; private double scale = 1.0d; public Zoom(ImageIcon icon, int x, int y, int w, int h) { super(); this.icon = icon; this.x = x; this.y = y; this.w = w; this.h = h; } public void paintComponent(Graphics g) { Graphics2D g2 = (Graphics2D) g; g2.scale(scale, scale); ////////////////////////////////// //画僧を再描画したい。 //g2.clearRect(0, 0, 80, 80);//× g2.drawImage(icon.getImage(), x, y, w, h, this); } } public void actionPerformed(ActionEvent e) { if(e.getSource()==b){ System.out.print("ok"); //this.repaint();//× //b.repaint();//× b.add(new Zoom(new ImageIcon("img2.jpg"),0,0,50,50));//(再描画できない) //b.setIcon(new ImageIcon("img2.jpg"));//ok(再描画出来る) } } }

    • ベストアンサー
    • Java
  • Java ゲームプログラミング 例外

    JavaでSwing GUIプログラミングをしている者です。 初めて自分で1からプログラムを組んで、念願のゲームを作るということになりました。 自分が作っているゲームは、サバイバルゲームで自分の体力1000相手100でどれだけ倒せるか、というゲームです。 まだ、攻撃してダメージを与えるや、相手の数は一体だったりします。初の挑戦なのでご了承ください。 プログラム↓(長いかも) //ゲームサバイバル import java.awt.*; import javax.swing.*; import java.awt.event.*; class startgame { //スタート画面クラス public static JButton b1start; public static JPanel p1,p2; //p2はスタートボタンを押した後にでるJPanel public static JLabel l1; startgame start = new startgame(); startgame(){ p1 = new JPanel(); p1.setLayout(new BorderLayout()); p1.setBackground(Color.green); p2 = new JPanel(); p2.setLayout(new BorderLayout()); p2.setBackground(Color.green); b1start = new JButton("GAME START"); b1start.setForeground(Color.red); Font font = new Font(Font.SERIF,Font.BOLD,50); p1.add(b1start); l1 = new JLabel("SURVIVAL GAME"); l1.setFont(font); p1.add(l1,BorderLayout.NORTH); } } class Teki{ //敵クラス public static JLabel l0icon,l0p; public static ImageIcon Ticon; static int yourP; Teki teki = new Teki(); Teki(){ ImageIcon Ticon = new ImageIcon("./.jpeg"); //相手の画像 l0icon = new JLabel(Ticon); startgame.p2.add(l0icon,BorderLayout.CENTER); l0p = new JLabel("100"); //相手体力 int yourP = Integer.parseInt(l0p.getText()); //JLabelをint型に型変化 startgame.p2.add(l0p,BorderLayout.EAST); } } class Jibun{ //自分クラス public static JLabel l0p2; public static JButton kogeki; Jibun jibun = new Jibun(); Jibun(){ l0p2 = new JLabel("1000"); startgame.p2.add(l0p2,BorderLayout.WEST); //自分の体力 kogeki = new JButton("攻撃"); startgame.p2.add(kogeki,BorderLayout.WEST); //攻撃ボタン } } class maingame extends JFrame implements ActionListener{ public static void main(String[] args) { //はじめ maingame frame = new maingame(); frame.setBounds(200,200,700,400); frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); frame.setVisible(true); } maingame(){ super("サバイバルゲーム"); add(startgame.p1); startgame.b1start.addActionListener(this); Jibun.kogeki.addActionListener(this); } public void actionPerformed(ActionEvent e){ Object obj = e.getSource(); if(startgame.b1start == obj) { startgame.p1.add(startgame.p2); //スタートボタンの処理 } else if(Jibun.kogeki == obj){ System.out.println("攻撃した"); //攻撃処理 } } これをコンパイルすると、このような例外が出ます。↓ Exception in thread "main" java.lang.NullPointerException at java.awt.Container.addImpl(Unknow Source) at java.awt.Container.add(Unknow Source) at javax.swing.JFrame.addImpl(Unknow Source) at java.awtContainer.add(Unknow Source) at maingame.<init>(maingame.java:88) at maingame.main(maingame.java:77) となります。 これは、どうすれば解決できますか? 他にも、「ここはこうしたほうがいい」などがありましたら、どんどんご指摘ください。

    • ベストアンサー
    • Java
  • Jlabel?の上に2つ画像を載せクリックを識別

    JLabelを使えばいいのかよくわからないのですが掲示した 画面のように背景色に薄い赤を指定して2つの矢印画像を 表示します。その矢印の中央に年月を表示したいと思っています。 また、右の矢印をクリックしたら翌月の年月が表示され 左の矢印をクリックしたら前月の年月が表示したいです。 これをswingで完成したいと思っています。 また各コンポーネントは setBounds(int x,int y,int width,int height)で出来ると助かります。 ImageIcon leftIcon = new ImageIcon("./img/left.gif"); ImageIcon rightIcon = new ImageIcon("./img/right.gif"); JLabel label = new JLabel(); label.setText("2010年10月"); label.setIcon(leftIcon); label.setLocation(20,0); label.setSize(170, 20); label.setBackground(Color.white); label.setOpaque(true); ここから先がわかりません どうしても1つの画像と1つのテキストしか表示できません。

    • ベストアンサー
    • Java

専門家に質問してみよう