package com.rpsg.rpg.core; import com.badlogic.gdx.Application.ApplicationType; import com.badlogic.gdx.Gdx; import com.badlogic.gdx.graphics.OrthographicCamera; import com.badlogic.gdx.scenes.scene2d.Stage; import com.badlogic.gdx.utils.Scaling; import com.badlogic.gdx.utils.viewport.ScalingViewport; import com.rpsg.rpg.controller.ArchiveController; import com.rpsg.rpg.controller.GamePropertiesController; import com.rpsg.rpg.controller.ItemController; import com.rpsg.rpg.controller.ScriptableController; import com.rpsg.rpg.view.GameView; import org.mozilla.javascript.Context; import org.mozilla.javascript.NativeJavaObject; import org.mozilla.javascript.ScriptableObject; /** * GDX-RPG 游戏上下文 */ public class Game { public static final int STAGE_WIDTH = 1280, STAGE_HEIGHT = 720; /**游戏设置*/ public static Setting setting; /**存档管理器*/ public static ArchiveController archive; /**当前游戏视窗,如果是null的话代表还没在游戏里*/ public static GameView view; /**游戏配置管理器*/ public static GamePropertiesController prop; /**道具管理器*/ public static ItemController item; /**脚本(缓存)管理器*/ public static ScriptableController script; /**初始化*/ public static void init(){ setting = Setting.create(); archive = new ArchiveController(); prop = new GamePropertiesController(); item = new ItemController(); script = new ScriptableController(); Log.i("Game context[created]"); } /**运行一段JS脚本, 可以传入一个变量来当做当前脚本的prototype*/ public static Object executeJS(String js, Object prototype, String jsName){ if(js == null || js.trim().length() == 0) return null; try { Context ctx = getJSContext(); ScriptableObject scope = ctx.initStandardObjects(); if(prototype != null) scope.setPrototype(((NativeJavaObject)Context.javaToJS(prototype, scope))); Object obj = ctx.evaluateString(scope, js, jsName, 1, null); Context.exit(); return obj; } catch (Exception e) { Log.e("无法执行脚本", e); e.printStackTrace(); return null; } } public static Context getJSContext() { Context ctx = Context.enter(); //如果是在手机运行的,则不预编译脚本,否则会出现异常,否则最大程度的预编译脚本,以提升性能 if(Game.isMobile()) ctx.setOptimizationLevel(-1); else ctx.setOptimizationLevel(9); return ctx; } public static Object executeJS(String js, Object prototype) { return executeJS(js, prototype, null); } public static Object executeJS(String js) { return executeJS(js, null, null); } public static int width(){ return Gdx.graphics.getWidth(); } public static int height(){ return Gdx.graphics.getHeight(); } /**是否正在手机中运行*/ public static boolean isMobile(){ return Gdx.app.getType() == ApplicationType.Android || Gdx.app.getType() == ApplicationType.iOS; } /** * 获取一个默认{@link Stage},他将和{@link Views#batch}共用一个画笔。<br> * 要注意的是,这个画笔的{@link com.badlogic.gdx.graphics.g2d.Batch#setTransformMatrix(com.badlogic.gdx.math.Matrix4) transform}被改变的话,将可能导致接下来绘制的东西坐标出现异常。 */ public static Stage stage(){ return new Stage(viewport(), Views.batch); } /** * 获取一个默认的{@link ScalingViewport Viewport},他将根据玩家设置,来选择缩放是“适应”还是“填充”模式。 */ public static ScalingViewport viewport(){ return new ScalingViewport(Game.setting.fitScaling ? Scaling.fit : Scaling.stretch, Game.STAGE_WIDTH, Game.STAGE_HEIGHT, new OrthographicCamera()); } }