こんにちはゲストさん。会員登録(無料)して質問・回答してみよう!

解決済みの質問

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);
}
}
=================================================

投稿日時 - 2004-07-21 19:58:18

QNo.934758

困ってます

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

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


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

投稿日時 - 2004-07-21 23:30:34

お礼

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

投稿日時 - 2004-07-21 23:58:25

ANo.4

このQ&Aは役に立ちましたか?

1人が「このQ&Aが役に立った」と投票しています

回答(4)

ANo.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)はメディアトラッカーやオフスクリーンといった、
基本的ですが、基本中の基本ですので、
ぜひトライしてください。

それでは!

投稿日時 - 2004-07-21 23:28:17

ANo.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);
}
}

投稿日時 - 2004-07-21 23:12:50

ANo.1

何故カレンダーを使っているのかな?

sは0~60ですよね。
ということは永遠に回転はしないですが・・・
sは単に0~360までインデントすればいいような気がします。
目の位置は、サインとコサインで、円の中心から計算すればよさそうです。

風呂に入ってからもう一回回答しますね(^_^;)

投稿日時 - 2004-07-21 20:48:01

補足

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

投稿日時 - 2004-07-21 20:53:45

あなたにオススメの質問