Java LibGDX如何实现场景二维菜单选项卡?
我已经制作了一个alpha版本的rpg,现在我想实现一个包含多个选项卡的菜单。当你在游戏中按tab或escape时,我想显示一个用户界面,上面有一个带3个按钮的条,如主菜单、技能树和资源清册。问题是,当您切换选项卡时,我需要停止绘制以前选择的选项卡,并从中禁用角色,因此当您从当前选项卡单击某个内容时,它不会同时单击某个选项卡上的按钮,该选项卡未被绘制,但它已存在。。。如何禁用角色、按钮,以便绘制新选项卡而不必担心当前选项卡与上一个选项卡重叠 编辑:我想避免制作多个阶段。我希望有一个单独的阶段,每个选项卡都有定义。Java LibGDX如何实现场景二维菜单选项卡?,java,libgdx,scene2d,Java,Libgdx,Scene2d,我已经制作了一个alpha版本的rpg,现在我想实现一个包含多个选项卡的菜单。当你在游戏中按tab或escape时,我想显示一个用户界面,上面有一个带3个按钮的条,如主菜单、技能树和资源清册。问题是,当您切换选项卡时,我需要停止绘制以前选择的选项卡,并从中禁用角色,因此当您从当前选项卡单击某个内容时,它不会同时单击某个选项卡上的按钮,该选项卡未被绘制,但它已存在。。。如何禁用角色、按钮,以便绘制新选项卡而不必担心当前选项卡与上一个选项卡重叠 编辑:我想避免制作多个阶段。我希望有一个单独的阶段,每
- 处理菜单的最佳方法是。
- 易于管理。分开上课。关注点分离
- 简化的生命周期管理。当另一个屏幕正在运行时暂停一个屏幕
- 其他屏幕被隐藏:(
- 若你们想保持相同的屏幕,最简单的方法就是不同的阶段。
- 只需禁用前一阶段的inputlistener,并停止在冻结阶段调用update
- 手动管理:(
- 如果您想使用相同的阶段,整个逻辑必须由您实现,因为您拒绝使用框架定义的类。
- 完全可定制
- 难以管理。(需要进行不必要的测试。测试Libgdx库类。)
- 也许实施起来很有趣
如何做:
- 为菜单和游戏对象使用不同的父顶级组
- 一次手动禁用一个组的事件处理并停止更新它
- 可能需要重写
类中的几个方法。(不推荐)阶段
通常,HUD和暂停菜单在不同阶段实施 我想避免制作多个阶段 这一定是因为“舞台很重” 相反,阶段并不沉重,但精神批却沉重 如果创建多个共享单个spritebatch的阶段,则可以轻松创建多个阶段,而无需太多开销 希望这有帮助。
祝你好运。不可见的参与者不接收触摸事件,这是实现选项卡式界面的最简单方法,只需适当设置选项卡内容参与者的可见性即可 下面是我将如何在libgdx中实现选项卡式接口:
package com.badlogic.gdx.tests.lwjgl;
import com.badlogic.gdx.ApplicationAdapter;
import com.badlogic.gdx.Gdx;
import com.badlogic.gdx.backends.lwjgl.LwjglApplication;
import com.badlogic.gdx.backends.lwjgl.LwjglApplicationConfiguration;
import com.badlogic.gdx.scenes.scene2d.Actor;
import com.badlogic.gdx.scenes.scene2d.InputEvent;
import com.badlogic.gdx.scenes.scene2d.Stage;
import com.badlogic.gdx.scenes.scene2d.ui.Button;
import com.badlogic.gdx.scenes.scene2d.ui.ButtonGroup;
import com.badlogic.gdx.scenes.scene2d.ui.HorizontalGroup;
import com.badlogic.gdx.scenes.scene2d.ui.Image;
import com.badlogic.gdx.scenes.scene2d.ui.Skin;
import com.badlogic.gdx.scenes.scene2d.ui.Stack;
import com.badlogic.gdx.scenes.scene2d.ui.Table;
import com.badlogic.gdx.scenes.scene2d.ui.TextButton;
import com.badlogic.gdx.scenes.scene2d.utils.ChangeListener;
import com.badlogic.gdx.scenes.scene2d.utils.ClickListener;
import com.badlogic.gdx.utils.viewport.ScreenViewport;
class Game3 extends ApplicationAdapter {
Skin skin;
Stage stage;
@Override
public void create () {
skin = new Skin(Gdx.files.internal("data/uiskin.json"));
stage = new Stage(new ScreenViewport());
Table main = new Table();
main.setFillParent(true);
// Create the tab buttons
HorizontalGroup group = new HorizontalGroup();
final Button tab1 = new TextButton("Tab1", skin, "toggle");
final Button tab2 = new TextButton("Tab2", skin, "toggle");
final Button tab3 = new TextButton("Tab3", skin, "toggle");
group.addActor(tab1);
group.addActor(tab2);
group.addActor(tab3);
main.add(group);
main.row();
// Create the tab content. Just using images here for simplicity.
Stack content = new Stack();
final Image content1 = new Image(skin.newDrawable("white", 1,0,0,1));
final Image content2 = new Image(skin.newDrawable("white", 0,1,0,1));
final Image content3 = new Image(skin.newDrawable("white", 0,0,1,1));
content.addActor(content1);
content.addActor(content2);
content.addActor(content3);
main.add(content).expand().fill();
// Listen to changes in the tab button checked states
// Set visibility of the tab content to match the checked state
ChangeListener tab_listener = new ChangeListener(){
@Override
public void changed (ChangeEvent event, Actor actor) {
content1.setVisible(tab1.isChecked());
content2.setVisible(tab2.isChecked());
content3.setVisible(tab3.isChecked());
}
};
tab1.addListener(tab_listener);
tab2.addListener(tab_listener);
tab3.addListener(tab_listener);
// Let only one tab button be checked at a time
ButtonGroup tabs = new ButtonGroup();
tabs.setMinCheckCount(1);
tabs.setMaxCheckCount(1);
tabs.add(tab1);
tabs.add(tab2);
tabs.add(tab3);
stage.addActor(main);
Gdx.input.setInputProcessor(stage);
}
@Override
public void render () {
stage.act();
stage.draw();
}
@Override
public void dispose () {
stage.dispose();
skin.dispose();
}
public static void main (String[] args) {
new LwjglApplication(new Game3(), new LwjglApplicationConfiguration());
}
}
我在考虑使用不同的屏幕,但是当我实现技能树时,我必须链接玩家对象,这样我可以从技能中更新统计数据,之后每次你想看到技能树时,我也需要更改屏幕。关于使用多个阶段和同一批精灵,这可能是个好主意,但是如果我想添加一批论点我还需要提供一个视图端口论点,这不是我想要的…谢谢你的想法。也许我会尝试实现一个阶段和多个阶段,看看哪一个更适合我的游戏。