自動で動くパックマンを作成したが目の部分が起動しない

このQ&Aのポイント
  • 以下のようなプログラムで自動で動くパックマンを作りました。
  • しかし、どうしても目の部分の起動がかけません。
  • お力を貸していただける方はいらっしゃいますか?
回答を見る
  • ベストアンサー

PacMan

以下のようなプログラムで自動で動くパックマンを作りました。 パックマンが転がっていくのですが、どうしても目の部分の起動がかけません。 どなたかお力を貸していただけないでしょうか? ================================================= import java.applet.Applet; import java.awt.*; import java.awt.event.*; import java.util.*; /* <applet code="PacMan2.class" width="500"height="500"> </applet> */ public class PacMan2 extends Applet implements Runnable { volatile Thread thr; volatile boolean runFlag = true; public void start() { thr = new Thread(this); runFlag = true; thr.start(); } public void stop() { runFlag = false; thr = null; } public void run() { while (runFlag) { repaint(); try { Thread.sleep(1000); //1,000 mili-seconds } catch(InterruptedException e) { runFlag = false; } } } public void paint(Graphics g) { Calendar cal = Calendar.getInstance(); int s = cal.get(Calendar.SECOND); g.setColor(new Color(128,255,255)); g.fillArc(100+s,100,60,60,45-s,300);   g.setColor(new Color(0,0,0)); g.fillOval(130,105,10,10); } } =================================================

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

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

  • ベストアンサー
  • azicyan
  • ベストアンサー率21% (368/1747)
回答No.4

>特に(3)はメディアトラッカーやオフスクリーンといった、基本的ですが、基本中の基本ですので、ぜひトライしてください。 特に(3)はメディアトラッカーやオフスクリーンといった、聞きなれない言葉かもしれませんが、基本中の基本ですので、ぜひトライしてください。

syachi2310
質問者

お礼

azicyanさん。 丁寧な回答をありがとうございました! 非常に分かりやすかったです。 頑張って(1)~(3)もやってみたいと思います。 本当にありがとうございました!

その他の回答 (3)

  • azicyan
  • ベストアンサー率21% (368/1747)
回答No.3

説明します。 まず、やはり秒から角度を出しているのは、 1秒が60までしかないので、 6倍したとしても滑らかには行かず、0からインデントしていくほうが良いと思いそうしてしまいました。 あとで、カレンダーを利用して秒針に書き換えても良いかもしれません。 スリープを1000ミリ秒から100ミリ秒に変更してます。 どうしても1秒単位ではアニメーションには見えないからです。 肝心の目の座標のx,yはどうしているかというと、 x=距離*Math.cos(角度*ラジアン) y=距離*Math.sin(角度*ラジアン) のようにしてます。 ラジアンとは半径1の円の1度の円周の長さです。 2π/360度=π/180 と成ります。これは定数なので覚えてしまっていいです。 注意点はintでキャストしないと、dobble型になってしまうのでエラーになってしまうことですね。 あとfillovalは円の中心を指定できないので、本当はパックマン(?)の中心は130,130のはずですが 5ドットずらして125,125としてます。 良く考えたら中心を指定できるfillarcを使ったらよかったですね(^_^;) 意味がわからない部分は補足してくださいね。 後改良点としては、 (1)はしまで行ったら戻るようにする (2)口をパクパクさせる (3)ちらつかないようにする といったところでしょうか? 特に(3)はメディアトラッカーやオフスクリーンといった、 基本的ですが、基本中の基本ですので、 ぜひトライしてください。 それでは!

  • azicyan
  • ベストアンサー率21% (368/1747)
回答No.2

import java.applet.Applet; import java.awt.*; import java.awt.event.*; import java.util.*; /* <applet code="PacMan2.class" width="500"height="500"> </applet> */ public class PacMan2 extends Applet implements Runnable { volatile Thread thr; volatile boolean runFlag = true; int s; public void init(){ s=100; } public void start() { thr = new Thread(this); runFlag = true; thr.start(); } public void stop() { runFlag = false; thr = null; } public void run() { while (runFlag) { repaint(); try { Thread.sleep(100); //100 mili-seconds }catch(InterruptedException e) { runFlag = false; } } } public void paint(Graphics g) { Calendar cal = Calendar.getInstance(); s+=5; g.setColor(new Color(128,255,255)); g.fillArc(100+s/5,100,60,60,s,300); g.setColor(new Color(0,0,0)); g.fillOval(125+s/5+(int)(20*Math.cos(-(s+30)*3.14/180)),125+(int)(20*Math.sin(-(s+30)*3.14/180)),10,10); } }

  • azicyan
  • ベストアンサー率21% (368/1747)
回答No.1

何故カレンダーを使っているのかな? sは0~60ですよね。 ということは永遠に回転はしないですが・・・ sは単に0~360までインデントすればいいような気がします。 目の位置は、サインとコサインで、円の中心から計算すればよさそうです。 風呂に入ってからもう一回回答しますね(^_^;)

syachi2310
質問者

補足

すみません。超初心者なもので… 途中で元にもどるのはそれが原因だったのですね! なんで永遠に回らないんだろうと困っていました(-_-;) 実は今日、授業でやったばかりでして… 授業はちゃんと聞かないと駄目ですね。 すみません、引き続きよろしくお願いいたします。

関連するQ&A

  • Javaアプレットについてですが

    Javaアプレットでボタンを押したら数字が増えるものを作っているのですがどうもうまく動きません。 ソースは下の通りです。 変更しなければいけないところがあるならお願いします。 import java.applet.Applet; import java.awt.Graphics; import java.awt.Button; import java.awt.event.ActionListener; import java.awt.event.ActionEvent; public class Sample7 extends Applet implements Runnable, ActionListener { Button bt; int num; public void init() { bt = new Button("開始"); add(bt); bt.addActionListener(this); Thread th; th = new Thread(this); th.start(); } public void actionPerformed(ActionEvent ae) { public void run() { try{ for(int i=0; i<11; i++){ num = i; repaint(); Thread.sleep(1000); } } catch(InterruptedException e){} } } public void paint(Graphics g) { String str = num + "です。"; g.drawString(str, 50, 50); } }

    • ベストアンサー
    • Java
  • 画面のちらつきの原因が知りたいです

    JAVAの初心者です、宜しくお願いします。 下のようなプログラムを書きました。 「public void paint(Graphics g){ ~ repaint();」とすると、画像がちらつきます、しかし、「repaint();」を消すとちらつかなくなります、この原因が分かりません。 一体何故このような現象が起こるのでしょうか、宜しくお願いします。 ========================================================== import java.applet.Applet; import java.awt.Button; import java.awt.Color; import java.awt.Font; import java.awt.Graphics; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import java.awt.event.MouseEvent; import java.awt.event.MouseListener; public class Oval_Rec_1_071128 extends Applet implements MouseListener , ActionListener { int x1 ; int y1 ; int xh = 50 ; int yv = 50 ; Button bt1 ; Button bt2 ; public void actionPerformed(ActionEvent ae){} public void mouseClicked(MouseEvent e){} public void mouseEntered(MouseEvent e){} public void mouseExited(MouseEvent e){} public void mouseReleased(MouseEvent e){} public void init() { setBackground(Color.yellow); addMouseListener(this); bt1 = new Button("push"); bt1.setFont(new Font("SansSerif", Font.BOLD, 20)); bt1.setBackground(Color.black); bt1.setForeground(Color.lightGray); add(bt1); bt1.addActionListener(this); bt2 = new Button("change_circle"); add(bt2); bt2.addActionListener(this); } public void mousePressed(MouseEvent e) { x1 = e.getX(); y1 = e.getY(); xh = e.getX(); yv = e.getY(); // repaint(); //comment out } public void paint(Graphics g) { g.setColor(Color.red); g.setFont(new Font("Serif",Font.BOLD,24)); g.drawString("Hello Applet World ! !" , 50 , 50); g.setColor(Color.blue); g.drawLine( 100 , 100 , 500 , 500); g.setColor(Color.cyan); g.fillOval( x1 , y1 , xh , yv); g.setColor(Color.magenta); g.fillRect( xh , yv, x1/10 , y1/10 ); repaint(); } }

    • ベストアンサー
    • Java
  • Javaプログラムの繋げ方について。

    Javaプログラムの繋げ方について。 今まで(1)のようなプログラムを書いていました。 作りたいものに向けて色々検索するとやりたいものに近い(2)のようなサンプルプログラムを見つけました。 しかし、Java初心者なもので混ぜ方(?)がわかりません。 現在の私の知識からいうと今までのはアプレットでフレーム使うのはアプリケーションなのかな?別物なのかな?そんな感じです。 もし、混ぜることができるなら何かアドバイスをお願いします。 (1)package test; import java.applet.* ; import java.awt.Label ; import java.awt.Font ; import static java.awt.Font.BOLD ; import java.util.*; import java.awt.Graphics; import java.awt.Image; import java.awt.*; public class test extends Applet{ public void paint(Graphics g){ g.setColor(Color.red); g.fillOval(320, 200, 100, 100); } public void init () { ~~~~~~~~~~~~~~~~ } public void start () { ------------ }}} (2)import java.awt.*; import java.awt.event.*; public class MouseEvent7 extends Frame { int posX = 50; int posY = 50; public static void main(String [] args){ new MouseEvent7(); } //コンストラクタ MouseEvent7(){ this.addWindowListener(new WinAdapter()); //ウィンドウリスナーの登録 this.setSize(200,200); this.setVisible(true); //MouseMotionListenerの登録 addMouseMotionListener( new MouseMotionAdapter(){ public void mouseMoved(MouseEvent e){ posX = e.getX(); posY = e.getY(); repaint(); //paintメソッドを実行 } } ); } public void paint(Graphics g){ g.drawOval(posX,posY,50,50); } } (1)の内容に本当に(2)のプログラムで出来るマウスの動きに合わせて円も動く+クリックしたらそこで止まるだけいいのですが。 出来たら止まった点の座標も取りたいですが、そこまではいってません;;

  • Javaを説明するには

    4枚の絵をパラパラアニメにするソースなのですが。これをわけ合って説明しなくてはならなくなってしまいました。 薄らぼんやりとはわかるのですが。どう説明したらいいのかさっぱり分かりません、どう説明すれば、分かりやすく正しく伝えられるでしょうか?>< import java.applet.Applet; import java.awt.Graphics; import java.awt.Image; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; public class DNA extends Applet implements Runnable, ActionListener { Image image[] = new Image[4]; int[] timing = { 400,350,230,350}; Thread t; int index1 = 0; int no = 0; private static final long serialVersionUID = 1L; public void init(){ for(int i = 0; i<4; i++){ image[i] = getImage(getDocumentBase(),"img"+(i)+".gif"); } } public void paint(Graphics g){ g.drawImage(image[index1],0,0,this); } public void update(Graphics g) { paint(g); if(++no==4)no=0; } public void start(){ t = new Thread(this); t.start(); } public void run() { while(true){ index1++; if(index1 == 4){ index1 = 0; } repaint(); try{ Thread.sleep(timing[no]); }catch(InterruptedException e){} }} public void actionPerformed(ActionEvent arg0) { } }

  • 動きません!!教えて下さい!

    import java.awt.*; import java.awt.event.*; import java.util.*; class test extends Frame implements Runnable { int year=0,month=0,date=0,hour=0,min=0,sec=0; Thread th; Calendar cal=Calendar.getInstance(); public void start() { th = new Thread(this); //時間表示スレッド作成 th.start(); //時間表示スレッド起動 } public void run() { for(int i=0;i<1000;i++) { year=cal.get(Calendar.YEAR); //年 取得 month=cal.get(Calendar.MONTH)+1; //月 取得 date=cal.get(Calendar.DATE); //日 取得 hour=cal.get(Calendar.HOUR_OF_DAY); //時 取得 min=cal.get(Calendar.MINUTE); //分 取得 sec=cal.get(Calendar.SECOND); //秒取得 repaint(); try { Thread.sleep(1000); } catch(InterruptedException e){} } } public static void main(String args[]) { Frame tt=new TimeTable(); } public TimeTable() { setSize(800,600); setVisible(true); //閉じる addWindowListener(new WindowAdapter() { public void windowClosing(WindowEvent e) { System.exit(0); } }); } public void paint(Graphics g) { g.drawString(year + "年" + month + "月" + date + "日",100,100); g.drawString(hour + "時" + min + "分" + sec + "秒",300,100); } } (END) 上のソース(抜粋)なのですが、思い通り動きません…!! リアルタイムに時間を表示するようにしたいのですが… どうしてスレッドは動いてくれないのでしょうか、、、コメントお願いします。

    • ベストアンサー
    • Java
  • アプレットでスクロールバーを作りたいがコンパイルエラーが出る。

    アプレットでスクロールバーを作ろうと思っています。下記のコードをコンパイルすると 「import java.applet.Applet;abstract として宣言する必要があります。」とコンパイルエラーになります。いろいろ調べましたが原因がわかりません。なぜこのようなことが生じるのでしょうか? import java.awt.*; import java.awt.event.*; public class testScroll extends Applet implements AdjustmentListener{ Scrollbar sbar; public void init(){ setLayout(new BorderLayout()); sbar=new Scrollbar(Scrollbar.HORIZONTAL,1,10,1,300); add("South",sbar); sbar.addAdjustmentListener(this); } public void paint(Graphics g){ g.setColor(Color.gray); g.fillRect(0,0,350,150); } public void adjustmentValueCanged(AdjustmentEvent e){ if(e.getAdjustable()==sbar){ repaint(); } } } ■C:\**> javac testScroll.java testScroll.java:7: testScroll は abstract として宣言する必要があります。 adjustmentValueChanged(java.awt.event.AdjustmentEvent) を testScroll で定義しません。 public class testScroll extends Applet implements AdjustmentListener{ ^ エラー 1 個

    • ベストアンサー
    • Java
  • JAVAのプログラミングについて

    色変更というボタンを押すたびに、正方形の中の色が緑から青、青から緑というように繰り返し色が変わるプログラムを作りたいのですが、途中までは、完成できたのですが、ここからどうすればいいかわかりません。教えてください。 import java.awt.*; import java.applet.*; import java.awt.event.*; public class kadai3Applet extends Applet implements ActionListener { int i = 1; Button collor; public void init(){ collor = new Button("色変更"); collor.addActionListener(this); add(collor); } public void paint(Graphics g){ g.setColor(Color.green); g.fillRect(50,50,50,50); } public void actionPerformed(ActionEvent e){ if(e.getSource() == collor){ } repaint(); } }

  • コンポーネントの組み込みについて

    アプレットでもAWTアプリでもSwingアプリでもなんでもいいんですが、 特定の条件を満たした時に、はじめは表示されていないボタンやテキストフィールドなどを後から表示させたいのですが、できません。 単純にadd()ではできないようで… やり方を教えていただけませんか。。 下は、10秒後にボタンが表示されるように自分で作ってみたサンプルアプレットです。 //<applet code="buttonsample.class" width=300 height=200></applet> import java.applet.*; import java.awt.*; import java.awt.event.*; public class buttonsample extends Applet implements Runnable { int count; //カウント Thread th; //スレッド Button BT; //ボタン public void init() { setLayout(new FlowLayout()); count = 0; BT = new Button(); BT.setLabel("ボタン"); } public void start() { if(th == null) { th = new Thread(this); th.start(); } } public void stop() { th = null; } public void run() { while(count < 10) { repaint(); count++; try { Thread.sleep(1000); } catch(InterruptedException e){} } add(BT); } public void paint(Graphics g) { g.drawString(""+(count+1),100,100); } } <EOS>

    • ベストアンサー
    • Java
  • Java applet

    Java appletを使用する課題なのですが、 途中まで書いて、それから止まってしまっています。 アドバイスなど頂ければ嬉しいです。 課題は、 (1)右から左へ動く文字列左から右へ動く文字列とを表示 (2)文字列が消えたらまた出てくるようにする (3)マウスのクリックボタンを押すと止まり、離すと動きだすようにする (2)まで考えたプログラム(コンパイル、実行済)を以下に載せます。 import java.applet.Applet; import java.awt.*; import java.awt.event.*; public class SasakiYui extends Applet implements Runnable{ Thread th = null; Graphics g; int x; public void init(){ setBackground(Color.white); } public void start(){ if(th == null){ th = new Thread(this); th.start(); } } public void run(){ while(!Thread.interrupted()){ for(x=600;x>-300;x=x-5){ repaint(); try{ Thread.sleep(50); } catch(InterruptedException e){} } } } public void paint(Graphics g){ g.drawString("Happy Brithday!",x,10); g.drawString("Happy Birthday!",600-x,40); } } (3)ができるようにするには、 addMouseListener(new Mouseadapter(){ public void mousePressed(MouseEvent e){……} を使用するのだろうとは思うのですが、 ・これを組み込むのはpublic void init(){の後で良いか ・……の部分に何を書けばいいのか の2点がわかりません; よろしければ、アドバイスお願い致します!

    • ベストアンサー
    • Java
  • アクションリスナー(初心者です)

    JAVAでボタンが押されたらすでに描かれている線に さらに線が加わって描かれるというプログラムを作ろうとしているのですが、アクションリスナーを受け取ったメソッドの中身をどうしたらいいのか行き詰まりました・・・作りかけのプログラムを載せてみますので アドバイスいただければと思います よろしくお願いします import java.applet.Applet; import java.awt.Graphics.*; import java.awt.event.*; import java.awt.*; public class file928 extends Applet implements ActionListener { Button botan; public void init() { botan=new Button("選択"); add(botan); botan.addActionListener(this); } public void paint(Graphics g) { g.drawString("L.A.Airport",100,300);           ~中略~ g.drawLine(405,420,655,240); } public void actionPerformed(ActionEvent x) { ーここをどうしたらいいかわかりません・・・ー } }

    • ベストアンサー
    • Java

専門家に質問してみよう