- ベストアンサー
円をジャンプ
マウスをクリックしたら円をジャンプさせるようにしたいのですが... 自分なりにしてみたのですがうまくいきません. public void mousePressed(MouseEvent me){ dy=-dy; cx+=dx; cy-=dy; if(cx<0||cx>width)dx=-dx; } public void mouseReleased(MouseEvent me){ dy=-dy; cx+=dx; cy-=dy; if(cx<0||cx>width)dx=-dx; } cx,cyは円の座標,dx,dyは移動量です. これじゃマウス押しっぱなしにしたら止まるのはあたりまえですよね...なにか,クリックしたらふわ~んって感じでジャンプできるプログラムを教えて下さい.初心者なもので...お願いします.
- みんなの回答 (2)
- 専門家の回答
質問者が選んだベストアンサー
とりあえず (ア)「アニメーション」させる方法 (イ)等加速度運動の方法 (ウ)ジャンプ(等加速度運動+着地判定) を知る必要があると思います。 まあ(ウ)は、どうにでもなるとして…。 --- ■(ア)について とにかく「繰り返し処理」をさせる必要があります。 繰り返し、つまりループ、つまりfor()文やwhile()文を使うだけ。 たとえば、 public class Demo extends Panel{ static int w=400,h=400;double x,y=(int)h,vx=5,vy=-10; //double ay=0.3;//加速度 …(1) public static void main(String[] args){ Frame f=new Frame();Demo d=new Demo(); f.add(d);f.setSize(w+20,h+20);f.show(); d.loop(); } /**無限ループ*/ public void loop(){while(true){oneLoop();}} /*一回のループ処理*/ void oneLoop(){ /*ウェイト*/ try{Thread.sleep(1000);}catch(InterruptedException e){} /*ボール位置計算*/ calc(); /*描画*/ repaint(); } void calc(){ //vy+=ay;//…(2) x+=vx;y+=vy; System.out.println("vyは "+vy+" です隊長っ!"); } public void update(Graphics g){paint(g);} public void paint(Graphics g){g.drawString("@",(int)x,(int)y);} } 原理的にはこう。わかりますよね? (Javaでのアニメーションさせる場合、一般的にはスレッドを使う。 http://www.h5.dion.ne.jp/~tuyano/JavaTutor/JavaTutor11.html http://javagame.main.jp/basic/move_ball.html) --- ■(イ)について 上記ソースコードの(1)(2)のコメントをはずしてみて下さい。 どうなったかな? 「ジャンプ」というのは 『y方向にのみ加速度(※重力)が働いている「等加速度運動」』 であり、 (1)(2)のコメントをはずした上記ソースコードはその例。 y方向に加速度が働いているので、y速度vyは「一定ではない」。 一定ではなく、単位時間ごと(1ループごと)に「加速度av分だけ」変化する。 それを表したのが vy+=ay; という式。 これが、加速度運動。 つまり加速度というのは、 ------------------------ [単位時間当たり(1ループ当たり)の「速度の変化量」] ------------------------ まあ、「位置と速度」との関係式 y+=vy を見れば、 「速度と加速度」の関係も同様である、 ということはわかりますよね。 (※いま書いた話は高校物理の教科書の一番初めに出てくる) http://javagame.main.jp/mariolike/mariolike02.html#gravity
その他の回答 (1)
- azicyan
- ベストアンサー率21% (368/1747)
こういうときはたいてい、フラグ、を使うのが一般的かな?と思います。 例えばフラグを変数fとするとします。 クリック感知 かつ f not 1 ↓ f=1 ↓ ボール動作開始 ↓ ボール停止 ↓ f=0 ボールが飛び上がっているときにはf=1としてクリックを感知しない、 かつ、ボールの動作を続ける、のです。 ボールの動作としては、はじめはfor文をつかって y座標デクリメント→インクリメント とすれば良いでしょう。 しかしこれだと動きが不自然なので、重力加速度の計算でy座標を決めれば自然な動きとなります。
お礼
自分にはまだまだ理解しきれない部分もありますが何とかやってみます.ありがとうございました♪
お礼
詳しい解説ありがとうございました.コメントはずしたら放物運動してくれました.ジャンプしてくれるアプレット作成に奮闘します.ありがとうございました.