我需要编写一个程序,充当某些过程的动画模拟。无需详细说明,蜗牛(讲师的想法)会在棋盘状表面上移动,每个矩形(我称其为单元格)的坐标都为(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;
}
}
最后,在创建
Snail
和GraphicSnail
对象之后,不要忘记注册观察者:Snail snail = new Snail();
GraphicSnail graphicSnail = new GraphicSnail();
snail.registerObserver(graphicSnail);
希望这可以帮助,
斯蒂芬
关于java - 在动画仿真中将逻辑与图形分离,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/48126729/