重庆分公司,新征程启航
为企业提供网站建设、域名注册、服务器等服务
把鼠标的x和y放一个队列里,限定队列长度,每次都把队列里的点画出来就行了。
阿勒泰网站制作公司哪家好,找创新互联!从网页设计、网站建设、微信开发、APP开发、自适应网站建设等网站项目制作,到程序开发,运营维护。创新互联于2013年开始到现在10年的时间,我们拥有了丰富的建站经验和运维经验,来保证我们的工作的顺利进行。专注于网站建设就选创新互联。
lz 你好
我做了一个比较简单的雏形
绿色正方形水平随机运动
蓝色正方形垂直随机运动
import java.awt.*;
import javax.swing.*;
import java.awt.event.*;
import java.math.*;
public class MoveRect extends Frame implements Runnable{
private Rectangle hRect, vRect;
private Image buffer;
private Object o = new Object();
public MoveRect(){
super("MoveRect");
hRect = new Rectangle(50,0,50,50);//水平随机运动的正方形
vRect = new Rectangle(0,50,50,50);//垂直随机运动的正方形
setUndecorated(true);
setLocation(500,200);
setSize(400,400);
setVisible(true);
addWindowListener(new WindowAdapter(){
public void windowClosing(WindowEvent e){
System.exit(0);
}
});
}
//启动循环绘制(使正方形一直循环的运动)
public void circleDraw(){
}
//绘制正方形的状态
public void drawRect(Graphics g,Rectangle r){
g.drawRect(r.x, r.y, r.width, r.height);
}
//双缓冲机制(主要解决闪屏)
public void update(Graphics g){
buffer = createImage(getSize().width, getSize().height);
if(buffer != null){
Graphics g2 = buffer.getGraphics();
paint(g2);
g2.dispose();
g.drawImage(buffer, 0, 0, this);
}
else{
paint(g);
}
}
public void paint(Graphics g){
g.setColor(Color.GREEN);
drawRect(g,hRect);
g.setColor(Color.BLUE);
drawRect(g,vRect);
hRect.x = (int)(Math.random()*351);
vRect.y = (int)(Math.random()*351);
}
public void run(){
while(true){
stop();
rePaint();
}
}
//同步方法rePaint
public synchronized void rePaint(){
repaint();
}
//同步方法stop
public synchronized void stop(){
if(hRect.x = 50 vRect.y = 50){
try {
Thread.sleep(500);
}
catch (Exception ex) {
ex.printStackTrace();
}
}
}
public static void main(String[] args){
new Thread(new MoveRect()).start();
}
}
图片的位移(下落),可以通过修改图片的x,y坐标来实现, 在Swing/Html中,我们可以使用Timer定时(比如每隔100毫秒)去修改图片的x,y坐标即可实现,
多个图片都按照一定的轨迹移动,那都按照自己的轨迹的算法,去定时修改x,y坐标即可.
JavaFX是java先进的图形界面框架, 里面有3D和各种动画, 所以按照轨迹移动,都能轻松实现
JavaFX参考代码如下
import javafx.animation.Animation;
import javafx.animation.Interpolator;
import javafx.animation.PathTransition;
import javafx.animation.RotateTransition;
import javafx.application.Application;
import javafx.geometry.Insets;
import javafx.scene.Group;
import javafx.scene.Scene;
import javafx.scene.control.Button;
import javafx.scene.image.ImageView;
import javafx.scene.layout.HBox;
import javafx.scene.shape.MoveTo;
import javafx.scene.shape.Path;
import javafx.scene.shape.QuadCurveTo;
import javafx.stage.Stage;
import javafx.util.Duration;
public class PathAnimateDemo extends Application {
public static void main(String[] args) {
launch(args);
}
@Override
public void start(Stage primaryStage) throws Exception {
ImageView imv=new ImageView(getClass().getResource("ball.png").toExternalForm());
Path path = new Path();// 路径;运动轨迹
MoveTo mt = new MoveTo(20, 50);
QuadCurveTo quadTo2 = new QuadCurveTo(175, 190, 350, 30);
path.getElements().addAll(mt, quadTo2);
HBox hbox = new HBox(10);
Button btnStart = new Button("开始");
Button btnPause = new Button("暂停");
Button btnResume = new Button("继续");
Button btnStop = new Button("结束");
hbox.getChildren().addAll(btnStart, btnPause, btnResume, btnStop);
hbox.setPadding(new Insets(20));
hbox.setLayoutX(80);
hbox.setLayoutY(230);
Group root = new Group();
root.getChildren().addAll(imv, path, hbox); // 不添加path.就可以不显示path了
Scene scene = new Scene(root, 430, 300);
primaryStage.setTitle("JavaFX");
primaryStage.setScene(scene);
primaryStage.show();
//旋转动画设置
RotateTransition rt=new RotateTransition(Duration.millis(1000),imv);
rt.setInterpolator(Interpolator.LINEAR);
rt.setFromAngle(0);
rt.setToAngle(360);
rt.setCycleCount(Animation.INDEFINITE);
rt.play();
//路径动画设置
PathTransition pt = new PathTransition(Duration.millis(800), path, imv);// 路径动画
pt.setCycleCount(Animation.INDEFINITE);
pt.setAutoReverse(true);
btnStart.setOnAction(e - {
pt.playFromStart();// 从头开始播放
});
//----按钮的响应设置---
btnPause.setOnAction(e - {
pt.pause();
});
btnResume.setOnAction(e - {
pt.play(); // 播放
});
btnStop.setOnAction(e - {
pt.jumpTo(new Duration(0));// 跳到第0秒处
pt.stop();
});
}
}