加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 编程开发 > Java > 正文

Java摇摆动画看起来很乱.如何使它看起来亲?

发布时间:2020-12-14 16:36:13 所属栏目:Java 来源:网络整理
导读:更新:semicomplex动画swing timer = trainwreck.问题的最终来源是 java定时器,无论是swing还是实用版本.它们是不可靠的,特别是在操作系统之间进行性能比较时.通过实施一个运行的线程,程序在所有系统上运行顺利. http://zetcode.com/tutorials/javagamestuto
更新:semicomplex动画swing timer = trainwreck.问题的最终来源是 java定时器,无论是swing还是实用版本.它们是不可靠的,特别是在操作系统之间进行性能比较时.通过实施一个运行的线程,程序在所有系统上运行顺利. http://zetcode.com/tutorials/javagamestutorial/animation/.另外,将Toolkit.getDefaultToolkit().sync()添加到paintComponent()方法中有明显的帮助.

我写了一些在awt.Applet(但闪烁)中平滑动画的代码,然后我将其重构为java swing.现在它不会闪烁,但它看起来很震撼.我弄错了计时器,但这不行.任何关于平滑动画摆动组件的提示或建议将不胜感激.

import java.util.Random;
import java.util.ArrayList;
import java.awt.event.; import java.awt.;
import javax.swing.*;
//////////////////////////////////////////////////////////////////
//////////////////////////////////////////////////////////////////

public class Ball extends JApplet{

public static void main(String[] args) {
    SwingUtilities.invokeLater(new Runnable() {
        public void run() {
            JFrame frame = new JFrame();
            frame.setTitle("And so the ball rolls");
            frame.setDefaultCloSEOperation(JFrame.EXIT_ON_CLOSE);
            initContainer(frame);
            frame.pack();
            frame.setVisible(true);
        }
    });
}
public static void initContainer(Container container){

   GraphicsPanel graphicsPanel = new GraphicsPanel();
   MainPanel mainPanel = new MainPanel(graphicsPanel);
   container.add(mainPanel);
   graphicsPanel.startTimer();

}

@Override
public void init(){
    initContainer(this);
}

}
////////////////////////////////////////////////// /////////////////////
////////////////////////////////////////////////// ////////////////////
MainPanel类扩展了JPanel {
JLabel label = new JLabel(“Particles”);
GraphicsPanel gPanel;

    public MainPanel(GraphicsPanel gPanel){
        this.gPanel = gPanel;
        add(gPanel);
        add(label);
    }

}
////////////////////////////////////////////////// /////////////////////
////////////////////////////////////////////////// ////////////////////
GraphicsPanel类扩展了JPanel实现的MouseListener {

    private ArrayList<Particle> ballArr = new ArrayList<Particle>();
    private String state="s";         //"s"=spiral,"p"=particle
    private int speed=10;             //~20 Hz
    private Timer timer;

    public GraphicsPanel(){
        System.out.println("echo from gpanel");
        setPreferredSize(new Dimension(500,500));
        timer = new Timer(speed,new TimerListener());
        addMouseListener(this);
    }

    public void startTimer(){
        timer.start();
    }

    @Override
    public void paintComponent(Graphics g){

        super.paintComponent(g);
         for (Particle b: ballArr){
              g.setColor(b.getColor());
              g.fillOval(b.getXCoor(),b.getYCoor(),b.getTheSize(),b.getTheSize());
         }
    }

    public void mousePressed(MouseEvent e) {
        ballArr.add(new Particle(e.getX(),e.getY(),state));
    }
    public void mouseReleased(MouseEvent e) {}
    public void mouseEntered(MouseEvent e){}
    public void mouseExited(MouseEvent e){}
    public void mouseClicked(MouseEvent e) {}

    class TimerListener implements ActionListener {
        public void actionPerformed(ActionEvent e){
             for (Particle b: ballArr)
                 b.move();
             setBackground(Color.WHITE);
             repaint();

        }
    }

}

////////////////////////////////////////////////// ////////////////////////
////////////////////////////////////////////////// ////////////////////////
粒子类
{
private static int instanceCount; {{instanceCount;}}
private int z = 11,t = 1,u = 1;
private int [] RGB = new int [3];
private int [] randomizeColor = new int [3];
私人双半径,θ;
private int x,y,centerX,centerY,size,spiralDirection = 1,
ballSizeLowerBound,ballSizeUpperBound,
radiusLowerBound,radiusUpperBound,
mouseInputX,mouseInputY,
radiusXMultiplier,radiusYMultiplier;
私人色彩;
私人字符串状态;
随机随机random = new Random();
////////////////////////////////////////////////// /////////////////////////
public Particle(int x,int y,int centerX,int centerY,int radius,
int theta,int size,Color color){
this.x = X; this.y = Y; this.centerX =的centerX; this.centerY = centerY;
this.radius =半径; this.theta =峰; this.size =大小; this.color =颜色;
}

public Particle(int mouseInputX,int mouseInputY,String state){
this.mouseInputX = mouseInputX;
this.mouseInputY = mouseInputY;
this.state =状态;
//随机化颜色
RGB [0] = random.nextInt(252);
RGB [1] = random.nextInt(252);
RGB [2] = random.nextInt(252);
randomizeColor [0] = 1 random.nextInt(3);
randomizeColor [0] = 1 random.nextInt(3);
randomizeColor [0] = 1 random.nextInt(3);
的centerX = mouseInputX;
centerY = mouseInputY;
if(state.equals(“s”)){//设置螺旋状态
ballSizeLowerBound = 5;
ballSizeUpperBound = 18;
radiusLowerBound = 0;
radiusUpperBound = 50;
radiusXMultiplier = 1;
radiusYMultiplier = 1;
}
if(state.equals(“p”)){//设置粒子状态
ballSizeLowerBound = 15;
ballSizeUpperBound = 20 random.nextInt(15);
radiusLowerBound = 5;
radiusUpperBound = 15 random.nextInt(34);
radiusXMultiplier = 1 random.nextInt(3);
radiusYMultiplier = 1 random.nextInt(3);
}

size = ballSizeUpperBound-1; //球大小
radius = radiusUpperBound-1;

if(instanceCount%2 == 0)//交替的螺旋方向
spiralDirection = -spiralDirection;
}
////////////////////////////////////////////////// /////////////////////////
public int getXCoor(){return centerX x * spiralDirection;}
public int getYCoor(){return centerY y;}
public int getTheSize(){return size;}
public Color getColor(){return color;}
////////////////////////////////////////////////// ////////////////////////
void move(){

// spiral:dr / dt在边界变化
if(radius> radiusUpperBound || radius< radiusLowerBound)
u = -u;

//螺旋形式公式:参数方程式
极性方程半径= theta
x =(int)(radius * radiusXMultiplier * Math.cos(theta));
y =(int)(radius * radiusYMultiplier * Math.sin(theta));

radius = 0.1 * u;
theta = 0.1;

//球尺寸公式
if(size == ballSizeUpperBound || size == ballSizeLowerBound)
t = -t;
size = t;

//球颜色变化
for(int i = 0; i if(RGB [i]> = 250 || RGB [i]< = 4)
randomizeColor [i] = -randomizeColor [i];

RGB [0] = randomizeColor [0];
RGB [1] = randomizeColor [1];
RGB [2] = randomizeColor [2];
color = new Color(RGB [0],RGB [1],RGB [2]);
}

}

public static void main(String[] args) { SwingUtilities.invokeLater(new Runnable() { public void run() { JFrame frame = new JFrame(); frame.setTitle("And so the ball rolls"); frame.setDefaultCloSEOperation(JFrame.EXIT_ON_CLOSE); initContainer(frame); frame.pack(); frame.setVisible(true); } }); } public static void initContainer(Container container){ GraphicsPanel graphicsPanel = new GraphicsPanel(); MainPanel mainPanel = new MainPanel(graphicsPanel); container.add(mainPanel); graphicsPanel.startTimer(); } @Override public void init(){ initContainer(this); }public MainPanel(GraphicsPanel gPanel){ this.gPanel = gPanel; add(gPanel); add(label); }private ArrayList<Particle> ballArr = new ArrayList<Particle>(); private String state="s"; //"s"=spiral,state)); } public void mouseReleased(MouseEvent e) {} public void mouseEntered(MouseEvent e){} public void mouseExited(MouseEvent e){} public void mouseClicked(MouseEvent e) {} class TimerListener implements ActionListener { public void actionPerformed(ActionEvent e){ for (Particle b: ballArr) b.move(); setBackground(Color.WHITE); repaint(); } }

解决方法

不要设置恒定间隔定时器.在定时器中设置定时器一次 - 在处理程序中

>获取当前时间(保存在frameStartTime中)
>做你的框架
>将定时器设置为:interval - (newCurrentTime - frameStartTime)

应该更流畅如果你想真正的亲(并留在Java中),我想你必须考虑JavaFX.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读