思路:

  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根据配置文件生成布局(未完)的更多相关文章

  1. css流式和弹性布局(未完)

    (子容器%父容器)*100 png透明ie6中filter:progid:DXImageTransfornm.Microsoft.AlphaImageLoader( src='路径',sizingMe ...

  2. 疯狂Java:突破程序员基本功的16课-李刚编著 学习笔记(未完待续)

    突破程序员基本功(16课) 数组 静态语言: 在编译的时候就能确定数据类型的语言,大多静态语言要求在使用变量之前必须声明数据类型(少数具有强推导能力的现代语言不用) 动态语言: 在程序运行时确定数据类 ...

  3. Go web编程学习笔记——未完待续

    1. 1).GOPATH设置 先设置自己的GOPATH,可以在本机中运行$PATH进行查看: userdeMacBook-Pro:~ user$ $GOPATH -bash: /Users/user/ ...

  4. MVC丶 (未完待续······)

         希望你看了此小随 可以实现自己的MVC框架     也祝所有的程序员身体健康一切安好                                                     ...

  5. [python]爬代理ip v2.0(未完待续)

    爬代理ip 所有的代码都放到了我的github上面, HTTP代理常识 HTTP代理按匿名度可分为透明代理.匿名代理和高度匿名代理. 特别感谢:勤奋的小孩 在评论中指出我文章中的错误. REMOTE_ ...

  6. Reading | 《数字图像处理原理与实践(MATLAB版)》(未完待续)

    目录 一.前言 1.MATLAB or C++ 2.图像文件 文件头 调色板 像素数据 3.RGB颜色空间 原理 坐标表示 4.MATLAB中的图像文件 图像类型 image()函数 imshow() ...

  7. 构建Linux根文件系统(未完待续)

          所谓制作根文件系统, 就是创建各种目录, 并且在里面创建各种文件. 比如在/bin ./sbin 目录下存放各种可执行程序, 在/etc 目录下存放配置文件, 在/lib 目录下存放库文件 ...

  8. 关于DOM的一些总结(未完待续......)

    DOM 实例1:购物车实例(数量,小计和总计的变化) 这里主要是如何获取页面元素的节点: document.getElementById("...") cocument.query ...

  9. 一篇文章让Oracle程序猿学会MySql【未完待续】

    一篇文章让Oracle DB学会MySql[未完待续] 随笔前言: 本篇文章是针对已经能够熟练使用Oracle数据库的DB所写的快速学会MySql,为什么敢这么说,是因为本人认为Oracle在功能性方 ...

随机推荐

  1. union 和order by 使用时排序不正确

    静态专题和APP版专题(order by不起作用): [query] sql=(select sp_f13577,sp_f13576 from sp_t113 where url_1 not like ...

  2. Leetcode8.String to Integer (atoi)字符串转整数(atoi)

    实现 atoi,将字符串转为整数. 该函数首先根据需要丢弃任意多的空格字符,直到找到第一个非空格字符为止.如果第一个非空字符是正号或负号,选取该符号,并将其与后面尽可能多的连续的数字组合起来,这部分字 ...

  3. golang学习资料必备

    核心资料库 https://github.com/yangwenmai/learning-golang

  4. Django项目:CRM(客户关系管理系统)--08--03PerfectCRM创建基本数据03

    如果感觉本章博客对您有帮助,请尽情打赏吧!

  5. Django项目:CRM(客户关系管理系统)--04--02PerfectCRM创建ADMIN页面02

    十.CRM项目创建模板页面 {#king_base.html#} {## ————————02PerfectCRM创建ADMIN页面————————#} {#模板文件 king_base.html#} ...

  6. 计算机网络.{wireshark的使用实验}

    ---恢复内容开始--- 三种选择 1 2 3 端口镜像:交换机的某个端口,接受或者发送的数据给另外一个端口 ARP欺骗: ARP欺骗是利用ARP协议自身的不足进行的欺骗 1 执行ping命令, 2 ...

  7. 洛谷 P1266 速度限制 最短路+SPFA算法

    目录 题面 题目链接 题目描述 输入输出格式 输入格式 输出格式 输入输出样例 输入样例 输出样例 说明 思路 AC代码 题面 题目链接 P1266 速度限制 题目描述 在这个繁忙的社会中,我们往往不 ...

  8. 弘康人寿基于 RocketMQ 构建微服务边界总线的实践

    随着互联网+和平台化战略的兴起,各个行业的 IT 系统都在向互联网架构发展,涉及的主要技术包括微服务.消息和弹性计算等,采用微服务架构实现服务高内聚.低耦合,通过异步消息完成交易快速响应和高并发.由于 ...

  9. CSS3--关于z-index不生效问题

    最近写CSS3和js结合,遇到了很多次z-index不生效的情况: 1.在用z-index的时候,该元素没有定位(static定位除外) 2.在有定位的情况下,该元素的z-index没有生效,是因为该 ...

  10. 微信小程序 —— wepy 使用 Vant Weapp

    一.下载 npm i @vant/weapp -S --production 下载完毕之后,就可以在 node_modules 文件夹里,看见下载的包了. 2.移动文件夹 把刚刚下载的包文件夹下的 l ...