libgdx ashley框架的讲解

简介: 本文介绍了libgdx游戏开发框架中的Ashley实体系统,包括如何引入依赖、创建实体、添加组件和系统,并通过代码示例演示了如何使用PooledEngine、Component、EntitySystem等核心类来构建游戏逻辑。

官网:https://github.com/libgdx/ashley

我的libgdx学习代码:nanshaws/LibgdxTutorial: libgdx 教程项目 本项目旨在提供完整的libgdx桌面教程,帮助开发者快速掌握libgdx游戏开发框架的使用。成功的将gdx-ai和ashley的tests从官网剥离出来,并成功运行。libgdx tutorial project This project aims to provide a complete libgdx desktop tutorial to help developers quickly master the use of libgdx game development framework. Successfully separated GDX-AI and Ashley's tests from the official website and ran them (github.com)

引入依赖:

allprojects {
    apply plugin: "eclipse"

    version = '1.0'
    ext {
        appName = "My GDX Game"
        gdxVersion = '1.12.1'
        roboVMVersion = '2.3.21'
        box2DLightsVersion = '1.5'
        ashleyVersion = '1.7.4'
        aiVersion = '1.8.2'
        gdxControllersVersion = '2.2.1'
    }

    repositories {
        mavenLocal()
        mavenCentral()
        google()
        gradlePluginPortal()
        maven { url "https://oss.sonatype.org/content/repositories/snapshots/" }
        maven { url "https://oss.sonatype.org/content/repositories/releases/" }
        maven { url "https://jitpack.io" }
    }
}

dependencies {
    implementation "com.badlogicgames.gdx:gdx:$gdxVersion"
    implementation "com.badlogicgames.gdx:gdx-backend-lwjgl:$gdxVersion"
    implementation "com.badlogicgames.gdx:gdx-platform:$gdxVersion:natives-desktop"
    implementation "com.badlogicgames.ashley:ashley:$ashleyVersion"
    testImplementation "junit:junit:4.12"
}

在这个ashley框架中,分为

Component
EntitySystem
PooledEngine
EntityListener

好理解吧。以下我用代码来演示


        PooledEngine engine = new PooledEngine();

        MovementSystem movementSystem = new MovementSystem();
        PositionSystem positionSystem = new PositionSystem();
        engine.addSystem(movementSystem);
        engine.addSystem(positionSystem);
        Listener listener = new Listener();
        engine.addEntityListener(listener);
        Entity entity = engine.createEntity();
        entity.add(new PositionComponent(10, 0));
  1. PooledEngine engine = new PooledEngine();
    这行代码创建了一个 PooledEngine 的实例。PooledEngineEngine 的一个子类,它可以重用实体和组件,从而减少内存分配和垃圾回收,提高性能。

  2. MovementSystem movementSystem = new MovementSystem();
    创建了一个 MovementSystem 的实例,这是一个自定义的系统,用于处理实体的移动逻辑。

  3. PositionSystem positionSystem = new PositionSystem();
    创建了一个 PositionSystem 的实例,这是另一个自定义的系统,用于处理实体的位置更新。

  4. engine.addSystem(movementSystem);
    engine.addSystem(positionSystem);
    这两行代码将 MovementSystemPositionSystem 添加到 PooledEngine 中。这样,当引擎更新时,这些系统也会被更新。

  5. Listener listener = new Listener();
    创建了一个 Listener 的实例,这是一个实体监听器,它会在实体被添加或移除时收到通知。

  6. engine.addEntityListener(listener);
    Listener 添加到 PooledEngine 中,使其成为实体事件的监听器。

  7. Entity entity = engine.createEntity();
    创建了一个新的 Entity 实例。在Ashley中,实体是组件的容器,组件用于存储数据。

  8. entity.add(new PositionComponent(10, 0));
    向刚创建的实体添加了一个 PositionComponent 实例,初始化位置为 (10, 0)。PositionComponent 是一个自定义的组件,用于存储实体的位置信息。

每个人物或者标签都可以称之为实体,比如说一个马里奥游戏,马里奥、乌龟和金币都可以被视为实体。每个实体都可以拥有一组组件,这些组件定义了实体的数据和状态。例如,马里奥可能有位置组件(PositionComponent)、移动组件(MovementComponent)和图形组件(GraphicsComponent)等。

这里的实体就是Entity entity = engine.createEntity(); 实体添加组件就是entity.add(new PositionComponent(10, 0)); 而**PositionSystem就是各个组件合在一起的逻辑原理**

  1. private ComponentMapper<PositionComponent> pm = ComponentMapper.getFor(PositionComponent.class);
    这行代码创建了一个 ComponentMapper 对象,专门用于 PositionComponent 类型的组件。这意味着你可以通过这个映射器快速访问任何实体的 PositionComponent

  2. private ComponentMapper<MovementComponent> mm = ComponentMapper.getFor(MovementComponent.class);
    类似地,这行代码创建了一个 ComponentMapper 对象,专门用于 MovementComponent 类型的组件。这使得你可以快速访问任何实体的 MovementComponent

在MovementSystem里面的两行代码,将每个实体里面的MovementComponent和PositionComponent组件都进行移动。这样的例子在我的libgdx学习代码的

gdx-ashley-tests

里面的RenderSystemTest文件,运行起来会让一百个硬币移动

@Override
        public void update (float deltaTime) {

            for (int i = 0; i < entities.size(); ++i) {
                Entity e = entities.get(i);

                PositionComponent p = pm.get(e);
                MovementComponent m = mm.get(e);

                p.x += m.velocityX * deltaTime;
                p.y += m.velocityY * deltaTime;
            }

            log(entities.size() + " Entities updated in MovementSystem.");
        }

演示一个简单案例吧

MovementComponent
package com.badlogic.ashley.tests.components;

import com.badlogic.ashley.core.Component;

public class MovementComponent implements Component {
    public float velocityX;
    public float velocityY;

    public MovementComponent (float velocityX, float velocityY) {
        this.velocityX = velocityX;
        this.velocityY = velocityY;
    }
}
PositionComponent
package com.badlogic.ashley.tests.components;

import com.badlogic.ashley.core.Component;

public class PositionComponent implements Component {
    public float x, y;

    public PositionComponent (float x, float y) {
        this.x = x;
        this.y = y;
    }
}
MovementSystem
public static class MovementSystem extends EntitySystem {
        public ImmutableArray<Entity> entities;

        private ComponentMapper<PositionComponent> pm = ComponentMapper.getFor(PositionComponent.class);
        private ComponentMapper<MovementComponent> mm = ComponentMapper.getFor(MovementComponent.class);

        @Override
        public void addedToEngine (Engine engine) {
            entities = engine.getEntitiesFor(Family.all(PositionComponent.class, MovementComponent.class).get());
            log("MovementSystem added to engine.");
        }

        @Override
        public void removedFromEngine (Engine engine) {
            log("MovementSystem removed from engine.");
            entities = null;
        }

        @Override
        public void update (float deltaTime) {

            for (int i = 0; i < entities.size(); ++i) {
                Entity e = entities.get(i);

                PositionComponent p = pm.get(e);
                MovementComponent m = mm.get(e);

                p.x += m.velocityX * deltaTime;
                p.y += m.velocityY * deltaTime;
            }

            log(entities.size() + " Entities updated in MovementSystem.");
        }
    }
PositionSystem
public static class PositionSystem extends EntitySystem {
        public ImmutableArray<Entity> entities;

        @Override
        public void addedToEngine (Engine engine) {
            entities = engine.getEntitiesFor(Family.all(PositionComponent.class).get());
            log("PositionSystem added to engine.");
        }

        @Override
        public void removedFromEngine (Engine engine) {
            log("PositionSystem removed from engine.");
            entities = null;
        }
    }
Listener
public static class Listener implements EntityListener {

        @Override
        public void entityAdded (Entity entity) {
            log("Entity added " + entity);
        }

        @Override
        public void entityRemoved (Entity entity) {
            log("Entity removed " + entity);
        }
    }

    public static void log (String string) {
        System.out.println(string);
    }

主类:

public static void main (String[] args) {
        PooledEngine engine = new PooledEngine();

        MovementSystem movementSystem = new MovementSystem();
        PositionSystem positionSystem = new PositionSystem();

        engine.addSystem(movementSystem);
        engine.addSystem(positionSystem);

        Listener listener = new Listener();
        engine.addEntityListener(listener);

        for (int i = 0; i < 10; i++) {
            Entity entity = engine.createEntity();
            entity.add(new PositionComponent(10, 0));
            if (i > 5) entity.add(new MovementComponent(10, 2));

            engine.addEntity(entity);
        }

        log("MovementSystem has: " + movementSystem.entities.size() + " entities.");
        log("PositionSystem has: " + positionSystem.entities.size() + " entities.");

        for (int i = 0; i < 10; i++) {
            engine.update(0.25f);

            if (i > 5) engine.removeSystem(movementSystem);
        }

        engine.removeEntityListener(listener);
    }

具体代码可以看:

nanshaws/LibgdxTutorial: libgdx 教程项目 本项目旨在提供完整的libgdx桌面教程,帮助开发者快速掌握libgdx游戏开发框架的使用。成功的将gdx-ai和ashley的tests从官网剥离出来,并成功运行。libgdx tutorial project This project aims to provide a complete libgdx desktop tutorial to help developers quickly master the use of libgdx game development framework. Successfully separated GDX-AI and Ashley's tests from the official website and ran them (github.com)

目录
相关文章
|
24天前
|
弹性计算 人工智能 架构师
阿里云携手Altair共拓云上工业仿真新机遇
2024年9月12日,「2024 Altair 技术大会杭州站」成功召开,阿里云弹性计算产品运营与生态负责人何川,与Altair中国技术总监赵阳在会上联合发布了最新的“云上CAE一体机”。
阿里云携手Altair共拓云上工业仿真新机遇
|
16天前
|
存储 关系型数据库 分布式数据库
GraphRAG:基于PolarDB+通义千问+LangChain的知识图谱+大模型最佳实践
本文介绍了如何使用PolarDB、通义千问和LangChain搭建GraphRAG系统,结合知识图谱和向量检索提升问答质量。通过实例展示了单独使用向量检索和图检索的局限性,并通过图+向量联合搜索增强了问答准确性。PolarDB支持AGE图引擎和pgvector插件,实现图数据和向量数据的统一存储与检索,提升了RAG系统的性能和效果。
|
4天前
|
JSON 自然语言处理 数据管理
阿里云百炼产品月刊【2024年9月】
阿里云百炼产品月刊【2024年9月】,涵盖本月产品和功能发布、活动,应用实践等内容,帮助您快速了解阿里云百炼产品的最新动态。
阿里云百炼产品月刊【2024年9月】
|
1天前
|
人工智能 Rust Java
10月更文挑战赛火热启动,坚持热爱坚持创作!
开发者社区10月更文挑战,寻找热爱技术内容创作的你,欢迎来创作!
212 11
|
19天前
|
人工智能 IDE 程序员
期盼已久!通义灵码 AI 程序员开启邀测,全流程开发仅用几分钟
在云栖大会上,阿里云云原生应用平台负责人丁宇宣布,「通义灵码」完成全面升级,并正式发布 AI 程序员。
|
21天前
|
机器学习/深度学习 算法 大数据
【BetterBench博士】2024 “华为杯”第二十一届中国研究生数学建模竞赛 选题分析
2024“华为杯”数学建模竞赛,对ABCDEF每个题进行详细的分析,涵盖风电场功率优化、WLAN网络吞吐量、磁性元件损耗建模、地理环境问题、高速公路应急车道启用和X射线脉冲星建模等多领域问题,解析了问题类型、专业和技能的需要。
2578 22
【BetterBench博士】2024 “华为杯”第二十一届中国研究生数学建模竞赛 选题分析
|
3天前
|
存储 人工智能 搜索推荐
数据治理,是时候打破刻板印象了
瓴羊智能数据建设与治理产品Datapin全面升级,可演进扩展的数据架构体系为企业数据治理预留发展空间,推出敏捷版用以解决企业数据量不大但需构建数据的场景问题,基于大模型打造的DataAgent更是为企业用好数据资产提供了便利。
165 2
|
1天前
|
编译器 C#
C#多态概述:通过继承实现的不同对象调用相同的方法,表现出不同的行为
C#多态概述:通过继承实现的不同对象调用相同的方法,表现出不同的行为
101 65
|
20天前
|
机器学习/深度学习 算法 数据可视化
【BetterBench博士】2024年中国研究生数学建模竞赛 C题:数据驱动下磁性元件的磁芯损耗建模 问题分析、数学模型、python 代码
2024年中国研究生数学建模竞赛C题聚焦磁性元件磁芯损耗建模。题目背景介绍了电能变换技术的发展与应用,强调磁性元件在功率变换器中的重要性。磁芯损耗受多种因素影响,现有模型难以精确预测。题目要求通过数据分析建立高精度磁芯损耗模型。具体任务包括励磁波形分类、修正斯坦麦茨方程、分析影响因素、构建预测模型及优化设计条件。涉及数据预处理、特征提取、机器学习及优化算法等技术。适合电气、材料、计算机等多个专业学生参与。
1578 16
【BetterBench博士】2024年中国研究生数学建模竞赛 C题:数据驱动下磁性元件的磁芯损耗建模 问题分析、数学模型、python 代码
|
4天前
|
Linux 虚拟化 开发者
一键将CentOs的yum源更换为国内阿里yum源
一键将CentOs的yum源更换为国内阿里yum源
241 2