【发布时间】:2018-04-26 17:32:11
【问题描述】:
好的,基本上我正在尝试用其他操作来装饰 Libgdx Actor 类
public Shake(Button buttonToBeDecorated) extends ButtonDecorator {
super(buttonToBeDecorated);
Array<Action> actions = buttonToBeDecorated.getActions();
for (Action action : actions)
addAction(action);
addAction(Actions.forever(new SequenceAction(
Actions.moveBy(10, 0, 0.5f),
Actions.moveBy(-10, 0, 0.5f)))
);
}
然而 toBeDecorated 类的动作(也包含在 SequenceAction 中)不适用于 Shake 的实例。我确信动作会正确传递,因为我可以将它们打印出来。但是我没有得到综合效果,也许你们中的一些人会知道为什么?谢谢
编辑:(基于@DHa 的新回复)
我相信我已经理解了您提出的这个 Group-Workaround。但是我仍然无法使其工作。对于这个实例,假设我们先用 Shake 动作装饰按钮对象,然后用 FadeOut 动作装饰(这两个类都有从父类 ButtonDecorator 扩展的“Group”变量)。所以创建这种类型的对象看起来像这样:
Button button = new Decorators.FadeOut(new Decorators.Shake(new Buttons.PlayButton()));
和类:
//Shake class - we just simply add Shake actor to group and then add a specific action
//this works perfectly fine by itself - new Decorators.Shake(new Buttons.PlayButton())
public static class Shake extends ButtonDecorator {
public Shake(Button buttonToBeDecorated) {
super(buttonToBeDecorated);
group.addActor(this);
group.addAction(Actions.forever(new SequenceAction(
Actions.moveBy(10, 0, 0.5f),
Actions.moveBy(-10, 0, 0.5f))));
}
}
//In FadeOut we are trying to decorate Shake object with another Action
public static class FadeOut extends ButtonDecorator {
public FadeOut(Button buttonToBeDecorated) {
super(buttonToBeDecorated);
Array<Action> actions = buttonToBeDecorated.group.getActions(); //getting actions from Shake
group.addActor(buttonToBeDecorated);
/* I'm guessing that the whole workaround is in this line. We are adding
Shake-actor to FadeOut group so Shake-actions should no longer apply
to Shake-object and can be applied to our new FadeOut button */
group.addActor(this); //Adding FadeOut to it's own group
for (Action action : actions)
group.addAction(Actions.parallel(action,new SequenceAction(Actions.fadeOut(3), Actions.fadeIn(3))))
//besides adding shake actions to FadeOut object we are also adding parallel fadeout action
}
}
我不知道为什么,但仍然只有一个动作(淡出)应用于创建的对象
【问题讨论】:
-
您的新版本不会复制 Action 对象。它将引用复制到同一个 Action 对象。由于 Action 类没有复制构造函数,因此复制它们的唯一方法是从头开始创建一个新的并手动复制每个参数。
-
我没有关注你的问题。复制方法是什么意思?听起来您似乎还不熟悉一些面向对象编程的基础知识,因此您可能需要阅读 Sun 网站上的 Java 教程。
标签: java design-patterns libgdx decorator