Libgdx之封装简单的脚本机制

需求:

游戏中,在开始前经常会用到,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

Libgdx之封装简单的脚本机制的相关文章

【sehll学习】linux运维一个简单shell脚本监控系统内存

学习shell脚本入门后,慢慢要尝试编写一些脚本练练手,在这先简单的学习写个系统内存的监控. 1.首先先要确定一下截取一下需要关注的内存使用值,可使用free 命令来操作 free -m 显示 一般在监控内存是我们都是截取 第三行(-/+ buffers/cache)的值.确定后可以使用管道线和grep命令来获取这个的值. free -m | grep - | awk  '{print $4}' 获取到他的值为  858 当中 grep -  就是匹配一下要选取的内容,不太熟悉的可以学习一下gr

对rsync进行封装的shell脚本

抓取 #!/bin/bash . push.sh # 错误处理:尝试查找备份文件 function onError() { local errFile="err" local serverInfo=($1 $2 $3) # ip username password local logInfo=($4 $5) # srcPath destPath local srcPath=${logInfo[0]} logInfo[0]="disk1/"${srcPath##*/}

[简明python教程]学习笔记之编写简单备份脚本

[[email protected] 0503]# cat backup_ver3.py #!/usr/bin/python #filename:backup_ver3.py import os import time #source source=['/root/a.sh','/root/b.sh','/root/c.sh'] #source='/root/c.sh' #backup dir target_dir='/tmp/' today=target_dir+time.strftime('

邮箱扒头像来告诉你怎么写简单的脚本扒图

用邮箱扒头像来告诉你怎么写简单的脚本扒图 手上有几十万邮箱,本来用户系统没有做头像的东西,现在想根据这些邮箱能拿一部分用户的头像,可以直接使用 gravatar的服务,不过这玩意儿不时会被墙,还是拉回来靠谱,第2个途径是qq邮箱,通过分析数据发现,这几十万 用户里面居然有一半以上是qq邮箱,so 要想办法通过不用oauth的方式拿到. 思路与技术选择 作为一个pythoner,有很多爬虫框架可以选择,例如scrapy pyspider 没错有中文 有ui 有时间调度 爬虫框架会给你做很多事情,基

简单小脚本

(1).要求编写一个脚本,请给出 系统使用的什么样的Linux系统. 系统内核版本多少 , 当前登录的用户为: 系统有几块硬盘,每块硬盘的大小 系统内存总量多少 服务器的硬件型号 有几颗CPU,每颗CPU有多少个内核 (2).请编辑一个脚本,给出本机IP有多少IP地址.然后每个IP地址的子网掩码, 然后请给出本机的网关IP是多少? 效果输出如下: 本机IP地址有3个 分别为: IPxxxxxx,子网掩码xxxx IPxxxxxx,子网掩码xxxx IPxxxxxx,子网掩码xxxx 网关地址为:

A simple libgdx game (一个简单的游戏)

在深入钻研libGDX提供的api之前,让我们创建一个简单的小游戏来初步接触一个每个模块.这里将会主要介绍一些设计思想,而非细节. 我们将会看到如下内容: 1.主要的文件操作 2.清屏 3.绘制图片 4.使用相机 5.主要的输入处理 6.播放声音效果 工程的创建就不在赘述了. The Game (游戏) 游戏的idea很简单: 1.用桶抓住雨滴 2.桶在屏幕的下方 3.雨滴在屏幕的上面随机出现并且垂直下落 4.玩家可以通过鼠标或者触摸或者键盘方向键来水平移动桶 5.游戏没有结束条件... The

简单python脚本

简单python脚本: 注:1.python 变量不需要$2.for里面的print需要前空2格3.range(2,9)不包括9 vi aa.py #!/usr/bin/python i=5print i i=i+1print i a=6b=5c=a * bprint c for a in range(2,9):print a :wq python aa.py 原文地址:http://blog.51cto.com/yangzhiming/2122703

记录工作用到的一个简单js脚本

测试极光发送通知接口及客户端处理情况,需在极光后台增加通知数据.由于需要多个输入框输入数据,浏览器关闭后又需重新输入数据,故作此简单js脚本,在浏览器开发者模式下执行,便自动向浏览器输入框输入数据. document.getElementsByTagName("textarea")[0].value="专家说文章测试切入横幅跳转测试切入横幅跳转" document.getElementsByClassName("input-global-blue-shad

MacOS终端下执行一个简单Java脚本

MacOS下安装完Java JVM,配置好环境变量后可以在终端执行一个简单的java脚本程序,其中先使用javac编译器将.java文件编译成字节码文件,然后通过java解释器执行字节码文件. 编写一个简单的脚本 1 class Demo{ 2 3 public static void main(String[] args){ 4 System.out.println("hello world!"); 5 } 6 7 } 编写完后保存为.java格式,这里使用终端查看: 打开终端编译