FXGL如何设置窗口透明

正好过年休息,想说学习一下游戏引擎,以后能给自己圆一个游戏梦😂,本身java比较熟,选来选去最后选了fxgl作为入门的第一站

背景介绍

fxgl是一个基于javafx的简易游戏引擎,简单理解就是javafx的超集,而javafx简单解释就是javaSwing的封装,所以fxgl对于java开发者而言还是比较友好,虽然简易但是基本上游戏引擎该有的它也都有。这次主要是想实现桌面右下角的动画效果,乍一看,还是很简单,无非就是使用帧动画进行处理,然后把窗口进行透明就可以了

场景还原

fxgl的使用我就不多介绍了,主要就是继承GameApplication,重写GameApplication中自己需要的方法即可,以下是一个简单的使用方式

java 复制代码
public class FXGLApplication extends GameApplication {

    @Override
    protected void initSettings(GameSettings settings)
    {
    }



    @Override
    protected void initGame() {

    }

    public static void main(String[] args) {
        launch(args);
    }
}

既然要实现动画效果,肯定需要一个帧动画图片,这里我就在网上随便找了一张

然后实现EntityFactory,注册entity,将帧动画的图片导入

java 复制代码
public class GameEntityFactory implements EntityFactory {

    @Spawns("petBody")
    public Entity petBody(SpawnData spawnData){
        //创建帧
        AnimationChannel ac = new AnimationChannel(FXGL.image("loongo.png"),6,1024/7
                ,512/3, Duration.seconds(1.2),0,5);
        // 将帧导入到帧动画资源中
        AnimatedTexture animatedTexture = new AnimatedTexture(ac);
        // 设置动画播放的方式
        animatedTexture.loop();
        // 创建fxgl中的entity
        return FXGL.entityBuilder(spawnData)
                .view(animatedTexture)
                .build();
    }
}

最后将注册的entity放置到场景中

java 复制代码
    @Override
    protected void initGame() {
        FXGL.getGameWorld().addEntityFactory(new GameEntityFactory());
        // 将entity放置到场景中
        FXGL.spawn("petBody",new SpawnData(100,100));
    }

这里简单说明一下,fxgl会在开始时搭建好默认的场景,我们需要做的就是按需求定制好场景,以及将一个个entity放置到场景中,如下图

完成了场景的搭建,也将需要的动画实体放置到场景中,就差透明就基本上结束了,而网上几乎所有的资料对背景的修改都是调用的FXGL.getGameScene().setBackgroundColor()方法,我也照猫画虎,先改成红色试试效果

java 复制代码
    @Override
    protected void initGame() {
        FXGL.getGameScene().setBackgroundColor(Color.RED);
        FXGL.getGameWorld().addEntityFactory(new GameEntityFactory());
        FXGL.spawn("petBody",new SpawnData(100,100));
    }

确实也没什么问题,改成透明也简单,就是将color设置成TRANSPARENT即可,当我信心满满的调用时,却发现窗口竟然变回默认的白色了

解决方案

网上查了一堆的资料,以及去github上寻找,确实都没有找到对应的回答。但是虽然fxgl可能没有提供api,但是他是毕竟是基于javafx的,所以他底层调用的肯定还是javafx。而javafx如何设置透明,简单来说就是设置stage透明,再设置scene透明即可,想必fxgl也是如此。

打开MainWindow类,里你会发现一个内部类PrimaryStageWindow,包含了stage,scene,有兴趣的朋友可以自己debug看一下,fxgl启动时就是创建了一个stage和一个scene来进行场景的搭建,布局使用的是pane。

那看来只要把mainwindow拿到,重新将里面的stage和scene设置成透明应该就可以了。但事实上我们是拿不到当前的mainwindow的,但是我们可以拿到当前的scene

java 复制代码
    @Override
    protected void initGame() {
        // 获取应用对象
        com.almasb.fxgl.app.FXGLApplication.GameApplicationService windowService = FXGL.getWindowService();
        //获取当前的scene,该scene是fxgl的scene对象,不是底层的javafx的scene对象
        Scene currentScene = windowService.getCurrentScene();
        //获得根布局
        Pane root = currentScene.getRoot();
        //获得场景的scene,并设置未透明
        root.getScene().setFill(Color.TRANSPARENT);
        FXGL.getGameWorld().addEntityFactory(new GameEntityFactory());
        FXGL.spawn("petBody",new SpawnData(100,100));
    }

当然这样还是不行,设置了scene为透明还需要设置stage舞台为透明才行

java 复制代码
    @Override
    protected void initSettings(GameSettings settings)
    {
        // 设置舞台透明
        settings.setStageStyle(StageStyle.TRANSPARENT);
    }

再次执行,bingo窗口终于透明了

总结

简单来说,fxgl还是基于javafx进行场景的搭建,也是通过创建stage再在stage上添加布局比如pane,然后再设置对应的组件比如scene,所以我们需要对整体场景做处理的时候,也需要对stage,scene进行同步的处理,才能真正的实现效果

相关推荐
xiaohaiAIgeo14 小时前
【2026年】HG/T 20656-2024化工暖通空调设计规范:新版标准的变化与影响
java·前端·javascript·科普知识
weixin_4316004414 小时前
NestJS 入门(7):生命周期钩子——构造函数和 `OnModuleInit` 差在哪?
前端·后端·学习·node.js·nest.js
小强库计算机毕业设计14 小时前
基于 Spring Boot + Vue3 的校园管理系统
java·spring boot·后端·项目实战·管理系统·技术分享·校园管理系统实战
霸道流氓气质15 小时前
Java中信号量(Semaphore):从本地到分布式
java·开发语言·分布式
怪奇云呼军15 小时前
G.711、Opus 和重采样会拖慢识别吗?闪电智能VoiceAgent 的音频入口怎么选
java·人工智能·python·算法·云计算·音视频
编程令我快乐15 小时前
maven部分构建参数讲解
java·maven
ZC跨境爬虫15 小时前
LeetCode 27. 移除元素(双指针详解 + Java Python 多解法对比)
java·python·leetcode
canonical_entropy15 小时前
关于《Mission Driver:Loop Engineering 的一种通用参考实现》的补充说明
后端·agent·ai编程
__zRainy__15 小时前
Node系列 · Node基础:Node.js 概述
后端·node.js
kisbad16 小时前
Day 036|OpenAI Agents SDK 快速开始:今天跑通第一个 Agent
java·前端·javascript