Java 移动吃豆人

Java 移动吃豆人,java,swing,animation,pacman,Java,Swing,Animation,Pacman,这是我为创造一个吃豆人而写的程序。我现在想要吃豆人从一个随机的起点到一个随机的目标点沿直线移动。 你能建议怎么做吗 import javax.swing.JFrame; /** * Main class for pacman example. All it does is create a frame and put * the pacman panel in it. */ public class PacmanGUI extends JFrame{ private

这是我为创造一个吃豆人而写的程序。我现在想要吃豆人从一个随机的起点到一个随机的目标点沿直线移动。 你能建议怎么做吗

import javax.swing.JFrame;

/**
 * Main class for pacman example. All it does is create a frame and put
 * the pacman panel in it. 
 */


    public class PacmanGUI extends JFrame{
    private Pacman pc;
        public PacmanGUI(){
        super("Pacman");
        pc = new Pacman();
        this.getContentPane().add(pc);  
        this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        this.pack();
        this.setVisible(true);
    }
        public static void main(String[] args) {
        new PacmanGUI();
    }

}

问题 您必须同时管理两个动画

第一个,你已经编码好了,打开和关闭吃豆人的嘴

第二个动画负责将Pacman从一个位置移动到另一个位置

解决方案-精灵类 我建议你创建一个精灵类。精灵类将负责保持精灵的当前位置、精灵的下一个位置以及精灵移动的速度

您可以扩展Sprite以获得一个Pacman类和一个具有4个实例的Chaser类

吃豆人班 Pacman类将负责口腔动画

追逐类 Chaser类将负责决定是追赶吃豆人,还是逃离吃豆人

秋千尖 除非覆盖一个或多个组件类,否则不应扩展JavaSwing组件。您应该使用Swing组件


您应该始终在事件调度线程(EDT)上启动Swing GUI。您可以通过执行SwingUtilities的invokeLater方法来实现这一点

您应该有一个独立于GUI组件的GUI模型。我定义的三个类将是GUI模型的一部分。你还需要布置一个迷宫


祝您的项目好运。

Pacman
类中,您需要再创建两个值来存储起点和终点。您已经拥有
私人点pacManPosition声明,因此我也将这些声明为
s。您需要首先将
pacManPosition
设置为起点

Point start = // random start point
Point end = // random end point
Point pacManPoint = new Point(start);
现在您需要确定Pacman的移动速度,比如说每帧2像素

int speed = 2;
要确定每帧移动Pacman的量,我们需要进行一些计算。首先,得到直线的距离-

double distance = Math.sqrt(Math.pow(end.x - start.x, 2) + 
                            Math.pow(end.y - start.y, 2));
然后我们计算出以我们想要的速度走完这段距离需要多少帧

int totalFrames= (int)Math.round(distance / speed);
并添加一个帧计数器-

int frame = 0;
现在,查看
paintComponent
方法内部。现在,您正在将
pacManPosition
设置为每次绘制时的同一点(面板的中心)。这里要做的是更新每个帧的
pacManPosition
,直到它到达结束位置。在
paintComponent
中,您正在执行类似的操作,每次都要更新
moutstate
,以使嘴巴具有动画效果。对于动画位置,它看起来像-

if (frame < totalFrames) {
    pacManPosition.x = start.x + frame * (end.x - start.x) / totalFrames;
    pacManPosition.y = start.y + frame * (end.y - start.y) / totalFrames;
    frame++;
}
if(帧<总帧){
pacManPosition.x=start.x+frame*(end.x-start.x)/totalFrames;
pacManPosition.y=start.y+frame*(end.y-start.y)/totalFrames;
frame++;
}

这只是制作运动动画的一种方法,它假设了几件事——恒定的速度,无需避开障碍物,无需玩家控制。totalFrames中的计算并不精确——它将pacMan移动到接近终点的位置,但不能保证它会精确地在那里结束。它还与帧速率有关,这有缺点。根据具体情况,还有很多其他方法可以做到这一点。

Event Dispatch Thread(EDT)上的Swing GUI是Java在使用GUI生成器时为您提供的功能。没有它,全班都会过得很好。您能否解释这将如何使类安全,或者是否有必要将所有代码都放在EDT中。@user3376708:Sun(现在的Oracle)说将Swing组件放在(EDT)中。所有Swing组件都应该在EDT上创建和更新。否则,您可能会遇到一些难以调试的竞争条件。我很难让自己的代码正常工作,而不必忽略Oracle专家的建议而试图制造其他问题。因此,每次创建swing组件时,都必须创建一个Runnable()线程,还是只创建main方法中的一个多线程。事实上,如果你能提供一些代码示例会有所帮助。如果可以的话,可以通过fiddle站点链接它们。@user3376708:选择中的任何Java Swing文章。
if (frame < totalFrames) {
    pacManPosition.x = start.x + frame * (end.x - start.x) / totalFrames;
    pacManPosition.y = start.y + frame * (end.y - start.y) / totalFrames;
    frame++;
}