2013-10-29 104 views
-1
import java.awt.Graphics; 
import javax.swing.JApplet; 
import javax.swing.JPanel; 

public class Circle extends JPanel { 

    int x = 75; 
    int y = 100; 
    int diameter = 50; 

    public void setAnimationY(int y) { 
     this.y = y; 
    } 

    public int getAnimationY() { 
     return y; 
    } 

    public int getDiameter() { 
     return diameter; 
    } 

    public void setDiameter(int startDiameter) { 
     diameter = startDiameter; 
    } 

    @Override 
    protected void paintComponent(Graphics g) { 
     super.paintComponent(g); 
     g.drawOval(x, y, diameter, diameter); 
    } 
} 


import java.awt.BorderLayout; 
import java.awt.Graphics; 
import java.awt.event.ActionEvent; 
import java.awt.event.ActionListener; 
import javax.swing.JApplet; 
import javax.swing.JPanel; 
import javax.swing.Timer; 

public class BouncingBall extends JApplet { 

    private int speed = 5; 
    private Timer timer; 
    private Circle draw; 

    @Override 
    public void init() { 
     super.init(); 
     setLayout(new BorderLayout()); 
     draw = new Circle(); 
     add(draw); 
     timer = new Timer(30, new ActionListener() { 
      @Override 
      public void actionPerformed(ActionEvent e) { 
       int y = draw.getAnimationY(); 
       int diameter = draw.getDiameter(); 
       int roof = getHeight(); 
       y += speed; 
       if (y < 0) { 
        y = 0; 
        speed *= -1; 
       } else if (y + diameter > roof) { 
        y = roof - diameter; 
        speed *= -1; 
       } 
       draw.setAnimationY(y); 
       repaint(); 
      } 
     }); 
    } 

    @Override 
    public void start() { 
     super.start(); 
     timer.start(); 
    } 

    @Override 
    public void stop() { 
     timer.stop(); 
     super.stop(); 
    } 
} 

我正在嘗試創建一個JApplet,其中包含一個彈跳上下的球。到目前爲止,我已經能夠讓球上下移動,但是現在我正在努力使球更加「像生活一樣」,所以我希望每次球彈起時球的高度都會減小,直到球停止。循環JApplet動畫Java

我試圖做一個while循環使用我創建的getHeight()方法的屋頂變量,但由於某種原因,當我試圖使用它,要麼球根本沒有移動或循環沒有影響在球上。

我也嘗試了一個for循環,但我遇到了與while循環一樣的問題。我相信問題是我沒有把這個for循環放在正確的位置,以使它正常工作。

在此先感謝。

+0

請引用您對此主題的原始問題,[使用JApplet創建動畫](http://stackoverflow.com/questions/19648353/creating-an-animation-using-japplet);另外,考慮一個[混合](http://stackoverflow.com/a/12449949/230513)applet/applicaiton。 – trashgod

+0

你的屋頂不是你的屋頂,而是你的地板。 (0,0)座標位於左上角。 – DSquare

回答

0

小修改您的代碼,它可以給你一些步道:

  @Override 
      public void actionPerformed(ActionEvent e) { 
       int y = draw.getAnimationY(); 
       int diameter = draw.getDiameter(); 
       int roof = getHeight(); 
       y += speed; 
       // 
       // Reduce the ball size at the bottom of the screen 
       // 
       if(y + diameter > roof) { 
        if(diameter > minDiameter) { 
         diameter -= (roof - y);     
        } else { 
         diameter = minDiameter; 
        }     
       } else if (diameter < maxDiameter) { 
        diameter++; 
       } 
       draw.setDiameter(diameter); 
       if (y < 0) { 
        y = 0; 
        speed *= -1;  
       } else if (y + diameter > roof) { 
        y = roof - diameter; 
        speed *= -1;      
       }     
       // Simulates a little gravity 
       speed += 0.5; 
       draw.setAnimationY(y); 
       repaint(); 
      } 

對於更多的現實主義,最好的辦法就是找到一個方程是球的位置的功能和硬度的球係數並會給你球的大小。

+0

嗯,我甚至沒有考慮改變球的大小,這很酷!這是一個好主意!出於某種原因,現在球不上下。這是我嘗試使用「降低屋頂」迴路時遇到的同一問題, – user2926525

0

那麼讓我們使用與@ MadProgrammer的解決方案繼續從your other related question

在你的類DrawPane,我們可以很容易地定義heightgetAnimationHeight()setAnimationHeight(int)儘快觸及地面控制高度下降。請記住在java 左上角的座標是(0, 0)右下角座標是(getWidth(), getHeight())。假設它從height = 0開始(頂部)。然後它將從y = height(頂部)開始,最終移動到您的容器的getHeight()(底部)。我們將增加height(頂部y)使用通過添加一個金額(說30)到當前height(其中getAnimationHeight()將返回)。

所以,這個小的調整你的其他問題@ MadeProgrammer的解決方案做將是以下演示

enter image description here

import java.awt.*; 
import java.awt.event.*; 
import javax.swing.*; 
import javax.swing.Timer; 

public class Circle extends JApplet { 

    private int delta = 8; 

    private Timer timer; 
    private DrawPane drawPane; 

    @Override 
    public void init() { 
     super.init(); 
     setLayout(new BorderLayout()); 
     drawPane = new DrawPane(); 
     add(drawPane); 
     timer = new Timer(100, new ActionListener() { 

      int frameCount = 0; 

      @Override 
      public void actionPerformed(ActionEvent e) { 
       int y = drawPane.getAnimationY(); 
       int diameter = drawPane.getDiameter(); 
       y += delta; 
       if (y < drawPane.getAnimationHeight()) { 
        y = drawPane.getAnimationHeight(); 

        delta *= -1; 
       } else if (y + diameter > getHeight()) { 
        y = getHeight()- diameter; 
        delta *= -1; 

        int animationHeight = drawPane.getAnimationHeight(); 
        animationHeight = animationHeight + (getHeight() - diameter - animationHeight)/2; 

        drawPane.setAnimationHeight(animationHeight); 

        if(animationHeight + diameter + 2 >= getHeight()) 
        { 
         System.out.println("true"); 
         drawPane.setAnimationY(getHeight() - diameter); 
         repaint(); 
         timer.stop(); 
         return; 
        } 


       } 
       drawPane.setAnimationY(y); 
       repaint(); 



      } 
     }); 
    } 

    @Override 
    public void start() { 
     super.start(); 
     timer.start(); 
    } 

    @Override 
    public void stop() { 
     timer.stop(); 
     super.stop(); 
    } 

    public class DrawPane extends JPanel { 

     int x = 100; 
     int y = 0; 
     int diameter = 50; 
     int height = 0; 


     public void setAnimationX(int x) { 
      this.x = x; 
     } 

     public void setAnimationY(int y) { 
      this.y = y; 
     } 



     public void setAnimationHeight(int h) 
     { 
      height = h; 
     } 

     public int getAnimationHeight() 
     { 
      return height; 
     } 

     public int getAnimationX() { 
      return x; 
     } 

     public int getAnimationY() { 
      return y; 
     } 

     public int getDiameter() { 
      return diameter; 
     } 

     public void setDiameter(int startDiameter) { 
      diameter = startDiameter; 
     } 

     @Override 
     protected void paintComponent(Graphics g) { 
      super.paintComponent(g); 
      g.drawOval(x, y, diameter, diameter); 
     } 
    } 
} 

注:只要倒是下終於,你應該停止計時器擺脫閃爍球的。這個任務留給練習給你。