package com.rpsg.rpg.core; import java.util.ArrayList; import java.util.List; import java.util.Map; import com.badlogic.gdx.ApplicationListener; import com.badlogic.gdx.Gdx; import com.badlogic.gdx.graphics.GL20; import com.badlogic.gdx.graphics.g2d.SpriteBatch; import com.rpsg.gdxQuery.$; import com.rpsg.rpg.ui.view.ParameterizableView; import com.rpsg.rpg.ui.view.View; import com.rpsg.rpg.util.Timer; import com.rpsg.rpg.view.LoadView; import com.rpsg.rpg.view.LogoView; /** * GDX-RPG 游戏入口 * * <p>本类为游戏的入口,</p> */ public class Views implements ApplicationListener { /**画笔*/ public static SpriteBatch batch; /**输入监听器*/ public static Input input; /**当前所显示的view*/ public static List<View> views = new ArrayList<>(); /**缓存的view,将在下一帧加入到{@link #views}里*/ private static List<View> insertViews = new ArrayList<>(); /**载入视图,当有资源被载入时,该视图将被绘制*/ public static LoadView loadView; /**当游戏被创建*/ public void create() { Log.i("====================================================="); Log.i(" _____ _______ __ _____ _____ _____"); Log.i(" / ____| __ \\ \\ / / | __ \\| __ \\ / ____|"); Log.i("| | __| | | \\ V /_____| |__) | |__) | | __ "); Log.i("| | |_ | | | |> <______| _ /| ___/| | |_ |"); Log.i("| |__| | |__| / . \\ | | \\ \\| | | |__| |"); Log.i(" \\_____|_____/_/ \\_\\ |_| \\_\\_| \\_____| "); Log.i(""); Log.i("====================================================="); Log.i(">>> Initialization <<<"); //创建资源管理器 Res.init(); //初始化上下文 Game.init(); //创建UI工具 UI.init(); //创建全局画笔 batch = new SpriteBatch(); //创建输入监听器 Gdx.input.setInputProcessor(input = new Input(views)); Log.i(">>> Completed <<<"); Log.i("====================================================="); Log.i(""); //创建载入动画 loadView = new LoadView(); loadView.create(); //创建LOGO界面 addView(LogoView.class); } /**游戏主循环*/ public void render() { //设置OpenGL清屏颜色 Gdx.gl.glClearColor(0,0,0,1); Gdx.gl.glClear(GL20.GL_COLOR_BUFFER_BIT); //查找views里是否有需要被删除的元素 $.removeIf(views, View::removeable, v -> v.removeable(false)); //如果insertViews有内容,则加入到views里 if(!insertViews.isEmpty()){ for(View view : insertViews) views.add(0, view); insertViews.clear(); } //延时运行工具 Timer.act(); //依次遍历view //创建views的快照进行遍历 for(int i = views.size() - 1; i >= 0; i--){ View view = views.get(i); view.act(); view.draw(); } loadView.act(); loadView.draw(); } public static <T extends View> T addView(Class<T> clz) { return addView(clz, null); } /**增加一个{@link View}到控制器里*/ public static <T extends View> T addView(Class<T> clz, Map<String, Object> param){ try { T view = null; if(view instanceof ParameterizableView) view = clz.getDeclaredConstructor(Map.class).newInstance(param); else view = clz.newInstance(); view.create(); addView(view); return view; } catch (Exception e) { e.printStackTrace(); } return null; } public static void addView(View view) { insertViews.add(0, view); view.removeable(false); Log.i("Views << " + view.toString()); } public static View find(Class<? extends View> clz){ synchronized (views) { return $.getIf(views, v -> v.getClass().getSuperclass().equals(clz)); } } public void resize(int width, int height) { synchronized (views){ for(View view : views) view.resize(); } } public void pause() {} public void resume() {} public void dispose() {} }