• ベストアンサー

Javaでパラパラアニメを作成するには、

どうしたらいいのでしょうか。 初心者なのにイキナリ作ることになってしまいました。 5枚の絵をループでアニメーションさせたいのですが。 フレームを作るところまでは出来たのですが、その先がよく分かりません。どのようにして画像を読み込んで一定のタイミングではなくそれぞれの絵のタイミングでアニメさせればいいのでしょうか、お願い致します。 import java.awt.Insets; import javax.swing.JFrame; public class Animetion { static JFrame frame1; Animetion(){ frame1 = new JFrame("アニメ"); frame1.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); frame1.setVisible(true); } public static void main(String[] args) { Animetion gtm = new Animetion(); //インスタンス Insets insets = frame1.getInsets(); frame1.setSize(600 + insets.left + insets.right,400 + insets.top + insets.bottom); } }

  • Java
  • 回答数4
  • ありがとう数3

質問者が選んだベストアンサー

  • ベストアンサー
  • BLUEPIXY
  • ベストアンサー率50% (3003/5914)
回答No.1

試しに作ってみました。 私自身経験値があまりないので、変なプログラムかも。 とりあえず、画像の数、画像のファイル名(imgX.gif)、タイミングは決め打ちにしています。 ---------------------------------------------------------------- import java.awt.*; import javax.swing.JFrame; public class Anime{ public static void main(String[] args) { AnimeFrame frame1=new AnimeFrame(); frame1.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); frame1.pack(); frame1.setBounds(100,100,180,240); frame1.loadImage(); frame1.setTitle("アニメ"); frame1.setVisible(true); Thread th = new Thread(frame1); th.start(); } } class AnimeFrame extends JFrame implements Runnable{ Image[] images = new Image[5]; int[] timing = { 100,100,200,200,100}; int no=0; public void run(){ while(true){ repaint(); try{ Thread.sleep(timing[no]); } catch(Exception e){} } } public void loadImage(){ Toolkit tk; tk = Toolkit.getDefaultToolkit(); for(int i=0;i<5;i++){ images[i]=tk.getImage("img"+i+".gif"); } } public void update(Graphics g) { paint(g); if(++no==8)no=0; } public void paint(Graphics g){ g.drawImage(images[no],40,40,this); } }

megumi0808
質問者

お礼

とりあえず出来ました! 有難うございます! すみません、これらはどうしてこうなるのでしょうか? フレーム作成までは出来たのですが、その後の仕組みがさっぱり分かりません。

その他の回答 (3)

  • kacchann
  • ベストアンサー率58% (347/594)
回答No.4

これ、超基礎ですけど、 できますか? (1)Frame上に文字を表示させてください (2)Frame上に画像を表示させてください (3)「repaint()を使って画面を書き直す(「再描画」させる)デモプログラム」  を作って下さい (4)「スレッドとは何か?」をごく簡単に説明してください これらを理解していれば、 パラパラアニメの仕組みも理解できると思います。 答え (1)http://wisdom.sakura.ne.jp/system/java/awt/Gjava3.html (2)http://wisdom.sakura.ne.jp/system/java/awt/Gjava48.html (3)http://wisdom.sakura.ne.jp/system/java/awt/Gjava8.html http://wisdom.sakura.ne.jp/system/java/awt/Gjava16.html http://wisdom.sakura.ne.jp/system/java/awt/Gjava17.html http://wisdom.sakura.ne.jp/system/java/awt/Gjava18.html (4)http://wisdom.sakura.ne.jp/programming/java/java36.html --- で、最後に、 (5)スレッドを利用して画像をアニメーションさせてください (5)http://wisdom.sakura.ne.jp/system/java/awt/Gjava9.html --- 参考サイト http://wisdom.sakura.ne.jp/ とりあえず質問者さんには、 上記参考サイトの内容を本にした、この本 http://wisdom.sakura.ne.jp/products/books/java_swing.html をとりあえず買っておくことをお奨めします。 値段も安いし。

megumi0808
質問者

お礼

とても分かりやすいサイトですね^^ 空き時間にでもやっていこうと思います。 教えていただいた本、実は以前買おうかさんざん迷った本です^^; Amazonでの評価などもよさげですので、もう一度本屋へ行って買ってこようと思います、、 有難うございました。

  • BLUEPIXY
  • ベストアンサー率50% (3003/5914)
回答No.3

>これらはどうしてこうなるのでしょうか? どうしてと言われても困りますが、、(^^; まず、 他にも方法はありますが、 画像の取り込みと表示 Toolkit tk; Image img; tk = Toolkit.getDefaultToolkit(); img=tk.getImage("img.gif"); みたいな形でメモリ上に読み込みます。 フレームに描画するのは、 public void paint(Graphics g){ g.drawImage(img,x座標,y場所,this); } みたいにして描画します。 パラパラアニメするために、 あらかじめ Image[] images = new Image[5]; のように配列にして for(int i=0;i<5;i++){ images[i]=tk.getImage("img"+i+".gif"); } みたいな感じで読み込んでおきます。 そうしておけば、それぞれの画像を番号で切り換えて描画すればいいです。 repaint(); は、再描画させる命令で update(Graphics) が呼び出されます。 この時に、次に表示する番号を更新しています。 implements Runnable は、Runnable インターフェースを実装するクラスということです。 Runnable インターフェースを実装するクラスは、Run メソッドを実装します。 これで、別スレッドとして呼び出すことができるようになります。 Thread th = new Thread(frame1); th.start(); のようにスレッドを作成し、スレッドの実行を開始します。 すると、Run メソッドが呼び出されて実行されます。 Run メソッドの中で repaint() が呼び出されて、 Thread.sleep(timing[no]); によって指定した時間、時間待ちをします。

megumi0808
質問者

お礼

有難うございました! 半分くらい理解できたような気がします^^; ちょっとずつ覚えていきたいです。

  • BLUEPIXY
  • ベストアンサー率50% (3003/5914)
回答No.2

#1で if(++no==8)no=0; は、 if(++no==5)no=0; ですね。 他の数値もウチで試していた時の数値になっているので、適当に変更してください。

関連するQ&A

  • 次のように書いたのですが、ウィンドウの背景色が白になりませんでした。setBackground辺りがおかしいと思うんですが。

    本に書いてあった下記のプログラムを書いて実行したのですが、ウィンドウズの背景色が白になりませんでした。 setBackground(WHITE)をBLACKにしても、背景色は変わりません。 どこに問題があるのか教えていただけないでしょうか。 import javax.swing.JFrame; import java.awt.Color; import java.awt.Insets; public class GameTestMain { JFrame frame1; GameTestMain(){ frame1 = new JFrame("ゲームテスト"); frame1.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); frame1.setBackground(Color.WHITE); frame1.setResizable(false); frame1.setVisible(true); Insets insets = frame1.getInsets(); frame1.setSize(600 + insets.left + insets.right, 400 + insets.top + insets.bottom); frame1.setLocationRelativeTo(null); } public static void main(String[] args) { GameTestMain gtm = new GameTestMain(); } Eclipse3.0.1を使っています。 よろしくお願いしますm(_ _)m

  • eclipseにて~背景色が表示されない~

    JAVAゲームプログラムミング教室という本でただいまゲームを作っているのですが 本にそって、それどおりに進めていたのですが、ウィンドウの背景色を決めるところでエラーも出ていないのに指定された背景色になりません 以下にプログラムを書きます package jp.aroro.minigame; import java.awt.Color; import java.awt.Insets; import javax.swing.JFrame; public class GameTestMain { JFrame frame1; GameTestMain(){ frame1=new JFrame("ゲームテスト"); frame1.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); frame1.setBackground(Color.WHITE); frame1.setResizable(false); frame1.setVisible(true); Insets insets = frame1.getInsets();// frame1.setSize(600+insets.left+insets.right,400+insets.top+insets.bottom); frame1.setLocationRelativeTo(null); } public static void main(String[] args) { GameTestMain gtm = new GameTestMain(); } } flame1のセットに関してはカラー以外問題なく実行されており、コンパイラ時にもエラーが出ません。 しかし、背景色は表示されません。 本の実際の実行画面では無色?→白色となっておるのですが、無色(グレーみたいな)のままです。 ちなみにEclipseのバージョンは3.0.1で 関係あるか分かりませんが Java Runtime Environment Version 6 Update 2 というものもダウンロードしてあります。 原因が分かる方はご教授ください。

    • ベストアンサー
    • Java
  • javaでアニメーションを簡単に作るには?

    5枚の絵をループでアニメーションさせたいのですが。フレームを表示させるところまでは出来たのですが、その先がよく分かりません。どのようにしてアニメーションすればいいのでしょうか? よろしくお願い致します。 package animation; import java.awt.*; import javax.swing.*; public class Animation extends JFrame implements Runnable{ Animation () { getContentPane ().setLayout (new FlowLayout ()); setDefaultCloseOperation (JFrame.EXIT_ON_CLOSE); setSize (200, 300); setVisible (true); Thread th = new Thread (); th.start (); } public void start(){ } public void run(){ } /** * @param args the command line arguments */ public static void main (String[] args) { // TODO code application logic here Animation anime = new Animation (); } }

  • javaの質問です。24フォントでg.drawString表示した文字

    javaの質問です。24フォントでg.drawString表示した文字に、8フォントのg.drawStringをy軸をいじり、ふりがなをつけたいのです。24フォントの文字の上に8フォントを表示するのだからx軸を3倍し、24フォントの半分の12を足せばいい(ふりがなが一文字の場合)とおもっていたのですが。24フォントの「あ*10」と8フォントの「あ*30」を表示し試したところ少しずつずれているようです。(以下のプログラムで試してみました)。x軸を揃え表示するためにはどうすればいいでしょうか import javax.swing.*; import java.awt.*; import java.awt.image.*; import java.util.*; public class MojiTest2 { JFrame frame1; BufferStrategy bstrategy; MojiTest2(){ frame1=new JFrame("ゲームテスト"); frame1.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); frame1.setBackground(Color.WHITE); frame1.setResizable(false); frame1.setVisible(true); Insets insets = frame1.getInsets(); frame1.setSize(800 + insets.left + insets.right,600 + insets.top + insets.bottom); frame1.setLocationRelativeTo(null); frame1.setIgnoreRepaint(true); frame1.createBufferStrategy(2); bstrategy = frame1.getBufferStrategy(); java.util.Timer t=new java.util.Timer(); t.schedule(new MyTimerTask(),2,15); } public static void main(String args[]){ MojiTest2 gtm =new MojiTest2(); } class MyTimerTask extends TimerTask{ int line = 0; int position = 0; String[] messages = { "あelloWorlハローワールド", "あいうあいうあいうあいうあいうあいうあいうあいうあい", "年収うううう万円の米市職員退職"}; @Override public void run() { Graphics g = bstrategy.getDrawGraphics(); if(bstrategy.contentsLost()==false){ Insets insets = frame1.getInsets(); g.clearRect(insets.left,insets.top,insets.right - insets.left,insets.bottom - insets.top); g.translate(insets.left,insets.top); g.setColor(Color.BLUE); g.setFont(new Font("MS ゴシック",Font.BOLD,24)); g.drawString(messages[line].substring(0,position), 76,500 + 40 * line); g.drawString("ああああああああああああああああああああ", 76, 480); if((line==2) && (position==2)){ g.setFont(new Font("MS ゴシック",Font.BOLD,8)); g.drawString("ああああああああああああああああああああああああああああああ" + "ああああああああああああああああああああああああああああああ", 76, 460); }if(position < messages[line].length()){ position += 1; }else if(line == messages.length - 1){ }else{ position = 0; line += 1; } } bstrategy.show(); } } }

    • ベストアンサー
    • Java
  • javaの質問ですdrawStringを使いゲームのオートモードの文字

    javaの質問ですdrawStringを使いゲームのオートモードの文字を描写しているのですが、そのオートモードに描画される文字とふり仮名を同じタイミングで描写するプログラムを打ちたいのですがどうすればよろしいでしょうか? できればループを抜ける方法もお願いします。初心者質問ですみません。 import javax.swing.*; import java.awt.*; import java.awt.image.*; import java.util.*; public class test0725 { JFrame frame1; BufferStrategy bstrategy; test0725(){ frame1=new JFrame("ゲームテスト"); frame1.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); frame1.setBackground(Color.WHITE); frame1.setResizable(false); frame1.setVisible(true); Insets insets = frame1.getInsets(); frame1.setSize(800 + insets.left + insets.right,600 + insets.top + insets.bottom); frame1.setLocationRelativeTo(null); frame1.setIgnoreRepaint(true); frame1.createBufferStrategy(2); bstrategy = frame1.getBufferStrategy(); java.util.Timer t=new java.util.Timer(); t.schedule(new MyTimerTask(),10,50); } public static void main(String args[]){ test0725 gtm =new test0725(); } class MyTimerTask extends TimerTask{ int line = 0; int position = 0; String[] messages = { "Hello新着メッセージなしを読む", "aaa", "年収7000万円の米市職員退職" }; @Override public void run() { Graphics g = bstrategy.getDrawGraphics(); if(bstrategy.contentsLost()==false){ Insets insets = frame1.getInsets(); g.clearRect(insets.left,insets.top,insets.right - insets.left,insets.bottom - insets.top); g.translate(insets.left,insets.top); g.setColor(Color.BLUE); g.setFont(new Font("MS ゴシック",Font.BOLD,24)); for(int i = 0;i < line ;i++){ //g.drawString(messages[i], 200,500 + 40 * i); } System.out.println(messages[line].substring(0,position)); g.drawString(messages[line].substring(0,position), 200,500 + 40 * line); if(line==2){ line=0; } if(line==1){ g.drawString("ありがとう", 50, 50); } if(position < messages[line].length()){ position += 1; }else if(line == messages.length - 1){ }else{ position = 0; line += 1; } } bstrategy.show(); g.dispose(); } } }

  • javaでのコンテントペインの使い方についてです

    public class GameTestMain { JFrame frame1; BufferStrategy bstrategy; int count = 0; GameTestMain(){ frame1 = new JFrame("ゲームテスト"); frame1.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); frame1.setVisible(true); Insets insets = frame1.getInsets(); frame1.setSize(600 + insets.left + insets.right, 400 + insets.top + insets.bottom); frame1.setResizable(false); frame1.setLocationRelativeTo(null); Container pane = frame1.getContentPane(); pane.setBackground(Color.WHITE); frame1.setIgnoreRepaint(true); frame1.createBufferStrategy(2); bstrategy = frame1.getBufferStrategy(); Timer t = new Timer(); t.schedule(new MyTimerTask(), 0, 500); } public static void main(String[] args) { GameTestMain gtm = new GameTestMain(); } class MyTimerTask extends TimerTask{ public void run () { Graphics g = bstrategy.getDrawGraphics(); if (bstrategy.contentsLost()==false){ Insets insets = frame1.getInsets(); g.translate(insets.left, insets.top); g.setColor(Color.BLUE); g.fillRect(0, 0, 100, 100); bstrategy.show(); g.dispose(); } } } } (文字数の関係でimport文は省略) 四角形を表示させる部分を追記したところ、背景が白でなくなってしまいました。 以前、Jframeに直接描写するのではなく、コンテントペインという透明レイヤーのインスタンスを取得し、そこに色々と表示させていくということを耳にしました。 背景を白にしたのが反映されないのは、四角形をコンテントペインのインスタンスでなくframe1に直接表示させているからではないかと思うのですが、背景の時に作製した「pane」とは別に新しくコンテントペインのインスタンスを取得し、そこに描写するのがいいでしょうか? どちらにしてもコンテントペインのインスタンスに四角形を描写する方法がわかりません。 背景の部分についてはネットで同じような質問をされている方がいたので、 その回答を元に記入しました。 今読んでいる入門本、「JAVAわくわくゲームプログラミング教室」だとコンテントペインなしで解説されているのですが、せっかくなのでコンテントペインも同時に導入しながら進めたいです。 これからこの本で簡単なゲームを作成するところまでやっていきますので、 コンテントペインの大まかな仕組みや使い方を理解していなければ同じように躓くと思います。 なので、今この場を切り抜ける方法も教えて欲しいのですが、コンテントペインの使い方がわかる書籍なども知っている方がいれば教えていただけないでしょうか。 よろしくお願いします。

  • javaのフレームにサイズがセットされてない?

    前回、http://okwave.jp/qa/q8069621.htmlで質問しました。 回答をもとにframe.setvisible(true)をコンストラクタの最後にするとうまくいき回答を締め切ったんですが・・・。 しかし、mainメソッドにframe.setvisible(true)を書くとフレームのタイトル部分だけとなり、 サイズがセットされないまま実行したときと同じようになってしまいます。 なぜでしょう?よろしくお願いします。 import java.awt.BorderLayout; import java.awt.Container; import java.awt.Dimension; import javax.swing.JFrame; import javax.swing.JPanel; import javax.swing.JScrollPane; import javax.swing.JTable; import javax.swing.table.DefaultTableModel; public class Table0{ public static void main(String[] args) { Frame0 test=new Frame0(); test.setVisible(true); } } class Frame0 extends JFrame{ JFrame frame; JPanel panel; JScrollPane jsp; JTable table; DefaultTableModel dtm; public Frame0(){ frame=new JFrame("table"); frame.setBounds(30, 30, 300, 200); frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); table=new JTable(8,5); jsp=new JScrollPane(table); jsp.setPreferredSize(new Dimension(250, 70)); panel=new JPanel(); panel.add(jsp); Container c=frame.getContentPane(); c.add(panel,BorderLayout.CENTER); } }

    • ベストアンサー
    • Java
  • 実行できません。

    import javax.swing.*; public class JFrame01 { public static void main(String[] args) { JFrame frame = new JFrame("JFrame01"); frame.setSize(400, 300); frame.setVisible(true); } }  このプログラムはどこかおかしいでしょうか。コンパイルはできるんですけど、実行することができません。  実行すると、 「Exception in thread "main" java.lang.NoClassDefFoundError: JFrame01」 というエラーが出ます。

    • ベストアンサー
    • Java
  • javaのpanelが表示されません

    下記のプログラムを作ったんですが、eclipseで実行するとフレームは表示されますが、空のフレームのような状態で、panelやボタンなどは表示されません。mainとは別のクラスで作成してるからなんでしょうか?よろしくお願いします。 import java.awt.BorderLayout; import java.awt.Container; import java.awt.Dimension; import javax.swing.JFrame; import javax.swing.JPanel; import javax.swing.JScrollPane; import javax.swing.JTable; import javax.swing.table.DefaultTableModel; public class Table0 { public static void main(String[] args) { new Frame0(); } } class Frame0{ JFrame frame; JPanel panel; JScrollPane jsp; JTable table; DefaultTableModel dtm; public Frame0(){ frame=new JFrame("table"); frame.setBounds(30, 30, 300, 200); frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); frame.setVisible(true); table=new JTable(8,5); jsp=new JScrollPane(table); jsp.setPreferredSize(new Dimension(250, 70)); panel=new JPanel(); panel.add(jsp); Container c=frame.getContentPane(); c.add(panel,BorderLayout.CENTER); } }

    • ベストアンサー
    • Java
  • swingのJframeについて

    JFrameについて質問があるのですが import javax.swing.*; public class JFrameTest extends JFrame{ public static void main(String[] args){ JFrameTest frame = new JFrameTest(); frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); frame.setBounds(10, 10, 300, 200); frame.setTitle("タイトル"); frame.setVisible(true); } JFrameTest(){ JPanel p = new JPanel();   Container contentPane = getContentPane(); ContentPane.add(p);   pack(); } } このプログラムと import javax.swing.*; public class JFrameTest{ public static void main(String[] args){ JFrame frame = new JFrame("フレームのタイトル"); frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); frame.setBounds( 10, 10, 300, 200); frame.setVisible(true); JPanel p = new JPanel();   Container contentPane = frame.getContentPane(); frame.ContentPane.add(p);   frame.pack(); } } このプログラムは何が違うのでしょう? やってることはまったく一緒だと思ってたのですが、全然違うみたいです。 上のプログラムの JFrameTest(){ はコンストラクタと呼ばれるものなのでしょうか? しょぼい質問で申し訳ないのですが誰か教えていただけないでしょうか。

    • ベストアンサー
    • Java