Java如何让多个图片都按照一定轨迹下落

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Java如何让多个图片都按照一定轨迹下落相关的知识,希望对你有一定的参考价值。

图片的位移(下落),可以通过修改图片的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();
);

参考技术A 你是说在html中吧?代码也可以直接写在html中或者java中都可以。思路就是写一个计时器,然后每xxx毫秒就执行一次函数。函数中定义图片的位置就可以了。

POJ1661

题意
Help Jimmy" 是在下图所示的场景上完成的游戏。 
技术分享图片

场景中包括多个长度和高度各不相同的平台。地面是最低的平台,高度为零,长度无限。 

Jimmy老鼠在时刻0从高于所有平台的某处开始下落,它的下落速度始终为1米/秒。当Jimmy落到某个平台上时,游戏者选择让它向左还是向右跑,它跑动的速度也是1米/秒。当Jimmy跑到平台的边缘时,开始继续下落。Jimmy每次下落的高度不能超过MAX米,不然就会摔死,游戏也会结束。 

设计一个程序,计算Jimmy到底地面时可能的最早时间。 

Input

第一行是测试数据的组数t(0 <= t <= 20)。每组测试数据的第一行是四个整数N,X,Y,MAX,用空格分隔。N是平台的数目(不包括地面),X和Y是Jimmy开始下落的位置的横竖坐标,MAX是一次下落的最大高度。接下来的N行每行描述一个平台,包括三个整数,X1[i],X2[i]和H[i]。H[i]表示平台的高度,X1[i]和X2[i]表示平台左右端点的横坐标。1 <= N <= 1000,-20000 <= X, X1[i], X2[i] <= 20000,0 < H[i] < Y <= 20000(i = 1..N)。所有坐标的单位都是米。 

Jimmy的大小和平台的厚度均忽略不计。如果Jimmy恰好落在某个平台的边缘,被视为落在平台上。所有的平台均不重叠或相连。测试数据保证问题一定有解。 

Output

对输入的每组测试数据,输出一个整数,Jimmy到底地面时可能的最早时间。
分析
错误分析:一开始想从高到底分析为题,发现好多问题难以处理,然后就咸鱼
正解:从低到高纪录每个板子到地面的最短时间,首先将所有板子按照高度排序,转移的时候注意一个板子左右只能到达一个板子
定义:dp[i][2]:分别纪录第i个板子左右到达地面得最短时间
转移:低到高转移,左右两边只能转移一次即可
技术分享图片
#include<iostream>
#include<string>
#include<cmath>
#include<algorithm>
#include<vector>
#include<cstdio>
using namespace std;

const int maxn = 1000+10;
struct node
{
    int x,y,h;
    friend bool operator < (node a, node b)
    {
        return a.h<b.h;
    }
}a[maxn];
int sx,sy,n,mmax;
int dp[maxn][3];


int main()
{
    int t;
    scanf("%d", &t);
    while(t--)
    {
        scanf("%d%d%d%d", &n, &sx, &sy, &mmax);
        for(int i=1;i<=n;i++)
        {
            scanf("%d%d%d", &a[i].x, &a[i].y, &a[i].h);
            dp[i][0]=dp[i][1]=1e9;
        }
        dp[n+1][0]=dp[n+1][1]=1e9;
        sort(a+1,a+n+1);
        a[n+1].x=sx, a[n+1].y=sx, a[n+1].h=sy;
        a[0].x=-3000;
        a[0].y=3000;
        a[0].h=0;
        for(int i=1;i<=n+1;i++)
        {
            bool zuo=true, you=true;
            for(int j=i-1;j>=0;j--)
            {
                if(a[i].h-a[j].h>mmax)
                    break;
                if((!zuo) && (!you))
                    break;
                if(zuo)
                {
                    if(j==0)
                    {
                         dp[i][0]=a[i].h;
                         zuo=false;
                    }
                    else
                    {

                    if(a[i].h-a[j].h<=mmax)
                    {
                        if(a[j].x<=a[i].x && a[j].y>=a[i].x)
                        {
                            dp[i][0]=a[i].h-a[j].h+min(dp[j][0]+a[i].x-a[j].x, dp[j][1]+a[j].y-a[i].x);
                            zuo=false;
                        }
                    }}
                }
                if(you)
                {
                    if(j==0)
                    {
                        dp[i][1]=a[i].h;
                        you=false;
                    }
                     else
                    {
                    if(a[i].h-a[j].h<=mmax)
                    {
                        if(a[j].x<=a[i].y && a[j].y>=a[i].y)
                        {
                            dp[i][1]=a[i].h-a[j].h+min(dp[j][0]+a[i].y-a[j].x,dp[j][1]+a[j].y-a[i].y);
                            you=false;
                        }
                    }}
                }
            }
        }
        printf("%d\n", dp[n+1][0]);
    }
}
View Code

 

以上是关于Java如何让多个图片都按照一定轨迹下落的主要内容,如果未能解决你的问题,请参考以下文章

Unity 物体轨迹移动

百度地图上如何实现轨迹回放

canvas学习之粒子动画

ThreeJs之选中模型中的物体及物体沿轨迹移动

GPS怎样进行轨迹回放

为啥我的python用pygame做图片移动会留下轨迹?