package org.test; import loon.LSystem; import loon.LTransition; import loon.Screen; import loon.action.ActionBind; import loon.action.ActionListener; import loon.action.ActionTween; import loon.action.ActionType; import loon.action.ColorTo; import loon.action.RotateTo; import loon.action.ScaleTo; import loon.action.sprite.Sprite; import loon.action.sprite.SpriteLabel; import loon.canvas.LColor; import loon.event.FrameLoopEvent; import loon.event.GameTouch; import loon.event.LTouchArea; import loon.event.Updateable; import loon.geom.Bezier; import loon.geom.Vector2f; import loon.opengl.GLEx; import loon.utils.Easing; import loon.utils.Easing.EasingMode; import loon.utils.timer.LTimer; import loon.utils.timer.LTimerContext; public class ActionEventTest extends Screen { @Override public LTransition onTransition() { return LTransition.newEmpty(); } @Override public void draw(GLEx g) { } @Override public void onLoad() { final SpriteLabel label = new SpriteLabel("Plase Touch The Screen", 120, 20); add(label); // 构建一个球体的精灵 final Sprite sprite = new Sprite("ball.png"); sprite.setLocation(66, 66); // Entity sprite=Entity.make("ball.png", 66, 66); add(sprite); // 注册一个有界限的触屏监听器 registerTouchArea(new LTouchArea() { @Override public void onAreaTouched(final Event e, final float touchX, final float touchY) { if (e == Event.DOWN) { // 设置一个指定精灵的动画事件(set或on函数设置指定对象的连续缓动动画,off或removeAllActions函数关闭所有缓动动画) on(sprite).bezierBy(1f, new Bezier(113, 122, 24, 14, 60, 62)). circleTo(50,50,100,90).//环绕50,50位置,半径100,每次移动90个像素,做不间断的旋转 listenNames("circle", new ActionListener() { //监听已经注入的,所有名称为circle的对象 private LTimer timer = new LTimer(1500); @Override public void stop(ActionBind o) { } @Override public void start(ActionBind o) { } @Override public void process(ActionBind o) { if(timer.action(elapsedTime)){ //停止所有circleTo事件 stopActionNames(o, "circle"); } } }). arrowTo(199f,66f,100f). //向指定位置做弓弩发射移动(也就是做抛物线,由于加入了g值,所以此位置非停止位置而是经过位置),重力100 moveTo(330, 66).moveTo(66,66).loop(1). //移动到330x66位置后再移动到66,66,循环上述动画1次 moveOvalTo(360f, 100, 20, new Vector2f(130,60), 1f, EasingMode.Linear).//椭圆形移动,初始x为0,旋转360,椭圆宽100,高20,以130,60为中心,移动1秒 moveRoundTo(360, 90, new Vector2f(130,60),3f, EasingMode.Linear) //做环绕移动,旋转360度,半径90个像素,以130,130为中心点,移动3秒,缓动方式Linear .loopLast(2)//重复2次上述最后一个动画事件 .parallelTo(new ScaleTo(2f),new RotateTo(360),new ColorTo(LColor.blue)) //同时执行缩放和旋转以及变色 .scaleTo(1f)//缩放回原始大小 .colorTo(LColor.white) //变回原始颜色 .flashTo(2f)//精灵闪烁2秒 .updateTo(new Updateable() { //执行一次Updateable(updateTo命令只会执行一次) @Override public void action(Object a) { //改变Label内容 label.setLabel("Call Updateable"); centerOn(label); } }). shakeTo(2f, 2f).//振动一次,振动范围值x2,y2 eventTo(new FrameLoopEvent() { //执行一次循环事件(FrameLoopEvent不执行kill事件不会自行停止) private LTimer timer = new LTimer(LSystem.SECOND); @Override public void invoke(long elapsedTime, Screen e) { //改变Label内容 label.setLabel("Call Event"); centerOn(label); //间隔一秒后删除此循环事件 if(timer.action(elapsedTime)){ kill(); } } @Override public void completed() { label.setLabel("Plase Touch The Screen"); label.setLocation(120, 20); } }). moveTo(66,66) .transferTo(-1, 200, EasingMode.InBack,true,false) //让对象移动200个像素,渐进方式InBack,仅限于x轴允许改变位置(-1时不改变原有对象x或y坐标初始位置) .colorTo(LColor.red) //渐变到红色 .shakeTo(2f, 3f). //让精灵产生振动,x轴最大移动2,y轴最大移动3 moveTo(touchX, touchY, false).// 地图方式,四方走法(true为8方向),移动到触屏位置. //若需限制地图行走区域,请注入Field2D对象(一个简单的,2维数组方式的地形存储器),矫正显示位置请注入offsetX和offsetY参数 fadeOut(60) // 动画淡出,速度60 .delay(1f) // 延迟1秒 .fadeIn(60)// 动画淡入 .colorTo(LColor.green) // 渐变到绿色 .repeat(0.5f) // 回放上述动作,延迟0.5秒 .moveTo(120, 160, false) // 地图方式,四方走法,移动到120,160位置 .moveTo(260, 320, true) // 八方走法,移动到260,320位置 .repeat(0.5f) // 回放上述动作,延迟0.5秒 .rotateTo(360) // 旋转360度 // 放大两倍,缩小还原,开始执行 .scaleTo(2f, 2f).scaleTo(1f, 1f).start() // 监听事件进度 ( PS:如果没有新的动作执行或操作,不必后续监听) .setActionListener(new ActionListener() { @Override public void stop(ActionBind o) { // 动作停止后,继续执行to(位置前进)事件 ActionTween tween = to(o, ActionType.POSITION, 400f, false). // 改变精灵坐标,延迟400,不删除先前设置的事件(如果删了,此监听也会删除) target(touchX, touchY). // 以触屏点为基础 ease(Easing.QUAD_INOUT); // 伸缩方式 // QUAD_INOUT tween.delay(0.5f); // 延迟0.5f tween.repeat(2, 0.5f); // 往返两次,延迟0.5f tween.repeatBackward(2, 0.5f); tween.showTo(false); // 隐藏当前动作对象 tween.delay(1f);// 延迟1秒 tween.showTo(true);// 重新显示 tween.start(); // 开始 } @Override public void start(ActionBind o) { } @Override public void process(ActionBind o) { } }); } } // 不限制触屏位置 @Override public boolean contains(float x, float y) { return true; } }); add(MultiScreenTest.getBackButton(this, 0)); } @Override public void alter(LTimerContext timer) { } @Override public void resize(int width, int height) { } @Override public void touchDown(GameTouch e) { } @Override public void touchUp(GameTouch e) { } @Override public void touchMove(GameTouch e) { } @Override public void touchDrag(GameTouch e) { } @Override public void resume() { } @Override public void pause() { } @Override public void close() { } }