16.libgdx根据配置文件生成布局(未完)
思路:
screen分为普通和复杂两种,普通的功能大部分是页面跳转以及简单的crud数据,复杂的单独弄出来
跳转普通的screen,直接根据配置文件调整设置
<layouts>
<loyout screenId="0" bg="bg_start" name="start" defaultWinId="" bgm="" remark="">
</loyout>
<loyout screenId="1" bg="bg_main" name="main" defaultWinId="0" bgm="" remark="">
<window id="0" scale="1.0" bg="" x="0" y="0" w="0" h="0" float="center" >
<buttons >
<button x="50" y="30" w="0" h="0" imgUpName="mbtn_empire" imgDownName="mbtn_empire" functionId="0" font="" remark="帝国"></button>
<button x="300" y="30" w="0" h="0" imgUpName="mbtn_conquest" imgDownName="mbtn_conquest" functionId="1" font="" remark="征服"></button>
<button x="550" y="30" w="0" h="0" imgUpName="mbtn_commder" imgDownName="mbtn_commder" functionId="2" font="" remark="指挥官"></button>
<button x="800" y="30" w="0" h="0" imgUpName="mbtn_option" imgDownName="mbtn_option" functionId="3" font="" remark="设置"></button>
<button x="300" y="120" w="0" h="0" imgUpName="mbtn_map" imgDownName="mbtn_map" functionId="4" font="" remark="地图"></button>
</buttons>
</window>
</loyout>
</layouts>
package com.zhfy.game.screen; import java.util.ArrayList;
import java.util.List; import com.badlogic.gdx.Gdx;
import com.badlogic.gdx.ScreenAdapter;
import com.badlogic.gdx.graphics.GL20;
import com.badlogic.gdx.graphics.Texture;
import com.badlogic.gdx.graphics.g2d.BitmapFont;
import com.badlogic.gdx.graphics.g2d.TextureRegion;
import com.badlogic.gdx.scenes.scene2d.InputEvent;
import com.badlogic.gdx.scenes.scene2d.Stage;
import com.badlogic.gdx.scenes.scene2d.ui.ImageButton;
import com.badlogic.gdx.scenes.scene2d.ui.Label;
import com.badlogic.gdx.scenes.scene2d.ui.Label.LabelStyle;
import com.badlogic.gdx.scenes.scene2d.utils.ClickListener;
import com.badlogic.gdx.scenes.scene2d.utils.TextureRegionDrawable;
import com.badlogic.gdx.utils.Array;
import com.badlogic.gdx.utils.XmlReader;
import com.badlogic.gdx.utils.XmlReader.Element;
import com.badlogic.gdx.utils.viewport.StretchViewport;
import com.zhfy.game.MainGame;
import com.zhfy.game.config.ResConfig;
import com.zhfy.game.framework.GameFramework;
import com.zhfy.game.framework.GameLayout;
import com.zhfy.game.framework.GameUtil;
import com.zhfy.game.model.framework.TextureRegionListDAO;
import com.zhfy.game.screen.actor.base.BaseActor; /**
* 主游戏场景(游戏主界面), 实现 Screen 接口 或者 继承 ScreenAdapter 类 <br/>
* 这里就展示一张图片代表游戏主界面
*/
public class MainScreen extends ScreenAdapter { private MainGame game;
private EmpireScreen empireScreen; private Texture manTexture; private List<Stage> stages;
private Stage stage; private BaseActor manActor;
private TextureRegionListDAO imgLists; private TextureRegionListDAO imgUpList; private TextureRegionListDAO imgDownList; private ImageButton button;
//使用场景
private int screenId=1;
//uiRoot
private Element uiR;
//ui
private List<Element> ui;
private XmlReader reader ;
private String bgTexture;
private float tempX,tempY,tempW,tempH;
Array<Element> buttonEs;
//private GameFramework framework; public MainScreen(MainGame mainGame) {
//获取传参
this.game=mainGame;
// 创建背景纹理, 图片 bg_main.png reader = ResConfig.reader;
uiR=GameLayout.getXmlERootByScreenId(screenId);
ui=GameUtil.getXmlEByRootE(uiR);
manTexture = GameUtil.getBgTextureByStr(uiR.get("bg"),mainGame.getAssetManager());
//stages=new ArrayList<Stage>(); //获取对应图片
imgLists=GameUtil.getTextureReigonByScreenId( screenId,mainGame.getAssetManager());
// 创建游戏人物演员
manActor = new BaseActor(new TextureRegion(manTexture)); for (Element window:ui) {
tempX=window.getInt("x");tempY=window.getInt("y");tempW=window.getInt("w");tempH=window.getInt("h");
stage = new Stage(new StretchViewport(tempW==0?mainGame.getWorldWidth():tempW,tempH==0?mainGame.getWorldHeight():tempH)); // 添加演员到舞台
stage.addActor(manActor);
imgUpList=new TextureRegionListDAO();
imgDownList=new TextureRegionListDAO();
//遍历window的buttons按钮
buttonEs = window.getChildByName("buttons").getChildrenByNameRecursively("button"); // 递归遍历,否则的话返回null
for (Element buttonE : buttonEs) {
//Gdx.app.log("ui测试", button.get("remark"));
imgUpList.add(imgLists.getTextureByName(buttonE.get("imgUpName")));
imgDownList.add(imgLists.getTextureByName(buttonE.get("imgDownName"))); button = new ImageButton(new TextureRegionDrawable(imgLists.getTextureByName(buttonE.get("imgUpName")).getTextureRegion()),new TextureRegionDrawable(imgLists.getTextureByName(buttonE.get("imgDownName")).getTextureRegion()),new TextureRegionDrawable(imgLists.getTextureByName(buttonE.get("imgDownName")).getTextureRegion()));
button.setSize(buttonE.getInt("w")==0?imgLists.getTextureByName(buttonE.get("imgUpName")).getTextureRegion().getRegionWidth():buttonE.getInt("w"), buttonE.getInt("h")==0?imgLists.getTextureByName(buttonE.get("imgUpName")).getTextureRegion().getRegionHeight():buttonE.getInt("h"));
button.setPosition(buttonE.getInt("x"),buttonE.getInt("y"));
function(buttonE.getInt("functionId"));
stage.addActor(button);
Gdx.input.setInputProcessor(stage); }
} /*// 使用伸展视口创建舞台 // 将输入处理设置到舞台(必须设置, 否则点击按钮没效果)
Gdx.input.setInputProcessor(stage); {
//设定按钮
for(int i=0;i<imgUpList.size();i++) {
button = new ImageButton(new TextureRegionDrawable(new TextureRegion(imgUpList.get(i).getTextureRegion())),new TextureRegionDrawable(new TextureRegion(imgDownList.get(i).getTextureRegion())),new TextureRegionDrawable(new TextureRegion(imgDownList.get(i).getTextureRegion())));
button.setSize(imgUpList.get(i).getTextureRegion().getRegionWidth(), imgUpList.get(i).getTextureRegion().getRegionHeight());
button.setPosition(imgUpList.get(i).getRefx(),imgUpList.get(i).getRefy()); //把按钮监听放到function(i)里了;
function(i);
stage.addActor(button);
}
}
//测试框架
//framework.getStagesByScreenId(screenId); //文字示例
Label label=new Label("124563987258,12456382236874,123654236",new LabelStyle(new BitmapFont(), null));
label.setWidth(100);//设置每行的宽度
label.setWrap(true);//开启换行
stage.addActor(label);*/
} @Override
public void render(float delta) {
// 红色清屏
Gdx.gl.glClearColor(1, 0, 0, 1);
Gdx.gl.glClear(GL20.GL_COLOR_BUFFER_BIT); // 更新舞台逻辑
stage.act();
// 绘制舞台
stage.draw();
} public void dispose() {
super.dispose();
// 场景被销毁时释放资源
/*if (manTexture != null) {
manTexture.dispose();
}*/
if (stage != null) {
stage.dispose();
}
} //实现的功能
public void function(int i){
switch(i) {
case 0://跳转到帝国页面
button.addListener(new ClickListener() {
public void clicked(InputEvent event, float x, float y) {
//Gdx.app.log("点击了第1个按钮", "x:" + x+" y:" + y);
game.showGameScreen(screenId,3);
}
});
break;
case 1://跳转到征服页面
button.addListener(new ClickListener() {
public void clicked(InputEvent event, float x, float y) {
game.showGameScreen(screenId,4);
}
});
break;
case 2://跳转到指挥官页面
button.addListener(new ClickListener() {
public void clicked(InputEvent event, float x, float y) {
game.showGameScreen(screenId,5);
}
});
break;
case 3://跳转到设置页面
button.addListener(new ClickListener() {
public void clicked(InputEvent event, float x, float y) {
game.showGameScreen(screenId,6);
}
});
break;
case 4://跳转到设置页面
button.addListener(new ClickListener() {
public void clicked(InputEvent event, float x, float y) {
//game.showGameScreen(6);
game.showGameScreen(screenId,7);
}
});
break;
default:
button.addListener(new ClickListener() {
public void clicked(InputEvent event, float x, float y) {
Gdx.app.log("点击了其他按钮", "x:" + x+" y:" + y);
}
});
break;
} } }
通用场景
构想中首先根据screenId获得其布局背景图,布局默认stage编号,背景音乐等信息,
然后一个window代表一个stage,buttons下加载其按钮配置
随后还设想加入Lable(文本标签)和Image(图片标签),并且x,y,w,h等都会变为百分比计算距离,根据float来确定位置(靠左,靠右,居中),根据bgm切换音乐
实现多窗口(多stage),动态加载内容等功能
此篇将随着后续对ui的完善持续更新
6.22更新:
所有坐标按百分比读取,绘制点为图片中心点,如果超边界,会顶边而不超出去
package com.zhfy.game.screen; import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map; import com.badlogic.gdx.Gdx;
import com.badlogic.gdx.ScreenAdapter;
import com.badlogic.gdx.graphics.GL20;
import com.badlogic.gdx.graphics.Texture;
import com.badlogic.gdx.graphics.g2d.BitmapFont;
import com.badlogic.gdx.graphics.g2d.TextureRegion;
import com.badlogic.gdx.scenes.scene2d.InputEvent;
import com.badlogic.gdx.scenes.scene2d.Stage;
import com.badlogic.gdx.scenes.scene2d.ui.Image;
import com.badlogic.gdx.scenes.scene2d.ui.ImageButton;
import com.badlogic.gdx.scenes.scene2d.ui.Label;
import com.badlogic.gdx.scenes.scene2d.ui.Label.LabelStyle;
import com.badlogic.gdx.scenes.scene2d.utils.ClickListener;
import com.badlogic.gdx.scenes.scene2d.utils.TextureRegionDrawable;
import com.badlogic.gdx.utils.Array;
import com.badlogic.gdx.utils.XmlReader;
import com.badlogic.gdx.utils.XmlReader.Element;
import com.badlogic.gdx.utils.viewport.StretchViewport;
import com.zhfy.game.MainGame;
import com.zhfy.game.config.ResConfig;
import com.zhfy.game.framework.GameFramework;
import com.zhfy.game.framework.GameLayout;
import com.zhfy.game.framework.GameUtil;
import com.zhfy.game.model.framework.TextureRegionListDAO;
import com.zhfy.game.screen.abandon.EmpireScreen;
import com.zhfy.game.screen.actor.base.BaseActor; /**
* 主游戏场景(游戏主界面), 实现 Screen 接口 或者 继承 ScreenAdapter 类 <br/>
* 这里就展示一张图片代表游戏主界面
*/
public class GeneralScreen extends ScreenAdapter { private MainGame game; private Texture manTexture; private Image bgImage; private List<Stage> stages;
private Stage stage; private TextureRegionListDAO imgLists; private TextureRegionListDAO imgUpList; private TextureRegionListDAO imgDownList; private ImageButton button;
//使用场景
private int screenId=-1;
//uiRoot
private Element uiR;
//ui
private List<Element> ui;
private XmlReader reader ;
private String bgTexture;
private float tempX,tempY,tempW,tempH;
Array<Element> buttonEs;
private Map tempMap;
private int i;//function的计数标志,从1开始
//private GameFramework framework; public GeneralScreen(MainGame mainGame,int screenId) {
//获取传参
this.game=mainGame;
// 创建背景纹理, 图片 bg_main.png this.screenId=screenId;
reader = ResConfig.reader;
uiR=GameLayout.getXmlERootByScreenId(screenId);
ui=GameUtil.getXmlEByRootE(uiR);
manTexture = GameUtil.getBgTextureByStr(uiR.get("bg"),mainGame.getAssetManager());
//stages=new ArrayList<Stage>(); //获取对应图片
imgLists=GameUtil.getTextureReigonByScreenId( screenId,mainGame.getAssetManager());
// 创建游戏人物演员
bgImage= new Image(manTexture);
bgImage.setSize(mainGame.getWorldWidth(), mainGame.getWorldHeight()); i=1;
for (Element window:ui) {
tempX=window.getInt("x");tempY=window.getInt("y");tempW=window.getInt("w");tempH=window.getInt("h");
stage = new Stage(new StretchViewport(tempW==0?mainGame.getWorldWidth():tempW,tempH==0?mainGame.getWorldHeight():tempH)); // 添加演员到舞台
stage.addActor(bgImage);
imgUpList=new TextureRegionListDAO();
imgDownList=new TextureRegionListDAO();
//遍历window的buttons按钮
buttonEs = window.getChildByName("buttons").getChildrenByNameRecursively("button"); // 递归遍历,否则的话返回null
for (Element buttonE : buttonEs) {
//Gdx.app.log("ui测试", button.get("remark"));
imgUpList.add(imgLists.getTextureByName(buttonE.get("imgUpName")));
imgDownList.add(imgLists.getTextureByName(buttonE.get("imgDownName"))); button = new ImageButton(new TextureRegionDrawable(imgLists.getTextureByName(buttonE.get("imgUpName")).getTextureRegion()),new TextureRegionDrawable(imgLists.getTextureByName(buttonE.get("imgDownName")).getTextureRegion()),new TextureRegionDrawable(imgLists.getTextureByName(buttonE.get("imgDownName")).getTextureRegion()));
button.setSize(buttonE.getInt("w")==0?imgLists.getTextureByName(buttonE.get("imgUpName")).getTextureRegion().getRegionWidth():buttonE.getInt("w")*imgLists.getTextureByName(buttonE.get("imgUpName")).getTextureRegion().getRegionWidth()/100, buttonE.getInt("h")==0?imgLists.getTextureByName(buttonE.get("imgUpName")).getTextureRegion().getRegionHeight():buttonE.getInt("h")*imgLists.getTextureByName(buttonE.get("imgUpName")).getTextureRegion().getRegionHeight()/100);
button.setPosition(
buttonE.getInt("x")*stage.getWidth()/100+button.getWidth()/2>stage.getWidth()?stage.getWidth()-button.getWidth():buttonE.getInt("x")*stage.getWidth()/100-button.getWidth()/2<0?0:buttonE.getInt("x")*stage.getWidth()/100-button.getWidth()/2,
buttonE.getInt("y")*stage.getHeight()/100+button.getHeight()/2>stage.getHeight()?stage.getHeight()-button.getHeight():buttonE.getInt("y")*stage.getHeight()/100-button.getHeight()/2<0?0:buttonE.getInt("y")*stage.getHeight()/100-button.getHeight()/2);
tempMap=new HashMap();
tempMap.put("FUNCTION_ID", buttonE.get("functionId"));
tempMap.put("ID", i);
/*switch(screenId) {
//一些特殊的数据 暂时废弃
case 7:
break;
}*/
i++;
function(tempMap);
stage.addActor(button);
Gdx.input.setInputProcessor(stage); }
} /*// 使用伸展视口创建舞台 // 将输入处理设置到舞台(必须设置, 否则点击按钮没效果)
Gdx.input.setInputProcessor(stage); {
//设定按钮
for(int i=0;i<imgUpList.size();i++) {
button = new ImageButton(new TextureRegionDrawable(new TextureRegion(imgUpList.get(i).getTextureRegion())),new TextureRegionDrawable(new TextureRegion(imgDownList.get(i).getTextureRegion())),new TextureRegionDrawable(new TextureRegion(imgDownList.get(i).getTextureRegion())));
button.setSize(imgUpList.get(i).getTextureRegion().getRegionWidth(), imgUpList.get(i).getTextureRegion().getRegionHeight());
button.setPosition(imgUpList.get(i).getRefx(),imgUpList.get(i).getRefy()); //把按钮监听放到function(i)里了;
function(i);
stage.addActor(button);
}
}
//测试框架
//framework.getStagesByScreenId(screenId); //文字示例
Label label=new Label("124563987258,12456382236874,123654236",new LabelStyle(new BitmapFont(), null));
label.setWidth(100);//设置每行的宽度
label.setWrap(true);//开启换行
stage.addActor(label);*/
} @Override
public void render(float delta) {
// 红色清屏
Gdx.gl.glClearColor(1, 0, 0, 1);
Gdx.gl.glClear(GL20.GL_COLOR_BUFFER_BIT); // 更新舞台逻辑
stage.act();
// 绘制舞台
stage.draw();
} public void dispose() {
super.dispose();
// 场景被销毁时释放资源
/*if (manTexture != null) {
manTexture.dispose();
}*/
if (stage != null) {
stage.dispose();
}
} //实现的功能
/*
0:帝国/战役
1:征服
2:指挥官
3:设置
4:地图
5:返回主页
6:地图跳入(i)
7:跳入详细地图
8:
9:
10:
11:
12:
*/ public void function(Map map){
int i=Integer.parseInt(map.get("FUNCTION_ID").toString());
switch(i) {
case 0://跳转到帝国页面
button.addListener(new ClickListener() {
public void clicked(InputEvent event, float x, float y) {
//Gdx.app.log("点击了第1个按钮", "x:" + x+" y:" + y);
game.showGameScreen(screenId,3);
}
});
break;
case 1://跳转到征服页面
button.addListener(new ClickListener() {
public void clicked(InputEvent event, float x, float y) {
game.showGameScreen(screenId,4);
}
});
break;
case 2://跳转到指挥官页面
button.addListener(new ClickListener() {
public void clicked(InputEvent event, float x, float y) {
game.showGameScreen(screenId,5);
}
});
break;
case 3://跳转到设置页面
button.addListener(new ClickListener() {
public void clicked(InputEvent event, float x, float y) {
game.showGameScreen(screenId,6);
}
});
break;
case 4://跳转到设置地图
button.addListener(new ClickListener() {
public void clicked(InputEvent event, float x, float y) {
//game.showGameScreen(6);
game.showGameScreen(screenId,7);
}
});
break;
case 5://返回
button.addListener(new ClickListener() {
public void clicked(InputEvent event, float x, float y) {
//game.showGameScreen(6);
game.showGameScreen(screenId,1);
}
});
break;
case 6://地图跳入
button.addListener(new ClickListener() {
public void clicked(InputEvent event, float x, float y) {
//game.showGameScreen(6);
game.showGameScreen(screenId,7);
}
});
break;
case 7://地图编辑
button.addListener(new ClickListener() {
public void clicked(InputEvent event, float x, float y) {
game.setMapId(Integer.parseInt(map.get("ID").toString()));
game.showGameScreen(screenId,71);
}
});
break;
case 8://跳入征服
button.addListener(new ClickListener() {
public void clicked(InputEvent event, float x, float y) {
game.setStageId(Integer.parseInt(map.get("ID").toString()));
game.showGameScreen(screenId,81);
}
});
break; default:
button.addListener(new ClickListener() {
public void clicked(InputEvent event, float x, float y) {
Gdx.app.log("点击了其他按钮", "x:" + x+" y:" + y);
}
});
break;
} } }
所有坐标按百分比读取
16.libgdx根据配置文件生成布局(未完)的更多相关文章
- css流式和弹性布局(未完)
(子容器%父容器)*100 png透明ie6中filter:progid:DXImageTransfornm.Microsoft.AlphaImageLoader( src='路径',sizingMe ...
- 疯狂Java:突破程序员基本功的16课-李刚编著 学习笔记(未完待续)
突破程序员基本功(16课) 数组 静态语言: 在编译的时候就能确定数据类型的语言,大多静态语言要求在使用变量之前必须声明数据类型(少数具有强推导能力的现代语言不用) 动态语言: 在程序运行时确定数据类 ...
- Go web编程学习笔记——未完待续
1. 1).GOPATH设置 先设置自己的GOPATH,可以在本机中运行$PATH进行查看: userdeMacBook-Pro:~ user$ $GOPATH -bash: /Users/user/ ...
- MVC丶 (未完待续······)
希望你看了此小随 可以实现自己的MVC框架 也祝所有的程序员身体健康一切安好 ...
- [python]爬代理ip v2.0(未完待续)
爬代理ip 所有的代码都放到了我的github上面, HTTP代理常识 HTTP代理按匿名度可分为透明代理.匿名代理和高度匿名代理. 特别感谢:勤奋的小孩 在评论中指出我文章中的错误. REMOTE_ ...
- Reading | 《数字图像处理原理与实践(MATLAB版)》(未完待续)
目录 一.前言 1.MATLAB or C++ 2.图像文件 文件头 调色板 像素数据 3.RGB颜色空间 原理 坐标表示 4.MATLAB中的图像文件 图像类型 image()函数 imshow() ...
- 构建Linux根文件系统(未完待续)
所谓制作根文件系统, 就是创建各种目录, 并且在里面创建各种文件. 比如在/bin ./sbin 目录下存放各种可执行程序, 在/etc 目录下存放配置文件, 在/lib 目录下存放库文件 ...
- 关于DOM的一些总结(未完待续......)
DOM 实例1:购物车实例(数量,小计和总计的变化) 这里主要是如何获取页面元素的节点: document.getElementById("...") cocument.query ...
- 一篇文章让Oracle程序猿学会MySql【未完待续】
一篇文章让Oracle DB学会MySql[未完待续] 随笔前言: 本篇文章是针对已经能够熟练使用Oracle数据库的DB所写的快速学会MySql,为什么敢这么说,是因为本人认为Oracle在功能性方 ...
随机推荐
- python利用paramiko执行服务器命令
话不多说直接上代码 封装连接 @staticmethod def connect(ip, server_user, server_port, server_path): ""&qu ...
- golang的flag包源码解析与使用
当我们 import package时,package内的全局常量和全局变量会进行初始化,并且紧接着init函数会执行.因此我们先看一下flag包的全局常量和全局变量. 一.flag包的全局常量.全 ...
- 唱吧基于 MaxCompute 的大数据之路
使用 MaxCompute之前,唱吧使用自建体系来存储处理各端收集来的日志数据,包括请求访问记录.埋点数据.服务器业务数据等.初期这套基于开源组件的体系有力支撑了数据统计.业务报表.风控等业务需求.但 ...
- angular依赖注入(1)——从父元素到子元素的数据注入
1.什么是依赖注入? 依赖注入是一种编程模式,可以让类从外部源中获得它的依赖,不必亲自创建他们. (这就达到了一个效果,我不知道我是怎么实现的,但我创建了一个实现他的接口,然后接口封装起来,1.可以分 ...
- uva 10036
10036 - Divisibility 额..直接复制不过来,只好叙述一下了...t组样例,n个数(1-10000),k(2-100)是要取余的数,然后给出n个数第一个数前不能加正负号,其他的数前面 ...
- android 数据库存取图片
Android数据库中存取图片通常使用两种方式,一种是保存图片所在路径,二是将图片以二进制的形式存储(sqlite3支持BLOB数据类型).对于两种方法的使用,好像第二种方法不如第一种方法更受程序员欢 ...
- 工作记录--使用FFmpeg将一个视频文件中音频合成到另一个视频中
由于工作需要,临时被老大吩咐去研究一个FFmpeg工具,通过linux命令行去将一个视频中的音频提取出来并合成到另一个视频中,最终的效果是要保证2个视频中的音频都在一个视频中播放. 但是本人对FFmp ...
- 修改Eclipse自动换行长度
使用Ctrl+Shift+F自动格式化代码的时候,有时候折行太多反而让代码看起来更乱,不容易阅读. 解决办法: Window-->Preferences-->Java-->Code ...
- homeworkvue
两个半圆,点一下转90°,两个颜色 <!DOCTYPE html> <html lang="en"> <head> <meta chars ...
- DOM,jquery,vue
DOM 部分引用自引用自七色花的姐姐 1.DOM全称 Document Object Model,即文档对象模型,它允许脚本(js)控制Web页面.窗口和文档 2.DOM的作用 做网页的都知道,想要做 ...