Скачать Componency — Minecraft Моды — MetaMods

Componency

Активный

Установок

15

Последнее обновление

1 год назад

Версии

1.8.9 — 1.21
Клиент
Fabric
Forge
Neoforge
Библиотеки

Componency

Библиотека для создания пользовательских интерфейсов, разработанная с нуля для работы в любой среде. Основана на декларативном подходе программирования, что делает процесс создания UI простым и интуитивно понятным.

Вдохновение и концепция

Componency черпает идеи из нескольких проектов:

  • Дизайн Elementa
  • Соглашения об именовании Figma
  • Подход к созданию DSL в Ktor

Эта библиотека объединяет лучшие практики из этих проектов, предлагая удобное решение для построения интерфейсов.

Особенности использования

Библиотека в первую очередь ориентирована на Kotlin, но также поддерживает работу с Java. Все примеры в документации представлены на Kotlin, однако функциональность доступна и для Java-разработчиков.

Настройка проекта

Добавление репозитория

Для Groovy (.gradle):

maven {
    name = "Deftu Snapshots"
    url = "https://maven.deftu.dev/snapshots"
}

Для Kotlin (.gradle.kts):

maven(url = "https://maven.deftu.dev/snapshots") {
    name = "Deftu Snapshots"
}

Добавление зависимости

Для Groovy (.gradle):

modImplementation "dev.deftu:componency:<version>"

Для Kotlin (.gradle.kts):

implementation("dev.deftu:componency:<version>")

Основы работы

Создание движка

Для использования библиотеки необходимо создать движок Componency, который обеспечивает взаимодействие с системой рендеринга:

package com.example

import dev.deftu.componency.engine.Engine
import dev.deftu.componency.engine.InputEngine
import dev.deftu.componency.engine.RenderEngine
import java.awt.Color

class MyEngine : Engine {

    override val inputEngine: InputEngine by lazy {
        MyInputEngine()
    }

    override val renderEngine: RenderEngine by lazy {
        MyRenderEngine()
    }

}

class MyInputEngine : InputEngine {

    override val mouseX: Float = 0f

    override val mouseY: Float = 0f

}

class MyRenderEngine : RenderEngine {

    override val viewportWidth: Int = 0

    override val viewportHeight: Int = 0

    override val animationFps: Int = 144 // Рекомендуется не более 300

    override fun startFrame() {
        // Начало рендеринга кадра (применение трансформаций и т.д.)
    }

    override fun endFrame() {
        // Завершение рендеринга кадра (применение трансформаций и т.д.)
    }

    override fun fill(x1: Float, y1: Float, x2: Float, y2: Float, color: Color, radius: Float) {
        // Заливка прямоугольника цветом с указанным радиусом
    }

}

Создание пользовательского интерфейса

После настройки движка можно приступать к созданию UI:

object Main {

    @JvmStatic
    fun main(args: Array<String>) {
        val engine = MyEngine()
        val ui = MyUI(engine)

        // В цикле рендеринга достаточно вызвать ui.render() для отображения интерфейса
        ui.render() // (Это заглушка для вашего реального цикла рендеринга)
    }

}

class MyUI(engine: Engine) {

    // Обычно в качестве корневого компонента используется фрейм
    private val frame = FrameComponent().configure {
        // В Componency свойства определяются в собственной области видимости при настройке
        // Большинство часто используемых свойств имеют расширения для удобного доступа
        properties {
            width = 100.percent
            height = 100.percent
        }
    }.makeRoot(engine) // Делаем фрейм корневым компонентом UI, передавая ему движок

    private val box = RectangleComponent().configure {
        properties {
            x = 25.percent
            y = 25.percent
            width = 50.percent
            height = 50.percent
            color = Color.RED.asProperty
        }
    }.attachTo(frame) // Добавляем прямоугольник как дочерний элемент фрейма

    // Здесь можно добавить дополнительные компоненты к фрейму или прямоугольнику

    // Предоставляем внешний метод для рендеринга нашего фрейма
    fun render() {
        frame.handleRender()
    }

}

Дополнительные примеры

Для более сложных примеров можно ознакомиться с базовыми примерами в соответствующей директории (Java, Kotlin).

Также доступен пример реализации для LWJGL3.

Использование в Minecraft

Современные версии Minecraft (1.16.5 и выше)

Для использования в современных версиях Minecraft достаточно добавить зависимость в скрипт сборки.

Для Groovy (.gradle):

modImplementation "dev.deftu:componency-minecraft-<minecraft version>-<mod loader>:<version>"

Для Kotlin (.gradle.kts):

implementation("dev.deftu:componency-minecraft-<minecraft version>-<mod loader>:<version>")

Устаревшие версии Minecraft (1.12.2 и 1.8.9)

Для устаревших версий требуется дополнительная настройка с использованием твикера управления зависимостями, который обеспечивает загрузку последней версии библиотеки и принудительное использование LWJGL 3.

Для Groovy (.gradle):

dependencies {
    modImplementation "dev.deftu:componency-minecraft-<minecraft version>-<mod loader>:<version>"
    modImplementation "dev.deftu:componency-minecraft-tweaker-<minecraft version>-<mod loader>:<version>"
}

jar {
    manifest {
        attributes(
            "TweakClass": "dev.deftu.componency.minecraft.tweaker.ComponencyTweaker"
        )
    }
}

Для Kotlin (.gradle.kts):

dependencies {
    implementation("dev.deftu:componency-minecraft-<minecraft version>-<mod loader>:<version>")
    implementation("dev.deftu:componency-minecraft-tweaker-<minecraft version>-<mod loader>:<version>")
}

tasks.jar {
    manifest {
        attributes(
            "TweakClass" to "dev.deftu.componency.minecraft.tweaker.ComponencyTweaker"
        )
    }
}

Благодарности

  • nea89o / HypixelDev - твикер управления зависимостями для Forge 1.8.9 & 1.12.2
  • nextdayy / xtrm / Polyfrost - вдохновение для настройки движка и загрузчик LWJGL 3 для устаревших версий Minecraft

В разработке

  • Отладчик

Проект распространяется под лицензией LGPL-3.0

Участники проекта
deftu

deftu

Разработчик

Создан: 28 авг 2024

ID: 51328