需求:
游戏中,在开始前经常会用到,ready->go->start game,或者其他情况。
简单的说,就是游戏一些UI展示需要按照步骤执行。
于是乎,为了让逻辑清晰,自己写了简单执行脚本,方便以后的开发。
package com.oahcfly.chgame.core.script; // 接口 public interface IScript { public void addSteps(String... args); public void run(final Runnable callBackRunnable); }
package com.oahcfly.chgame.core.script; import java.lang.reflect.InvocationTargetException; import java.lang.reflect.Method; import com.badlogic.gdx.Gdx; import com.badlogic.gdx.scenes.scene2d.actions.Actions; import com.badlogic.gdx.scenes.scene2d.actions.RunnableAction; import com.badlogic.gdx.scenes.scene2d.actions.SequenceAction; import com.badlogic.gdx.utils.Array; import com.oahcfly.chgame.core.mvc.CHActor; import com.oahcfly.chgame.core.mvc.CHScreen; /** * * CH脚本: * 1.add(方法名) * 2.run(回调函数) * * @author haocao * */ public class CHScript implements IScript { private Array<String> stepArr = new Array<String>(); private CHScreen parentScreen; private CHActor actor; public CHScript(CHScreen screen) { this.parentScreen = screen; actor = new CHActor(); } @Override public void run(final Runnable callBackRunnable) { // 调用screen内,一系列的方法名。method1,mthod2,method3... this.parentScreen.addActor(actor); SequenceAction sequenceAction = new SequenceAction(); for (int i = 0, size = stepArr.size; i < size; i++) { final String methodName = stepArr.get(i); RunnableAction runnableAction = new RunnableAction() { @Override public void run() { invokeMethod(methodName); } }; sequenceAction.addAction(runnableAction); } sequenceAction.addAction(Actions.run(new Runnable() { @Override public void run() { parentScreen.removeActor(actor); CHScript.this.stepArr.clear(); callBackRunnable.run(); } })); actor.addAction(sequenceAction); } private void invokeMethod(String methodName) { final Class<?> screenClass = parentScreen.getClass(); Method method; try { method = screenClass.getDeclaredMethod(methodName); method.invoke(parentScreen); } catch (NoSuchMethodException e) { // TODO Auto-generated catch block Gdx.app.error(getClass().getSimpleName(), e.getLocalizedMessage()); } catch (SecurityException e) { // TODO Auto-generated catch block Gdx.app.error(getClass().getSimpleName(), e.getLocalizedMessage()); } catch (IllegalAccessException e) { // TODO Auto-generated catch block Gdx.app.error(getClass().getSimpleName(), e.getLocalizedMessage()); } catch (IllegalArgumentException e) { // TODO Auto-generated catch block Gdx.app.error(getClass().getSimpleName(), e.getLocalizedMessage()); } catch (InvocationTargetException e) { // TODO Auto-generated catch block Gdx.app.error(getClass().getSimpleName(), e.getLocalizedMessage()); } } /** * 方法需要public。 */ @Override public void addSteps(String... args) { for (String methodName : args) { stepArr.add(methodName); } } }
功能核心是依靠libgdx中的SequenceAction,顺序执行Action。最后给出一个结束的回调。
用法简介:
CHScript script = new CHScript(this); script.addSteps("step1", "step2", "step3"); script.run(new Runnable() { @Override public void run() { // TODO Auto-generated method stub // System.out.print("step执行完毕"); } });
在Screen中,加入上面的代码,同时需要添加 3个方法:
public void step1() { System.out.println(System.currentTimeMillis() + " step1"); } public void step2() { System.out.println(System.currentTimeMillis() + " step2"); } public void step3() { System.out.println(System.currentTimeMillis() + " step3"); }
这样就实现了我们需求。
欢迎关注CHGame框架(基于Libgdx二次封装快速开发框架):
https://git.oschina.net/oahcfly/CHGame.git
时间: 2024-09-28 12:02:23