package loon.action;
import loon.LSystem;
import loon.canvas.LColor;
import loon.utils.Easing;
import loon.utils.StringUtils;
/*
* 一个非常简单的动作脚本字符串设置模式,以"move()->delay()->move()-..."这类方式,
* 设置一个 具体ActionTween的行为.只支持常用命令.
*
* 用例:移动到127,127位置,每次移动16个像素(true为八方走法,false为四方走法),旋转360度,延迟2秒后,淡入(60帧完成),淡出(90帧完成)
* 写法:move(127,127,true,16)->rotate(360)->delay(2)->fadein(60)->fadeout(90)
*
* 在Screen可以写作如下格式:
*
* @Override
public void onLoad() {
Sprite sprite = new Sprite("assets/ball.png");
ActionScript script = act(sprite, "move(127,127,true,16)->rotate(360)->delay(2f)->fadein(60)->fadeout(90)");
add(sprite);
script.start();
}
*/
public class ActionScript {
private ActionTween _tween;
private String _src;
public ActionScript(ActionTween tween, String script) {
_tween = tween;
_src = script;
}
public TweenTo<ActionTween> start() {
if (_tween != null) {
if (_src != null) {
String result = StringUtils.replace(_src, LSystem.LS, "");
String[] list = StringUtils.split(result, "->");
for (String cmd : list) {
if (cmd.length() > 0) {
int start = cmd.indexOf('(');
int end = cmd.lastIndexOf(')');
String name = null;
String[] parameters = null;
if (start != -1 && end != -1 && end > start) {
name = cmd.substring(0, start).trim().toLowerCase();
parameters = StringUtils.split(
cmd.substring(start + 1, end), ',');
} else {
name = cmd.trim().toLowerCase();
}
if ("resume".equals(name) || "resumeto".equals(name)) {
_tween.resume();
} else if ("delay".equals(name)
|| "delayto".equals(name)) {
if (parameters != null) {
if (parameters.length == 1) {
_tween.delay(Float
.parseFloat(parameters[0]));
}
}
} else if ("move".equals(name) || "moveto".equals(name)) {
if (parameters != null) {
if (parameters.length == 2) {
_tween.moveTo(
Float.parseFloat(parameters[0]),
Float.parseFloat(parameters[1]));
} else if (parameters.length == 3) {
if (StringUtils.isBoolean(parameters[2])) {
_tween.moveTo(
Float.parseFloat(parameters[0]),
Float.parseFloat(parameters[1]),
StringUtils
.toBoolean(parameters[2]));
} else {
_tween.moveTo(
Float.parseFloat(parameters[0]),
Float.parseFloat(parameters[1]),
(int) Float
.parseFloat(parameters[2]));
}
} else if (parameters.length == 4) {
_tween.moveTo(Float
.parseFloat(parameters[0]), Float
.parseFloat(parameters[1]),
StringUtils
.toBoolean(parameters[2]),
(int) Float
.parseFloat(parameters[3]));
}
}
} else if ("moveby".equals(name)) {
if (parameters != null) {
if (parameters.length == 2) {
_tween.moveBy(
Float.parseFloat(parameters[0]),
Float.parseFloat(parameters[1]));
} else if (parameters.length == 3) {
_tween.moveBy(Float
.parseFloat(parameters[0]), Float
.parseFloat(parameters[1]),
(int) Float
.parseFloat(parameters[2]));
}
}
} else if ("rotate".equals(name)
|| "rotateto".equals(name)) {
if (parameters != null) {
if (parameters.length == 1) {
_tween.rotateTo(Float
.parseFloat(parameters[0]));
} else if (parameters.length == 2) {
_tween.rotateTo(
Float.parseFloat(parameters[0]),
Float.parseFloat(parameters[1]));
}
}
} else if ("rotate".equals(name)
|| "rotateto".equals(name)) {
if (parameters != null) {
if (parameters.length == 1) {
_tween.rotateTo(Float
.parseFloat(parameters[0]));
} else if (parameters.length == 2) {
_tween.rotateTo(
Float.parseFloat(parameters[0]),
Float.parseFloat(parameters[1]));
}
}
} else if ("fadein".equals(name)) {
if (parameters != null) {
if (parameters.length == 1) {
_tween.fadeIn(Float
.parseFloat(parameters[0]));
}
} else {
_tween.fadeIn(60);
}
} else if ("fadeout".equals(name)) {
if (parameters != null) {
if (parameters.length == 1) {
_tween.fadeOut(Float
.parseFloat(parameters[0]));
}
} else {
_tween.fadeOut(60);
}
} else if ("color".equals(name)
|| "colorto".equals(name)) {
if (parameters != null) {
if (parameters.length == 1) {
_tween.colorTo(new LColor(parameters[0]));
} else if (parameters.length == 2) {
_tween.colorTo(new LColor(parameters[0]),
new LColor(parameters[1]));
} else if (parameters.length == 3) {
_tween.colorTo(new LColor(parameters[0]),
new LColor(parameters[1]),
Float.parseFloat(parameters[2]));
} else if (parameters.length == 4) {
_tween.colorTo(new LColor(parameters[0]),
new LColor(parameters[1]),
Float.parseFloat(parameters[2]),
Float.parseFloat(parameters[3]));
}
} else {
_tween.colorTo(LColor.white);
}
} else if ("shake".equals(name)
|| "shaketo".equals(name)) {
if (parameters != null) {
if (parameters.length == 2) {
_tween.shakeTo(
Float.parseFloat(parameters[0]),
Float.parseFloat(parameters[1]));
} else if (parameters.length == 3) {
_tween.shakeTo(
Float.parseFloat(parameters[0]),
Float.parseFloat(parameters[1]),
Float.parseFloat(parameters[2]));
} else if (parameters.length == 4) {
_tween.shakeTo(
Float.parseFloat(parameters[0]),
Float.parseFloat(parameters[1]),
Float.parseFloat(parameters[2]),
Float.parseFloat(parameters[3]));
}
}
} else if ("transfer".equals(name)
|| "transferto".equals(name)) {
if (parameters != null) {
if (parameters.length == 4) {
_tween.transferTo(
Float.parseFloat(parameters[0]),
Float.parseFloat(parameters[1]),
Float.parseFloat(parameters[2]),
Easing.toEasingMode(parameters[3]));
} else if (parameters.length == 6) {
_tween.transferTo(Float
.parseFloat(parameters[0]), Float
.parseFloat(parameters[1]), Float
.parseFloat(parameters[2]), Easing
.toEasingMode(parameters[3]),
StringUtils
.toBoolean(parameters[4]),
StringUtils
.toBoolean(parameters[5]));
} else if (parameters.length == 7) {
_tween.transferTo(Float
.parseFloat(parameters[0]), Float
.parseFloat(parameters[1]), Float
.parseFloat(parameters[2]), Float
.parseFloat(parameters[3]), Easing
.toEasingMode(parameters[4]),
StringUtils
.toBoolean(parameters[5]),
StringUtils
.toBoolean(parameters[6]));
}
}
} else if ("scale".equals(name)
|| "scaleto".equals(name)) {
if (parameters != null) {
if (parameters.length == 1) {
float scale = Float
.parseFloat(parameters[0]);
_tween.scaleTo(scale, scale);
} else if (parameters.length == 2) {
_tween.scaleTo(
Float.parseFloat(parameters[0]),
Float.parseFloat(parameters[1]));
} else if (parameters.length == 3) {
_tween.scaleTo(
Float.parseFloat(parameters[0]),
Float.parseFloat(parameters[1]),
Float.parseFloat(parameters[2]));
}
}
} else if ("show".equals(name) || "showto".equals(name)) {
if (parameters != null) {
if (parameters.length == 1) {
_tween.showTo(StringUtils
.toBoolean(parameters[0]));
}
}
} else if ("repeat".equals(name)
|| "repeatto".equals(name)) {
if (parameters != null) {
if (parameters.length == 1) {
_tween.repeat(Float
.parseFloat(parameters[0]));
} else if (parameters.length == 2) {
_tween.repeat((int) Float
.parseFloat(parameters[0]), Float
.parseFloat(parameters[1]));
}
} else {
_tween.repeat(1f);
}
}
}
}
}
return _tween.start();
}
return null;
}
public ActionTween getTween() {
return _tween;
}
public void setTween(ActionTween tween) {
this._tween = tween;
}
public String getScript() {
return _src;
}
public void setScript(String script) {
this._src = script;
}
}