Java在屏幕上移动对象

Java在屏幕上移动对象,java,Java,我试图在java窗口中移动一列火车,但遇到了严重的问题。我有一节火车课,是我做火车的,还有一节司机课,应该是开动火车的。我需要让整个列车从右向左移动,直到它“通过”屏幕的左边缘。然后添加if语句以更改dx,使列车在右侧重新启动。下面是我尝试过的,但它不起作用。谁能帮帮我吗 public class Driver extends GraphicsProgram { //~ Instance/static variables .................................

我试图在java窗口中移动一列火车,但遇到了严重的问题。我有一节火车课,是我做火车的,还有一节司机课,应该是开动火车的。我需要让整个列车从右向左移动,直到它“通过”屏幕的左边缘。然后添加if语句以更改dx,使列车在右侧重新启动。下面是我尝试过的,但它不起作用。谁能帮帮我吗

public class Driver extends GraphicsProgram
{
    //~ Instance/static variables .............................................

    private static final int N_STEPS = 1000;
    private static final int PAUSE_TIME = 20;
    private static final double TRAIN_LENGTH = 320;

    //~ Constructor ...........................................................

    // ----------------------------------------------------------
    /**
     * The run() method of the Driver Class.
     * Creates an instance of the Train Class.
     * Responsible for animating the train across the screen.
     */
    public void run()
    {
        Train train = new Train(getGCanvas());
        for (int i = 0; i < N_STEPS; i++) {
            train.move(-100, 0);
            pause(PAUSE_TIME);
    }
公共类驱动程序扩展图形程序
{
//~实例/静态变量。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。
私有静态最终整数N_步长=1000;
专用静态最终整数暂停时间=20;
专用静态最终双列车长度=320;
//~z~建造师。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。
// ----------------------------------------------------------
/**
*驱动程序类的run()方法。
*创建Train类的实例。
*负责在屏幕上设置火车的动画。
*/
公开募捐
{
列车=新列车(getGCanvas());
对于(int i=0;i
这是一个用swing制作的小演示。只需将黑色矩形替换为您的火车图像,您就完成了

诀窍是使用一个单独的线程(或计时器)进行动画循环(通常称为
游戏循环
)。循环只告诉窗口重新绘制自身,在每次重新绘制时,您首先计算动画对象的新位置,然后绘制它们

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

public class TrainDemo {

    public static void main(String[] args) {
        JFrame frame = new JFrame("Train Demo");
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        frame.setSize(800, 400);
        frame.setLocationRelativeTo(null);
        frame.add(new TrainCanvas());
        frame.setVisible(true);
    }

}

class TrainCanvas extends JComponent {

    private int lastX = 0;

    public TrainCanvas() {
        Thread animationThread = new Thread(new Runnable() {
            public void run() {
                while (true) {
                    repaint();
                    try {Thread.sleep(10);} catch (Exception ex) {}
                }
            }
        });

        animationThread.start();
    }

    public void paintComponent(Graphics g) {
        Graphics2D gg = (Graphics2D) g;

        int w = getWidth();
        int h = getHeight();

        int trainW = 100;
        int trainH = 10;
        int trainSpeed = 3;

        int x = lastX + trainSpeed;

        if (x > w + trainW) {
            x = -trainW;
        }

        gg.setColor(Color.BLACK);
        gg.fillRect(x, h/2 + trainH, trainW, trainH);

        lastX = x;
    }

}

也是你的问题,还是其他有相同作业的人?是其他有相同作业的人,这是我唯一一次发布关于这个问题的帖子。你有什么建议吗?我已经工作了几个小时,但似乎无法想出如何在屏幕上移动对象:(我只能想象(正如在另一个线程中所建议的)您需要调用某个方法来告诉它重新绘制屏幕。
GraphicsProgram
不是标准的Java类,所以我不知道该方法是什么。当您说“它不工作”时,您需要更具体一些,因为不清楚问题是什么。列车根本没有渲染吗?它完全静止吗?它是否在边缘中途停止?它是否超出或环绕?您是否收到异常消息?为什么在列车中使用固定值。移动(-100,0)i;在for循环中?他们似乎没有使用Swing。我不认为他们可以“用train替换黑色矩形”,而且他们的run()方法似乎已经为动画设计好了,所以我认为它不需要另一个线程。@Boann你不能根据操作代码做出那么多假设。我看到的是run()方法方法用于实例化火车并执行动画。它似乎不会在循环中被外部引擎调用。这样,它就相当于我的TrainCanvas()构造函数。我试图使代码变得如此简单,以至于OP可以将Swing思想转化为其引擎机制,同时还为他提供了一个工作演示,使他能够使用它,我认为这真的不值得-1:-)
color c = color(0); float x = 0; float y = 100; float speed = 1;
void setup() { size(200,200); }
void draw() { background(255); move(); display(); }
void move() { x = x + speed; if (x > width) { x = 0; } }
void display() { fill(c); rect(x,y,30,10); }