libgdx实现文本居中、libgdx文字居中、GlyphLayout文本居中

news2025/7/17 1:31:14

libgdx实现文本居中、libgdx文字居中、GlyphLayout文本居中

libgdx实现文本居中、libgdx文字居中、GlyphLayout文本居中,环境jdk 17+,2023年11月1日14:20:18最新。
转自:https://lingkang.top/archives/libgdx-shi-xian-wen-ben-ju-zhong

依赖

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>

    <groupId>top.lingkang</groupId>
    <artifactId>yzcy</artifactId>
    <packaging>jar</packaging>
    <version>1.0-SNAPSHOT</version>

    <properties>
        <maven.compiler.source>17</maven.compiler.source>
        <maven.compiler.target>17</maven.compiler.target>
        <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
        <gdx.version>1.12.0</gdx.version>
    </properties>

    <dependencies>
        <!-- https://mvnrepository.com/artifact/com.badlogicgames.gdx/gdx -->
        <dependency>
            <groupId>com.badlogicgames.gdx</groupId>
            <artifactId>gdx</artifactId>
            <version>${gdx.version}</version>
        </dependency>
        <!-- https://mvnrepository.com/artifact/com.badlogicgames.gdx/gdx-backend-lwjgl3 -->
        <dependency>
            <groupId>com.badlogicgames.gdx</groupId>
            <artifactId>gdx-backend-lwjgl3</artifactId>
            <version>${gdx.version}</version>
        </dependency>
        <!-- https://mvnrepository.com/artifact/com.badlogicgames.gdx/gdx-platform -->
        <dependency>
            <groupId>com.badlogicgames.gdx</groupId>
            <artifactId>gdx-platform</artifactId>
            <version>${gdx.version}</version>
            <classifier>natives-desktop</classifier>
        </dependency>
        <!-- https://mvnrepository.com/artifact/com.badlogicgames.gdx/gdx-freetype -->
        <dependency>
            <groupId>com.badlogicgames.gdx</groupId>
            <artifactId>gdx-freetype</artifactId>
            <version>${gdx.version}</version>
        </dependency>
        <!-- https://mvnrepository.com/artifact/com.badlogicgames.gdx/gdx-freetype-platform -->
        <dependency>
            <groupId>com.badlogicgames.gdx</groupId>
            <artifactId>gdx-freetype-platform</artifactId>
            <version>${gdx.version}</version>
            <classifier>natives-desktop</classifier>
        </dependency>

        <dependency>
            <groupId>junit</groupId>
            <artifactId>junit</artifactId>
            <version>4.13.2</version>
        </dependency>

        <!-- https://mvnrepository.com/artifact/org.slf4j/slf4j-api -->
        <dependency>
            <groupId>org.slf4j</groupId>
            <artifactId>slf4j-api</artifactId>
            <version>2.0.9</version>
        </dependency>
        <!-- https://mvnrepository.com/artifact/org.slf4j/slf4j-simple -->
        <dependency>
            <groupId>org.slf4j</groupId>
            <artifactId>slf4j-simple</artifactId>
            <version>2.0.9</version>
        </dependency>
        <!-- https://mvnrepository.com/artifact/org.projectlombok/lombok -->
        <dependency>
            <groupId>org.projectlombok</groupId>
            <artifactId>lombok</artifactId>
            <version>1.18.30</version>
            <scope>provided</scope>
        </dependency>
    </dependencies>

    <build>
        <plugins>
            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-compiler-plugin</artifactId>
                <version>3.8.1</version>
                <configuration>
                    <source>17</source>
                    <target>17</target>
                    <!-- 编译后保持方法形参名称不变 -->
                    <!--<compilerArgs>
                        <arg>-parameters</arg>
                    </compilerArgs>-->
                </configuration>
            </plugin>
        </plugins>
    </build>

    <repositories>
        <repository>
            <id>tencent</id>
            <name>tencent</name>
            <layout>default</layout>
            <url>http://mirrors.cloud.tencent.com/nexus/repository/maven-public/</url>
            <snapshots>
                <enabled>false</enabled>
            </snapshots>
            <releases>
                <enabled>true</enabled>
            </releases>
        </repository>
        <repository>
            <id>nexus</id>
            <name>Nexus</name>
            <layout>default</layout>
            <url>https://s01.oss.sonatype.org/content/repositories/snapshots</url>
            <snapshots>
                <enabled>true</enabled>
            </snapshots>
            <releases>
                <enabled>true</enabled>
            </releases>
        </repository>
        <repository>
            <id>aliyunmaven</id>
            <url>https://maven.aliyun.com/repository/public</url>
            <releases>
                <enabled>true</enabled>
            </releases>
            <snapshots>
                <enabled>false</enabled>
            </snapshots>
        </repository>
    </repositories>
</project>

重写类

package top.lingkang.yzcy.utils;

import com.badlogic.gdx.graphics.Color;
import com.badlogic.gdx.graphics.Pixmap;
import com.badlogic.gdx.graphics.Pixmap.Format;
import com.badlogic.gdx.graphics.Texture;
import com.badlogic.gdx.graphics.g2d.BitmapFont;
import com.badlogic.gdx.graphics.g2d.TextureRegion;
import com.badlogic.gdx.graphics.g2d.freetype.FreeType;
import com.badlogic.gdx.graphics.g2d.freetype.FreeType.Face;
import com.badlogic.gdx.graphics.g2d.freetype.FreeType.SizeMetrics;
import com.badlogic.gdx.graphics.g2d.freetype.FreeTypeFontGenerator;
import com.badlogic.gdx.graphics.g2d.freetype.FreeTypeFontGenerator.FreeTypeBitmapFontData;
import com.badlogic.gdx.graphics.g2d.freetype.FreeTypeFontGenerator.FreeTypeFontParameter;
import com.badlogic.gdx.graphics.g2d.freetype.FreeTypeFontGenerator.GlyphAndBitmap;
import com.badlogic.gdx.utils.GdxRuntimeException;

import java.lang.reflect.Field;

/**
 * 对BitmapFont进行改写,让文字获取直接从字体中获取
 * 调用方式:
 * <pre>
 *     protected BitmapFont bitmapFont; <br/>
 *     //加载 仿宋字体
 *     FreeTypeFontGenerator generator = new FreeTypeFontGenerator(new FileHandle("C:\\Windows\\Fonts\\simfang.ttf"));
 *     <br/> <br/>
 *     bitmapFont = new SmartBitmapFont(generator,50);
 *
 *     <br/>
 *     bitmapFont.draw(batch, "欢迎", 0, 300);// 左下角起点,向上300个高度
 * </pre>
 */
public class SmartBitmapFont extends BitmapFont {

    // 不应该在此对此进行 dispose ,让上层进行 dispose
    private FreeTypeFontGenerator generator;
    private FreeTypeBitmapFontData data;
    private FreeTypeFontParameter parameter;

    public SmartBitmapFont(FreeTypeFontGenerator generator, int fontSize) {
        if (generator == null)
            throw new GdxRuntimeException("lazyBitmapFont global generator must be not null to use this constructor.");
        this.generator = generator;
        FreeTypeFontParameter param = new FreeTypeFontParameter();
        param.size = fontSize;
        this.parameter = param;
        this.data = new LazyBitmapFontData(generator, fontSize, this);
        try {
            Field f = getClass().getSuperclass().getDeclaredField("data");
            f.setAccessible(true);
            f.set(this, data);
        } catch (Exception e) {
            e.printStackTrace();
        }

        genrateData();
    }

    private void genrateData() {
        Face face = null;
        try {
            Field field = generator.getClass().getDeclaredField("face");
            field.setAccessible(true);
            face = (Face) field.get(generator);
        } catch (Exception e) {
            e.printStackTrace();
            return;
        }

        // set general font data
        SizeMetrics fontMetrics = face.getSize().getMetrics();

        // Set space glyph.
        Glyph spaceGlyph = data.getGlyph(' ');
        if (spaceGlyph == null) {
            spaceGlyph = new Glyph();
            spaceGlyph.xadvance = (int) data.scaleX;//spaceWidth
            spaceGlyph.id = (int) ' ';
            data.setGlyph(' ', spaceGlyph);
        }
        if (spaceGlyph.width == 0)
            spaceGlyph.width = (int) (spaceGlyph.xadvance + data.padRight);

        // set general font data
        data.flipped = parameter.flip;
        data.ascent = FreeType.toInt(fontMetrics.getAscender());
        data.descent = FreeType.toInt(fontMetrics.getDescender());
        data.lineHeight = FreeType.toInt(fontMetrics.getHeight());

        // determine x-height
        for (char xChar : data.xChars) {
            if (!face.loadChar(xChar, FreeType.FT_LOAD_DEFAULT))
                continue;
            data.xHeight = FreeType.toInt(face.getGlyph().getMetrics().getHeight());
            break;
        }
        if (data.xHeight == 0)
            throw new GdxRuntimeException("No x-height character found in font");
        for (char capChar : data.capChars) {
            if (!face.loadChar(capChar, FreeType.FT_LOAD_DEFAULT))
                continue;
            data.capHeight = FreeType.toInt(face.getGlyph().getMetrics().getHeight());
            break;
        }

        // determine cap height
        if (data.capHeight == 1)
            throw new GdxRuntimeException("No cap character found in font");
        data.ascent = data.ascent - data.capHeight;
        data.down = -data.lineHeight;
        if (parameter.flip) {
            data.ascent = -data.ascent;
            data.down = -data.down;
        }

    }

    @Override
    public void dispose() {
        setOwnsTexture(true);
        super.dispose();
        data.dispose();
    }

    class LazyBitmapFontData extends FreeTypeBitmapFontData {

        private FreeTypeFontGenerator generator;
        private int fontSize;
        private SmartBitmapFont font;
        private int page = 1;

        public LazyBitmapFontData(FreeTypeFontGenerator generator, int fontSize, SmartBitmapFont lbf) {
            this.generator = generator;
            this.fontSize = fontSize;
            this.font = lbf;
        }

        public Glyph getGlyph(char ch) {
            Glyph glyph = super.getGlyph(ch);
            if (glyph == null)
                glyph = generateGlyph(ch);
            return glyph;
        }

        protected Glyph generateGlyph(char ch) {
            GlyphAndBitmap gab = generator.generateGlyphAndBitmap(ch, fontSize, false);
            if (gab == null || gab.bitmap == null)// 未找到文字字符: ch
                return null;

            Pixmap map = gab.bitmap.getPixmap(Format.RGBA8888, Color.WHITE, 9);
            TextureRegion rg = new TextureRegion(new Texture(map));
            map.dispose();

            font.getRegions().add(rg);

            gab.glyph.page = page++;
            super.setGlyph(ch, gab.glyph);
            setGlyphRegion(gab.glyph, rg);
            return gab.glyph;
        }
    }
}

文字居中

import com.badlogic.gdx.ApplicationAdapter;
import com.badlogic.gdx.Gdx;
import com.badlogic.gdx.backends.lwjgl3.Lwjgl3Application;
import com.badlogic.gdx.backends.lwjgl3.Lwjgl3ApplicationConfiguration;
import com.badlogic.gdx.files.FileHandle;
import com.badlogic.gdx.graphics.Color;
import com.badlogic.gdx.graphics.g2d.BitmapFont;
import com.badlogic.gdx.graphics.g2d.GlyphLayout;
import com.badlogic.gdx.graphics.g2d.SpriteBatch;
import com.badlogic.gdx.graphics.g2d.freetype.FreeTypeFontGenerator;
import com.badlogic.gdx.utils.Align;
import org.junit.Test;
import top.lingkang.yzcy.utils.SmartBitmapFont;

/**
 * @author lingkang
 * created by 2023/11/1
 */
public class TestTxtCenter extends ApplicationAdapter {
    @Test
    public void test() {
        Lwjgl3ApplicationConfiguration config = new Lwjgl3ApplicationConfiguration();
        config.setForegroundFPS(30);
        config.setTitle("yzcy");
        config.setWindowedMode(800, 600);
        new Lwjgl3Application(this, config);
    }

    protected SpriteBatch batch;
    protected BitmapFont bitmapFont;
    GlyphLayout layout = new GlyphLayout();
    //加载 仿宋字体
    FreeTypeFontGenerator generator = new FreeTypeFontGenerator(new FileHandle("C:\\Windows\\Fonts\\simfang.ttf"));

    @Override
    public void create() {
        bitmapFont = new SmartBitmapFont(generator, 50);
        batch = new SpriteBatch();

        // 居中
        layout.setText(bitmapFont, "欢迎", Color.WHITE, Gdx.graphics.getWidth(), Align.center, true);
    }

    @Override
    public void render() {
        batch.begin();
        bitmapFont.draw(batch, layout, 0, 300);// 左下角起点,向上300个高度
        batch.end();
    }

    @Override
    public void dispose() {
        batch.dispose();
        bitmapFont.dispose();
        generator.dispose();
    }
}

效果

在这里插入图片描述

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1158160.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

数据结构详细笔记——二叉树

文章目录 二叉树的定义和基本术语特殊的二叉树满二叉树完全二叉树二叉排序树平衡二叉树 二叉树的常考性质完全二叉树的常考性质二叉树的存储结构顺序存储链式存储 二叉树的先中后序遍历先序遍历&#xff08;空间复杂度&#xff1a;O&#xff08;h&#xff09;&#xff09;中序遍…

家政APP开发服务同城预约维修接单管理系统软件小程序

家政服务小程序是一个基于移动端的家政服务平台&#xff0c;为用户提供方便快捷的家政服务。以下是小程序的主要功能&#xff1a; 1. 家政服务内容展示&#xff1a;商家可以在小程序中展示各种家政服务项目&#xff0c;如清洁、保洁、保姆、月嫂、钟点工等。用户可以浏览服务信…

Android开发知识学习——从Retrofit原理来看HTTP

文章目录 Retrofit 使用方法简介Retrofit 源码结构总结扔物线读源码的思路与方式 Retrofit 使用方法简介 导包 implementation com.squareup.retrofit2:retrofit:最新版本创建一个 interface 作为 Web Service 的请求集合&#xff0c;在里面用注解 &#xff08;Annotation&…

Unity Shader Graph HDRP Reflections Cubemap

主贴图 与 反射 过渡 可调节 因为shader graph 版本原因&#xff0c;略微跟教程不太一样 教程链接&#xff1a; https://www.youtube.com/watch?v943P0dGR4rQ

uniapp leven系列原生插件(1)

目录 1.乐橙摄像机播放插件(云台对讲版) 插件介绍 插件地址 预览图片 ​编辑 2.乐橙摄像机播放插件(子账号云台对讲版) 插件介绍 插件地址 预览图片 ​编辑 3.无预览静默拍照 插件介绍 插件地址 预览图片 4.视频图片选择安卓原生插件 插件介绍 插件地址 预览图…

抖音双11好物节抢跑,这5家品牌联动巨量引擎解锁新增量

截止10月23日&#xff0c;抖音商城整体GMV对比去年同期提升200%。HBN、蓝月亮、万益蓝WONDERLAB、海尔、海澜之家等商家在抖音双11好物节&#xff0c;通过巨量引擎实现提前拓量&#xff0c;效果出众。 其中&#xff0c;HBN在抖音双11好物节抢跑期&#xff0c;通过TopLive直播加…

打造教育新高地 | 拓世法宝AI智能直播一体机,教育界的不二之选

教育是社会进步和个人成长的基石&#xff0c;它不仅是知识传授的载体&#xff0c;更是塑造未来社会精英的摇篮。近年来&#xff0c;数字化、智能化以及个性化教育模式成为当下教育改革的关键词&#xff0c;它不断引领着人类文明的发展&#xff0c;开启着每个人成长的无限可能。…

VS2017制作安装包如何将整个文件夹添加进依赖项中

找到安装项目右键view-文件系统 找到Application Folder 右键Add-Folder 如Python38 选中创建的 Python38 在右侧的空白处粘贴要复制的文件即可。文件多&#xff0c;等待时间较长

铜排载流量表新垂直拼接表-分享一张铜排的载流量表可以方便查看铜排重量计算

可以方便的铜排重量的铜排载流量表来了&#xff0c;方便查询和选择&#xff0c;希望能够帮到你&#xff1a; 下载&#xff1a;https://download.csdn.net/download/weixin_43097956/88490649

正点原子嵌入式linux驱动开发——Linux USB驱动

USB是很常用的接口&#xff0c;目前大多数的设备都是USB接口的&#xff0c;比如鼠标、键盘、USB摄像 头等&#xff0c;在实际开发中也常常遇到USB接口的设备&#xff0c;本章就来学习一下如何使能Linux内核自带的USB驱动。这里不会具体学习USB的驱动开发。 USB接口简介 什么是…

CSS内容过多保留固定字数并显示省略号

一、业务场景&#xff1a; 详情内容过多时&#xff0c;会使布局错乱&#xff0c;需要保留固定的字数&#xff0c;鼠标划上显示出全部内容 三、具体实现步骤&#xff1a; <a-tooltip><template slot"title">{{lastChe}}</template><span class…

详解Java经典数据结构——HashMap

Java 的 HashMap 是一个常用的基于哈希表的数据结构&#xff0c;它实现了 Map 接口&#xff0c;可以存储键值对。下面我们进行详细介绍&#xff1a; 基本结构&#xff1a;HashMap 底层是基于哈希表来实现的&#xff0c;每次插入一个键值对时&#xff0c;会先对该键进行 Hash 运…

微信小程序导入js使用时候报错

我是引入weapp库时候&#xff0c;导入js会报错。 需要在小程序开发工具里面配置 就可以了。

视频剪辑小技巧:批量调整视频色调,让你的视频更出色

在视频剪辑过程中&#xff0c;批量调整视频色调是一项非常重要的技巧。通过调整视频色调&#xff0c;你可以让视频更加生动、富有表现力&#xff0c;并创造出独特的视觉效果。本文将介绍云炫AI智剪的批量调整视频色调小技巧&#xff0c;帮助你提升视频品质。以下是具体的操作步…

在 Typescript 项目中使用 cdn 加载的js插件没有类型声明

先上一段同事写得代码, 此处动态的插入了 MathJax 这个 js 插件, 我不知道为什么如此编写, //ts-ignore 此处不知道为什么如此调用, 只能使用 ts-ignore 忽略dynamicLoadingJs("//xxx.com/latex/MathJax.js?configTeX-AMS_HTML", () > {MathJax.Hub.Config({exte…

2023-11-01 LeetCode每日一题(参加会议的最多员工数)

2023-11-01每日一题 一、题目编号 2127. 参加会议的最多员工数二、题目链接 点击跳转到题目位置 三、题目描述 一个公司准备组织一场会议&#xff0c;邀请名单上有 n 位员工。公司准备了一张 圆形 的桌子&#xff0c;可以坐下 任意数目 的员工。 员工编号为 0 到 n - 1 。…

高浓度工业废水处理设备有哪些

高浓度工业废水处理设备主要有以下几种&#xff1a; 水解酸化池&#xff1a;将有机废水通过水解、酸化作用&#xff0c;使其成为更易于生化降解的有机物。厌氧池&#xff1a;通过厌氧反应降解有机废水&#xff0c;产生沼气等可再利用资源。好氧池&#xff1a;将经过水解酸化或…

TikTok趋势分析:社交媒体的下一个风向标

社交媒体一直是信息传播和娱乐的前沿阵地&#xff0c;而TikTok&#xff08;抖音&#xff09;已然成为这一领域的新宠。其独特的短视频内容和强大的算法推荐系统吸引了数十亿用户&#xff0c;不仅改变了用户的娱乐习惯&#xff0c;还重新定义了社交媒体的面貌。本文将深入探讨Ti…

如何实现精确IP地址定位:技术和隐私的平衡

精确的IP地址定位可以为各种应用提供重要的信息&#xff0c;从网络安全到市场分析。然而&#xff0c;这一过程涉及到技术、法律和伦理等多方面的问题。本文将探讨如何实现精确IP地址定位&#xff0c;并同时平衡技术与隐私之间的挑战。 IP地址定位的背景 1. IP地址的基本概念 …

JAVA 实现PDF转图片(pdfbox版)

依赖&#xff1a; pdf存放路径 正文开始&#xff1a; pdf转换多张图片、长图 Test void pdf2Image() {String dstImgFolder "";String PdfFilePath "";String relativelyPathSystem.getProperty("user.dir");PdfFilePath relativelyPath &qu…