我需要编写一个程序,充当某些过程的动画模拟。无需详细说明,蜗牛(讲师的想法)会在棋盘状表面上移动,每个矩形(我称其为单元格)的坐标都为(x,y)。

我在将这种模拟的逻辑与图形分离时遇到问题。例如:

我有一个Snail课。它存储蜗牛的坐标并计算其行为。当它确定蜗牛应该从(x,y)移到(a,b)时,我需要对该移动进行动画处理,因此我还必须计算蜗牛的像素位置,并且需要在一段时间内重复进行操作才能使蜗牛移动到流利地移动,不跳。如果不是因为我不想在Snail类中这样做,这将不是问题,因为它与图形严格相关,与逻辑无关。

我不能仅仅创建一个基于棋盘上的Snail坐标绘制循环的循环,因为它不能反映流畅的运动,而不能反映当前的位置。

目前,我最好的主意是将Snail扩展为GraphicSnail,这将另外计算和存储蜗牛等位置的属性(以像素为单位),但对我而言似乎还不够。

预先感谢您的任何帮助。

最佳答案

您可能要使用Observer pattern

使用中间接口进行分离:

public interface SnailObserver {
   void update(Snail snail);
}


然后使您的图形相关类实现此接口。我不知道您正在使用哪个库(如果有)来渲染图形。如果使用的是JavaFX之类的内容,则GraphicSnail类也可以从ImageView继承。

public class GraphicSnail implements SnailObserver {

    @Overrride
    public void update(Snail snail) {
        // Use snail.getX() and snail.getY() to obtain
        // position of the snail and perform whatever
        // graphical updates you wish to make
    }

}


最后,这就是Snail类的外观。请注意附加字段,该字段保留对GraphicSnail的引用,但通过SnailObserver接口进行引用。这就是分离所在。请注意,您还可以存储此类观察者的完整列表。无论如何,关键的部分是只要update()对象的状态改变,就在观察者对象上调用Snail方法,从而使观察者意识到某些事情已经改变。然后,观察者对象检查Snail对象的当前状态,并相应地修改其自身的状态。

public class Snail {

    private double x;
    private double y;
    private SnailObserver observer;

    public void move() {
        // Move the snail and then notify the observer
        // that the snail has changed like so:
        observer.update(this);
    }

    public void registerObserver(SnailObserver observer) {
        this.observer = observer;
        observer.update(this); // initial sync
    }

    public double getX() {
        return x;
    }

    public double getY() {
        return y;
    }

}


最后,在创建SnailGraphicSnail对象之后,不要忘记注册观察者:

Snail snail = new Snail();
GraphicSnail graphicSnail = new GraphicSnail();
snail.registerObserver(graphicSnail);


希望这可以帮助,
斯蒂芬

关于java - 在动画仿真中将逻辑与图形分离,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/48126729/

10-11 22:46
查看更多