[JAVA] Wie erstelle ich einen MOD für Slay the Spire?

Ich möchte es genießen, MODs für Slay the Spire zu machen

Verstehen

Deshalb ist es ein Kurs, wie man einen MOD für Slay the Spire macht.

BaseMod-Wiki in Git https://github.com/daviscook477/BaseMod/wiki/Getting-Started-(For-Modders)

Mod Liste im Wiki in Mod The Spire's Git https://github.com/kiooeht/ModTheSpire/wiki/List-of-Known-Mods

Einführung in Slay the Spire Mod Development https://qiita.com/kojim/items/0c7164c78a5a909b4478 https://qiita.com/kojim/items/1a97f200fc8e545cee13 https://qiita.com/kojim/items/f61d9f3553e2d045aa2e

Sie können dies tun, indem Sie sich das Obige ansehen. Danke an meine Vorfahren.

Ich werde "Erste Schritte mit Modding Slay The Spire" im BaseMod-Wiki erklären, da dies die Anzahl der Personen, die es erstellen, nicht erhöht. Der Anfang ist der Aufbau der Entwicklungsumgebung. Wenn Sie jedoch eine Java-Entwicklungsumgebung haben, lesen Sie diese bitte diagonal. Erstens ist dieser Artikel für Super-Anfänger.

Entwicklungsumgebung

Zunächst werden Sie aufgefordert, einen Ordner zu erstellen. Sie können überall hingehen, aber bitte erstellen Sie einen Ordner. MOD In einem Ordner mit dem Namen werde ich viel machen (wie my_mods). Es wird also gesagt, dass Sie einen Ordner namens "lib" darin erstellen können, also erstellen Sie ihn. Legen Sie dort BaseMod.jar und ModTheSpire.jar ab.

BaseMod.jar https://github.com/daviscook477/BaseMod/releases ModTheSpire.jar https://github.com/kiooeht/ModTheSpire/releases

BaseMod ist die Mod-API und Mod The Spire ist erforderlich, um Slay the Spire mit MOD auszuführen. Nun, beide werden benötigt. Ja. Oh, du kannst auch von Steam Workshop aus teilnehmen. Lassen Sie es uns einfügen.

Suchen Sie dann im selben Ordner desktop-1.0.jar im Ordner Slay the Spire und legen Sie ihn dort ab.

Wählen Sie nun in Bezug auf den Punkt "Umgebungseinrichtung" die gewünschte aus, da es sich um eine Entwicklungsumgebung handelt. Es wurde geschrieben, dass es einfach war, also habe ich es mit Intel iJ gemacht, und ich werde es erst danach erklären. Installieren Sie also zuerst Java SE Development Kit 8 und dann Intel iJ.

Wenn Sie Intel iJ mit starten, erstellen Sie bitte Neues Projekt erstellen. Wählen Sie JDK1.8 und Maven Weiter. GroupID und ArtifactId sollten der Name des Mods sein, den Sie erstellen möchten. Das Beispiel ist ExampleMod. Beenden Sie den Vorgang, damit die Projektdatei in dem zuvor erstellten Ordner erstellt wird.

Nun, dann ist plötzlich etwas Wichtiges darin geschrieben, aber ich denke, dass sich pom.xml direkt unter dem Projektordner befindet, also bearbeiten Sie es.

Example Mod pom.xml https://gist.github.com/alexdriedger/fb74397086ee80073417f19d6305bb05

Hier werden die Speicherorte der drei JAR-Dateien, die Sie in den lib-Ordner gestellt haben, und ihre Versionen angegeben. Seien Sie vorsichtig, wenn sich die Verzeichnisstruktur vom Beispiel unterscheidet.

Ich denke auch, dass es notwendig war, das Paket aus der 54. Zeile hier teilweise zu bearbeiten. Bitte schreiben Sie es, da es das Ausgabeziel nach dem Erstellen ist.

Wenn Sie mit der Bearbeitung des POM fertig sind, wird ein Popup mit der Meldung "Maven-Projekte müssen importiert werden" angezeigt. Drücken Sie daher auf "Änderungen importieren", um dies widerzuspiegeln. Drücken Sie dann Strg + Alt + Umschalt + S, um den Strukturbildschirm aufzurufen, wählen Sie Module und es gibt 3 Mavens. Überprüfen Sie dies und klicken Sie auf Übernehmen.

Wenn Sie nun in dem von "Ansicht> Tool Windows> Maven-Projekte" geöffneten Fenster auf "Lebenszyklus> Paket" doppelklicken, können Sie es erstellen und eine JAR-Datei im Zielordner erstellen.

Lassen Sie uns unser Bestes geben, bis wir einen geeigneten Charakter gefunden haben

Farbe und Karte hinzufügen

Die Charakterklasse von Slay the Spire heißt COLOR, Iron Clad ist RED, Silent ist GREEN und Defect ist BLUE. Wenn Sie einen neuen Charakter erstellen möchten, müssen Sie zuerst diese FARBE hinzufügen (obwohl es einfacher wäre, wenn Sie nur eine zusätzliche Karte für diese Typen einsetzen).

Custom Colors https://github.com/daviscook477/BaseMod/wiki/Custom-Colors

Es ist schwierig, so viel zu lesen und zu verstehen, deshalb werde ich es von nun an selbst erklären. Lass uns eins nach dem anderen gehen. Fügen Sie zuerst Farben und Karten hinzu. Ich bin nicht sicher, ob es nur in Farbe hinzugefügt wurde, so dass ich Karten sofort hinzufügen kann.

Es ist auch ärgerlich zu erklären. Wenn Sie also nicht gut verstehen, lesen Sie bitte das folgende Repository. Es ist mühsam, ein Bild vorzubereiten. Beginnen Sie also bitte hier. https://github.com/levelnineteen/stsmod

Zum Zeitpunkt der Erstellung des Projekts denke ich, dass es so strukturiert ist, aber die Klasse (Programmteil) wird unter Java platziert und der Text und die Bilder werden unter Ressource platziert.

examle_mod +.idea +src -+main --+java --+resource

Erstellen Sie zunächst ein Verzeichnis mit dem Mod-Namen unter Java und ein Verzeichnis mit dem Namen Patches darunter und erstellen Sie die folgenden zwei Klassen.

examle_mod +.idea +src -+main --+java ---+example_mod ----+patches --+resource

AbstractCardEnum.java


package example_mod.patches; //Ich denke, es wird hier automatisch eingegeben

import com.evacipated.cardcrawl.modthespire.lib.SpireEnum;
import com.megacrit.cardcrawl.cards.AbstractCard;

public class AbstractCardEnum {

    @SpireEnum
    public static AbstractCard.CardColor EXAMPLE_COLOR; //Name der Lieblingsvariablen. Ich werde es für immer benutzen.

}

LibraryTypeEnum.java


package example_mod.patches; //Ich denke, es wird hier automatisch eingegeben

import com.evacipated.cardcrawl.modthespire.lib.SpireEnum;
import com.megacrit.cardcrawl.helpers.CardLibrary;

public class LibraryTypeEnum {

    @SpireEnum
    public static CardLibrary.LibraryType EXAMPLE_COLOR; //Das gleiche wie oben. Ich werde es für immer benutzen.

}

Nachdem wir vorbereitet haben, erstellen Sie die Klasse Main.java oder MOD name.java direkt unter java / example_mod, damit sie leicht zu verstehen ist.

Main.java


import basemod.BaseMod;
import basemod.interfaces.*;
import com.evacipated.cardcrawl.modthespire.lib.SpireInitializer;
import com.megacrit.cardcrawl.core.Settings;
import com.badlogic.gdx.graphics.Color;
import com.badlogic.gdx.graphics.Texture;
import com.megacrit.cardcrawl.helpers.CardHelper;
import com.megacrit.cardcrawl.localization.CardStrings;
import com.megacrit.cardcrawl.localization.CharacterStrings;

import example_mod.patches.*; //Ich werde den Patch lesen, den ich zuvor gemacht habe

@SpireInitializer
public class Main implements
        EditCardsSubscriber,   //Implementieren Sie beim Hinzufügen einer Karte
        EditStringsSubscriber,  //Implementieren Sie beim Lesen einer Sprachdatei
{
    //Erstens gibt es Variablen für grundlegende Farbeinstellungen.
    private static final Color EXAMPLE_COLOR_BG = CardHelper.getColor(100.0f, 50.0f, 50.0f); //Dies ist die Hintergrundfarbe der Leiste, wenn sie in der Kartenlistenauswahl angezeigt wird.
    private static final String ATTACK_EXAMPLE         = "img/cards/bg_attack_512.png "; //Dieser Bereich wird später erklärt
    private static final String SKILL_EXAMPLE          = "img/cards/bg_skill_512.png "; //Bitte schreiben Sie vorerst den Variablennamen
    private static final String POWER_EXAMPLE           = "img/cards/bg_power_512.png ";
    private static final String ENERGY_ORB_EXAMPLE         = "img/cards/orb_512.png ";
    private static final String ATTACK_PORT_EXAMPLE        = "img/cards/bg_attack_1024.png ";
    private static final String SKILL_PORT_EXAMPLE         = "img/cards/bg_skill_1024.png ";
    private static final String POWER_PORT_EXAMPLE         = "img/cards/bg_power_1024.png ";
    private static final String ENERGY_ORB_PORT_EXAMPLE = "img/cards/orb_1024.png ";
    private static final String ENERGY_ORB_CARD_EXAMPLE = "img/cards/orb_ui.png ";

    public Main(){
        BaseMod.subscribe(this);
        BaseMod.addColor(
                //Es ist ein Farbzusatzteil. Geben Sie einfach die oben festgelegten Variablen ein.
                AbstractCardEnum.EXAMPLE_COLOR    //color
                , EXAMPLE_COLOR_BG //bgColor
                , EXAMPLE_COLOR_BG//backColor
                , EXAMPLE_COLOR_BG//frameColor
                , EXAMPLE_COLOR_BG//frameOutlineColor
                , EXAMPLE_COLOR_BG//descBoxColor
                , EXAMPLE_COLOR_BG //trailVfColor
                , EXAMPLE_COLOR_BG//glowColor
                , ATTACK_EXAMPLE//attackBg
                , SKILL_EXAMPLE//skillBg
                , POWER_EXAMPLE//powerBG
                , ENERGY_ORB_EXAMPLE//energyOrb
                , ATTACK_PORT_EXAMPLE//attackBgPortrait
                , SKILL_PORT_EXAMPLE//skillBgPortrait
                , POWER_PORT_EXAMPLE//powerBgPortrait
                , ENERGY_ORB_PORT_EXAMPLE//energyOrbPortrait
                , ENERGY_ORB_CARD_EXAMPLE//CardEnergyOrb
        );
    }

    public static void initialize() {
        Main main = new Main();
    }

    @Override
    public void receiveEditStrings() {
        //Sprachdateien werden später erklärt.
        BaseMod.loadCustomStringsFile(CardStrings.class, "localization/cards-" + Settings.language + ".json");
    }

    @Override
    public void receiveEditCards() {
        //Dies ist der Kartenzusatzteil. Dies wird auch später erklärt.
        BaseMod.addCard(new example_mod.cards.TestAttack());
    }
}

Ich habe noch etwas zu schreiben. Weil ich den Inhalt der wesentlichen Karte schreiben muss. Bereiten Sie ein Verzeichnis mit dem Namen Karten direkt unter java / example_mod vor und fügen Sie die folgenden Klassen ein.

TestAttack.java


package example_mod.cards; //Na hier sollte automatisch eintreten

import basemod.abstracts.CustomCard;
import com.megacrit.cardcrawl.actions.AbstractGameAction;
import com.megacrit.cardcrawl.cards.AbstractCard;
import com.megacrit.cardcrawl.cards.DamageInfo;
import com.megacrit.cardcrawl.characters.AbstractPlayer;
import com.megacrit.cardcrawl.core.CardCrawlGame;
import com.megacrit.cardcrawl.dungeons.AbstractDungeon;
import com.megacrit.cardcrawl.localization.CardStrings;
import com.megacrit.cardcrawl.monsters.AbstractMonster;
import example_mod.patches.AbstractCardEnum; //Die Kartenfarbe kann nur verarbeitet werden, wenn diese importiert wird

public class TestAttack extends CustomCard {
    public static final String ID = "examplemod:TestAttack"; //Machen Sie keinen Fehler, da dies die Referenz-ID der Sprachdatei ist.
    private static CardStrings cardStrings = CardCrawlGame.languagePack.getCardStrings(ID);
    public static final String NAME = cardStrings.NAME;
    public static final String DESCRIPTION = cardStrings.DESCRIPTION;
    public static final String IMG_PATH = "img/cards/card.png "; //Es ist ein Bild der Karte. Ich werde es später erklären.
    private static final int COST = 0; //Energiekosten
    private static final int ATTACK_DMG = 4; //Beschädigung
    private static final int UPGRADE_PLUS_DMG = 3; //Schaden beim Upgrade

    public TestAttack() {
        super(ID, NAME, IMG_PATH, COST, DESCRIPTION,
                CardType.ATTACK, //Speicherkarten-Typ
                AbstractCardEnum.EXAMPLE_COLOR, //Die Kartenfarbvariable, die ich seit einiger Zeit verwende. Mach keinen Fehler
                CardRarity.COMMON,   //Kartenrarität
                CardTarget.ENEMY //Wer ist das Ziel?
        );
        this.damage=this.baseDamage = ATTACK_DMG;
    }

    @Override
    public void use(AbstractPlayer p, AbstractMonster m) {
        //Schaden verursachen
        AbstractDungeon.actionManager.addToBottom(
                new com.megacrit.cardcrawl.actions.common.DamageAction(
                        m,
                        new DamageInfo(p, this.damage, this.damageTypeForTurn),
                        AbstractGameAction.AttackEffect.SLASH_DIAGONAL) //Bildschirmeffekt
        );
    }

    @Override
    public AbstractCard makeCopy() {
        return new TestAttack();
    }

    //Verarbeitung zum Zeitpunkt des Karten-Upgrades
    @Override
    public void upgrade() {
        if (!this.upgraded) {
            upgradeName();
            upgradeDamage(UPGRADE_PLUS_DMG);
        }
    }
}

Ja, danke für deine harte Arbeit. Es gibt viele Dinge zu tun, indem Sie einfach einen neuen Kartentyp hinzufügen. Es gibt noch.

examle_mod +.idea +src -+main --+java ---Main.java ---+example_mod ----+cards -----TestAttack.java ----+paches -----LibraryTypeEnum.java -----AbstractCardEnum.java --+resource

Jetzt müssen wir die Bild- und Sprachdateien zur Ressource hinzufügen. Erstellen Sie unter Ressource ein IMG / Cards-Verzeichnis und ein Lokalisierungsverzeichnis. Die folgenden Dateien sind in IMG / Karten erforderlich. Alle sind transparente PNG-Dateien.

bg_attack_512.png Hintergrund der Angriffskarte. 512 x 512 bg_skill_512.png Hintergrund der Fertigkeitskarte. 512 x 512 bg_power_512.png Hintergrund der Stromkarte. 512x512 Sie müssen das Band nicht unter dem Kartennamen vorbereiten. orb_512.png Energiekugel. Da es auf eine 512x512-Karte gelegt werden kann, muss es oben links klein gezeichnet werden. bg_attack_1024.png Dieser Bereich sollte von 512 auf 1024x1024 erweitert werden. bg_skill_1024.png bg_power_1024.png orb_1024.png Dieser Typ darf jedoch 512 nicht vergrößern (der Mittelpunkt ist anders). Nun, ich denke, es ist besser, jeden dieser großen zu reduzieren. orb_ui.png Wird angezeigt, wenn es wahrscheinlich in Werkzeugchips verwendet wird. 23x23 card.png Kartendesign. Ursprünglich ist es einfach, mit dem Kartennamen (Kartenklassenname) abzugleichen. Nun, weil es ein Test ist. 250 x 190 card_p.png Eine große Version des Designs. Sie können das oben genannte vergrößern. 500 x 380. Da es automatisch verwendet wird, wird es in keiner Klasse angegeben.

Die folgenden JSON-Dateien sind für die Lokalisierung erforderlich.

cards-JPN.json


{
  "examplemod:TestAttack": { //Mod Kennung:Schreiben Sie mit dem Kartennamen. Ansonsten werde ich es tragen.
  "NAME": "Kartenname",
  "DESCRIPTION": "Eine Beschreibung der Karte.!d!Wenn Sie schreiben, wird der Schadenswert angezeigt, aber bitte überprüfen Sie dort"
   }
}

Nun, es wird in Übersee hergestellt, also machen Sie bitte Karten-ENG.json und bereiten Sie es auf Englisch vor.

Nun, ich habe es vergessen, aber wenn es unten unter Ressourcen keinen json gibt, werden bei der Auswahl von Mod verschiedene Dinge gesagt, also geben Sie ihn bitte ein.

ModTheSpire.json

{
  "modid": "examplemod",
  "name": "examplemod",
  "author_list": ["yourname"],
  "description": "",
  "version": "0.0.1",
  "sts_version": "01-01-2019",  //Welche Version von Slay the Spire sollte höher sein?
  "mts_version": "3.6.0", //Ich denke, es ist eine Geschichte darüber, welche Version von Mod the Spire höher sein sollte, also ist es angemessen
  "dependencies": ["basemod"],
  "update_json": ""
}

Ist Prost auf gute Arbeit. Es sollte jetzt funktionieren.

--+java ---Main.java ---+example_mod ----+cards -----TestAttack.java ----+paches -----LibraryTypeEnum.java -----AbstractCardEnum.java --+resource ---ModTheSpire.json ---+img ----+cards ----- Voller Bilder für Karten ---+localization ----cards-JPN.json ----cards-ENG.json

Wenn Sie in dem von "Ansicht> Tool Windows> Maven-Projekte" geöffneten Fenster auf "Lebenszyklus> Paket" doppelklicken, können Sie es erstellen und haben eine JAR-Datei im Zielordner. Bitte behandeln Sie den Fehler.

Starten Sie den MOD

Erstellen Sie in der Steam-Bibliothek einen Ordner mit dem Namen mods in steamapps \ common \ SlayTheSpire. Setze die zuvor erstellte example_mod.jar und BaseMod.jar in diese Mods ein.

Fügen Sie direkt unter Steamapps \ common \ SlayTheSpire MTS.cmd ein, das sich beim Entpacken von ModTheSpire.zip darin befand. Mac-Leute scheinen .sh zu bevorzugen.

Wenn ich MTS.cmd starte,

image.png

Überprüfen Sie also BaseMod und example_mod, überprüfen Sie Debug und drücken Sie Play. Irgendwie ist example_mod grau und kann nicht ausgewählt werden, da die in ModTheSpire.json angegebene mts_version falsch ist.

Wenn es sicher gestartet wird, wird example_mod zur Kartenbibliothek hinzugefügt, und eine coole Karte wird hinzugefügt. Dies ist bisher erfolgreich. Danke für deine harte Arbeit.

Füge einen Charakter hinzu ... Vorher Relikt oder Macht

Wenn Sie einen Charakter hinzufügen möchten, benötigen Sie ein Starterrelikt, und die Karte benötigt neben den Fähigkeiten auch Kraft. Also lass uns auf einmal gehen. Aus der Hinzufügung von Reliquien. Erstellen Sie ein Reliktverzeichnis unter java / example_mod und erstellen Sie die folgenden Klassen.

TestRelic.java


package example_mod.relics;

import basemod.abstracts.CustomRelic;
import com.megacrit.cardcrawl.helpers.ImageMaster;
import com.megacrit.cardcrawl.relics.AbstractRelic;

//Geben Sie nach Fähigkeit ein
import com.megacrit.cardcrawl.dungeons.AbstractDungeon;
import com.megacrit.cardcrawl.powers.RegenPower;
import com.megacrit.cardcrawl.actions.common.ApplyPowerAction;
import com.megacrit.cardcrawl.actions.common.RelicAboveCreatureAction;

public class TestRelic extends CustomRelic {

    public static final String ID = "examplemod:TestRelic";
    public static final String IMG = "img/relics/TestRelic.png ";
    public static final String OUTLINE_IMG = "img/relics/outline/TestRelic.png ";

    public TestRelic(){
        super(
                ID,
                ImageMaster.loadImage(IMG),
                ImageMaster.loadImage(OUTLINE_IMG),
                RelicTier.STARTER,  //Seltenheit. Hier ist das Starterrelikt
                LandingSound.FLAT
        );
    }

    public String getUpdatedDescription(){
        return DESCRIPTIONS[0];
    }

    @Override
    public AbstractRelic makeCopy(){
        return new TestRelic();
    }

    //Holen Sie sich 5 Spiele zu Beginn des Kampfes
    @Override
    public void onEquip() {
        AbstractDungeon.rareRelicPool.remove("Dead Branch");
    }

    public void atBattleStart() {
        AbstractDungeon.actionManager.addToBottom(
                new RelicAboveCreatureAction(AbstractDungeon.player, this)
        );
        AbstractDungeon.actionManager.addToBottom(
                new ApplyPowerAction(
                        AbstractDungeon.player,
                        AbstractDungeon.player,
                        new RegenPower(AbstractDungeon.player, 5),
                        5
                )
        );
    }
}

Erstellen Sie ein Reliktverzeichnis unter resources / img und bereiten Sie die folgenden Bilddateien vor.

TestRelic.png 128x128 transparent png

Erstellen Sie außerdem ein Gliederungsverzeichnis unter dem Reliktverzeichnis und bereiten Sie die folgenden Bilddateien vor.

TestRelic.png 128x128 transparent png. Der mit dem Bild im obigen Verzeichnis ist weiß gestrichen.

Nachdem Sie nun auch eine Textdatei benötigen, bereiten Sie die folgenden Dateien unter Ressourcen / Lokalisierung vor.

relics-JPN.json


{
  "examplemod:TestRelic": {
    "NAME": "Reliktname",
    "FLAVOR": "Geschmackstext",
    "DESCRIPTIONS": [
      "Erläuterungstext. Beachten Sie, dass es Plural mit S. ist. Wenn Sie eine Variable in die Beschreibung einfügen, zerlegen Sie sie und setzen Sie sie dazwischen"
    ]
  }
}

Da es in Übersee hergestellt wird, machen Sie bitte auch Relikte-ENG.json und bereiten Sie es auf Englisch vor.

Als nächstes fügen Sie Strom hinzu. Die Energie selbst wird hinzugefügt und die Karte, die Energie erhält, wird hinzugefügt. Erstellen Sie ein Powers-Verzeichnis unter example_mod und erstellen Sie die folgenden Klassen.

TestPowerGold.java


package example_mod.powers;

import com.badlogic.gdx.graphics.Texture;
import com.megacrit.cardcrawl.core.AbstractCreature;
import com.megacrit.cardcrawl.core.CardCrawlGame;
import com.megacrit.cardcrawl.powers.AbstractPower;
import com.megacrit.cardcrawl.localization.PowerStrings;

public class TestPowerGold extends AbstractPower {
    public static final String POWER_ID = "examplemod:TestPowerGold";
    private static final PowerStrings powerStrings =
            CardCrawlGame.languagePack.getPowerStrings(POWER_ID);
    public static final String NAME = powerStrings.NAME;
    public static final String[] DESCRIPTIONS = powerStrings.DESCRIPTIONS;

    public TestPowerGold(AbstractCreature owner, int amount) {
        this.name = NAME;
        this.ID = POWER_ID;
        this.owner = owner;
        this.amount = amount;
        this.type = AbstractPower.PowerType.BUFF;
        updateDescription();
        this.img = new Texture("img/powers/TestPower.png ");
    }

    public void updateDescription() {
        this.description = (DESCRIPTIONS[0] + this.amount + DESCRIPTIONS[1]); //So ist die Beschreibung aufgeteilt.
    }
}

Sie benötigen auch eine Textdatei. Bereiten Sie daher die folgenden Dateien unter Ressourcen / Lokalisierung vor.

powers-JPN.json


{
  "examplemod:TestPowerGold": {
    "NAME": "Power Name",
    "DESCRIPTIONS": [
      "Gold am Ende der Schlacht",
      "Erhalten"
      ]
  }
}

Was hier vorbereitet wird, ist ein Modell der Macht. Die spezifische Leistung muss auf die Karte geschrieben werden. Bereiten Sie die folgenden Klassen in example_mod / maps vor.

TestPower.java


package example_mod.cards;

import basemod.abstracts.CustomCard;
import com.megacrit.cardcrawl.actions.common.ApplyPowerAction;
import com.megacrit.cardcrawl.cards.AbstractCard;
import com.megacrit.cardcrawl.characters.AbstractPlayer;
import com.megacrit.cardcrawl.core.CardCrawlGame;
import com.megacrit.cardcrawl.dungeons.AbstractDungeon;
import com.megacrit.cardcrawl.localization.CardStrings;
import com.megacrit.cardcrawl.monsters.AbstractMonster;

import example_mod.patches.AbstractCardEnum;
import example_mod.powers.*; //Der mit der Kraft, die ich früher gemacht habe. Weil es nervt*

import com.megacrit.cardcrawl.rooms.AbstractRoom.RoomPhase;


public class TestPower extends CustomCard {
    public static final String ID = "examplemod:TestPower";
    private static CardStrings cardStrings = CardCrawlGame.languagePack.getCardStrings(ID);
    public static final String NAME = cardStrings.NAME;
    public static final String DESCRIPTION = cardStrings.DESCRIPTION;
    public static final String IMG_PATH = "img/cards/card.png "; //Bild der Karte. Ich werde es vorerst benutzen
    private static final int COST = 0; //Energiekosten
  //Kartenspezifische Variablen
    private static final int GETMONEY = 100;
    private static final int UPGRADE_GETMONEY = 10;

    public TestPower() {
        super(ID, NAME, IMG_PATH, COST, DESCRIPTION,
                CardType.POWER,
                AbstractCardEnum.EXAMPLE_COLOR, //Ich sage es oft, aber der Farbname
                CardRarity.COMMON,   //Seltenheit
                CardTarget.SELF //Das Ziel der Karte. Bei Macht geht es um SELBST
        );
        this.magicNumber = this.baseMagicNumber = GETMONEY;
    }

    @Override
    public void use(AbstractPlayer p, AbstractMonster m) {
        //Die Fähigkeit, am Ende des Kampfes Geld zu bekommen
        if (AbstractDungeon.getCurrRoom().phase == RoomPhase.COMBAT) {
            AbstractDungeon.getCurrRoom().addGoldToRewards(this.magicNumber);
            AbstractDungeon.actionManager.addToBottom(
                    new ApplyPowerAction(
                            p,
                            p,
                            new TestPowerGold(p, this.magicNumber), //Der mit der Kraft, die ich gerade gemacht habe
                            this.magicNumber
                    )
            );
        }
    }

    @Override
    public AbstractCard makeCopy() {
        return new TestPower();
    }

    //Verarbeitung zum Zeitpunkt des Karten-Upgrades
    @Override
    public void upgrade() {
        if (!this.upgraded) {
            this.upgradeName();
            this.upgradeDamage(UPGRADE_GETMONEY);
        }
    }
}

Ich brauche auch ein Power-Icon-Bild. Erstellen Sie ein Powers-Verzeichnis unter resources / img und bereiten Sie die folgenden Bilddateien vor.

TestPower.png 32x32 transparente Datei. Dies ist die einzige Kraft.

--+java ---Main.java ---+example_mod ----+cards -----TestAttack.java -----TestPower.java ----+relics -----TestRelic.java ----+paches -----LibraryTypeEnum.java -----AbstractCardEnum.java ----+powers -----TestPowerGold.java --+resource ---ModTheSpire.json ---+img ----+cards ----- Voller Bilder für Karten ----+relics -----TestRelic.png -----+outline ------TestRelic.png ----+powers -----TestPower.png ---+localization ----cards-JPN.json ----cards-ENG.json ----relics-JPN.json ----relics-ENG.json ----powers-JPN.json ----powers-ENG.json

Nun, das allein wird nicht funktionieren. Es ist notwendig, example_mod / Main.java hinzuzufügen.

Bearbeiten Sie Main.java


//Die folgenden Ergänzungen sind für den Import erforderlich.
import com.megacrit.cardcrawl.localization.RelicStrings;
import com.megacrit.cardcrawl.localization.PowerStrings;
import example_mod.relics.*;

//Weitere Orte zum Implementieren
public class Main implements
        PostInitializeSubscriber,   //Derjenige, der ein Abzeichen zeigt?
        EditCardsSubscriber,   //Implementieren Sie beim Hinzufügen einer Karte
        EditRelicsSubscriber,   //Implementierung beim Hinzufügen eines Relikts
        EditStringsSubscriber,  //Implementieren Sie beim Lesen einer Sprachdatei
{

//Erhöhen Sie die Sprachdateien
   @Override
    public void receiveEditStrings() {
        BaseMod.loadCustomStringsFile(CardStrings.class, "localization/cards-" + Settings.language + ".json");
        BaseMod.loadCustomStringsFile(RelicStrings.class, "localization/relics-" + Settings.language + ".json");
        BaseMod.loadCustomStringsFile(PowerStrings.class, "localization/powers-" + Settings.language + ".json");
    }

//Erhöhen Sie die Anzahl der hinzuzufügenden Karten
    @Override
    public void receiveEditCards() {
        BaseMod.addCard(new training_mod.cards.TestAttack());
        BaseMod.addCard(new training_mod.cards.TestPower());
    }

//Relikt hinzufügen
    public void receiveEditRelics() {
        //Relikt hinzufügen
        BaseMod.addRelicToCustomPool(
                new TestRelic(),
                AbstractCardEnum.EXAMPLE_COLOR //Zur Farbe hinzufügen. Gemeinsames Relikt wird eine andere Methode
        );
    }

Wenn Sie eine Machtkarte bauen und in der Kartenliste haben und diese im Starterrelikt in der Reliktliste erscheint, sind Sie erfolgreich. Es gibt eine Fertigkeitskartenerstellung, obwohl ich sie nicht erklärt habe, aber Sie können dies vorerst tun, indem Sie einfach den Kartentyp des Angriffs in CardType.SKILL ändern.

Endlich einen Charakter machen

Tut mir leid, dass ich dich warten ließ. Lass uns einen Charakter machen. Wenn Sie normal denken, brauchen Sie zuerst ein Charakterbild, also machen wir es. Laut der Erklärung von BaseMod heißt es, dass Sie Spriter verwenden können. Die Erklärung danach ist die Einstellung durch den mit Spine erstellten Bildsatz. …… Spine ist eine kostenpflichtige Software, also lass uns mit Spriter gehen.

Hier herunterladen. https://brashmonkey.com/download_spriter/

Schauen Sie sich nach der Installation vorerst das folgende Tutorial an. https://www.youtube.com/watch?v=aQy7eX_CWPM&list=PL8Vej0NhCcI5sxOT64-Z31LW59VUyAVfr&t=0s&index=2

Es ist eine unterhaltsame Software, mit der Sie für jedes Teil (Arme, Beine usw.) eine transparente PNG-Datei erstellen, in Spriter platzieren und auf der Timeline animieren können.

Ich kann es nicht tun, weil es zu lustig ist. Erstellen Sie also zuerst ein char / anim-Verzeichnis unter img und dann ein Spriter-Projekt darunter. Nun, ich denke, es ist in Ordnung, einen Projektnamen wie exampleChar zu verwenden. Platziere das Charakterbild darin.

--+java ---Main.java ---+example_mod ----+cards ----+relics ----+paches ----+powers --+resource ---+img ----+char -----+anim ------ CharacterImage.png 512x512 transparente PNG-Datei

Dann wird CharacterImage.png auf dem Splitter angezeigt. Wenn Sie also doppelklicken, um den Referenzpunkt zu bestimmen, wählen Sie direkt darunter aus, werfen Sie das Bild hinein und platzieren Sie es bei x0, y0.

image.png

Es ist okay, es ist angemessen ... Ich animiere es normalerweise nicht und du hast es nicht gesehen, oder? STS-Zeichen.

Ich brauche mehr Bilder als das. Bitte bereiten Sie Folgendes vor.

--+java ---Main.java ---+example_mod ----+cards ----+relics ----+paches ----+powers --+resource ---+img ----+char ----- BeispielCorpse.png 512x512 transparente PNG-Datei. Es ist derjenige, als er starb. ----- ExampleShoulder.png 1920x1136 transparente PNG-Datei. Es ist ein Bild von hinten, das in einem Lager gezeigt wird. -----+anim ------ CharacterImage.png 512x512 transparente PNG-Datei. Kuerzlich ------ ExampleChar.scml Von Spriter gespeicherte Datei. Informationen wie Platzierung und Animation. Ich werde es danach verwenden. ----+charSelect ----- BeispielButton.png 200x200 transparente PNG-Datei. Taste zum Drücken auf dem Zeichenauswahlbildschirm ----- ExamplePortrait.png 1920x1200 transparente PNG-Datei. Der Hintergrund, der angezeigt wird, nachdem Sie die Schaltfläche oben gedrückt haben. Freut mich, dich kennenzulernen.

Gute Arbeit. Die Materialien sind jetzt vollständig. Fügen wir Zeichen hinzu. Fügen Sie zunächst die folgende Klasse zu example_mod / paches hinzu.

ExampleClassEnum.java


package example_mod.patches;
import com.evacipated.cardcrawl.modthespire.lib.SpireEnum;
import com.megacrit.cardcrawl.characters.AbstractPlayer;

//Das Beispiel für den Klassennamen kann der Name des zu erstellenden MOD sein.

public class ExampleClassEnum {
    @SpireEnum
    public static AbstractPlayer.PlayerClass ExampleClass;
}

Erstellen Sie ein Verzeichnis example_mod / character und fügen Sie die folgenden Klassen hinzu.

ExampleChar.java


package example_mod.character;

//Ich habe es importiert, obwohl ich es nicht benutze, aber ich denke, es wird eine Zeit kommen, in der ich etwas brauche.
import java.util.ArrayList;
import java.util.List;

import com.badlogic.gdx.graphics.Color;
import com.badlogic.gdx.graphics.Texture;
import com.badlogic.gdx.graphics.g2d.BitmapFont;
import com.badlogic.gdx.graphics.g2d.TextureAtlas;
import basemod.abstracts.CustomPlayer;
import basemod.animations.SpriterAnimation;

import com.megacrit.cardcrawl.actions.AbstractGameAction;
import com.megacrit.cardcrawl.cards.AbstractCard;
import com.megacrit.cardcrawl.characters.AbstractPlayer;
import com.megacrit.cardcrawl.core.CardCrawlGame;
import com.megacrit.cardcrawl.core.EnergyManager;
import com.megacrit.cardcrawl.cutscenes.CutscenePanel;
import com.megacrit.cardcrawl.dungeons.AbstractDungeon;
import com.megacrit.cardcrawl.events.city.Vampires;
import com.megacrit.cardcrawl.helpers.*;
import com.megacrit.cardcrawl.localization.CardStrings;
import com.megacrit.cardcrawl.localization.CharacterStrings;
import com.megacrit.cardcrawl.screens.CharSelectInfo;
import com.megacrit.cardcrawl.screens.stats.CharStat;
import com.megacrit.cardcrawl.unlock.UnlockTracker;
import com.megacrit.cardcrawl.actions.AbstractGameAction.AttackEffect;

import example_mod.cards.*;
import example_mod.relics.*;
import example_mod.patches.*;

public class TrainingChar extends CustomPlayer {
    public static final CharacterStrings charStrings = CardCrawlGame.languagePack.getCharacterString("examplemod:ExampleChar");
    public static final int ENERGY_PER_TURN = 3; //Wie viel Energie kannst du für eine Runde bekommen?
    public static final String EXAMPLECHAR_SHOULDER_2 = "img/char/ExampleShoulder.png "; //Hinter den Kulissen des Lagers
    public static final String EXAMPLECHAR_SHOULDER_1 = "img/char/ExampleShoulder.png "; //Andere hinter Bildern. Wenn Sie es teilen möchten, machen Sie es.
    public static final String EXAMPLECHAR_CORPSE = "img/char/ExampleCorpse.png "; //Leichenbild

    public ExampleChar(String name){
        super(name,
                ExampleClassEnum.ExampleClass,
                null,
                null,
                null,
                new SpriterAnimation("img/char/anim/ExampleChar.scml") //Mit Spriter erstellte Dateien
        );
        initializeClass(null,
                EXAMPLECHAR_SHOULDER_2,
                EXAMPLECHAR_SHOULDER_1,
                EXAMPLECHAR_CORPSE,
                getLoadout(),
                20.0F,
                -10.0F,
                220.0F,
                290.0F,
                new EnergyManager(ENERGY_PER_TURN)
        );

    }

    @Override
    public String getTitle(AbstractPlayer.PlayerClass playerClass){
        return charStrings.NAMES[0];
    }
    @Override
    public String getSpireHeartText(){
        return charStrings.TEXT[0];
    }
    @Override
    public String getLocalizedCharacterName() {
        return charStrings.NAMES[0]; //Ich weiß nicht, wo das oben ist anders. Ist es in Ordnung, gleich zu sein?
    }
    @Override
    public String getVampireText() {
        //Vampirereignis. Ich denke, 0 ist eisern gekleidet und 1 schweigt, aber ich weiß es nicht.
        return Vampires.DESCRIPTIONS[0];
    }
    public Color getCardRenderColor() {
        return CardHelper.getColor(100.0f, 50.0f, 50.0f);   //EXAMPLE_COLOR_Ist es dasselbe wie BG?
    }
    public Color getCardTrailColor() {
        return CardHelper.getColor(100.0f, 50.0f, 50.0f);   //EXAMPLE_COLOR_Ist es dasselbe wie BG?
    }
    public Color getSlashAttackColor() {
        return CardHelper.getColor(100.0f, 50.0f, 50.0f);   //EXAMPLE_COLOR_Ist es dasselbe wie BG?
    }
    public AttackEffect[] getSpireHeartSlashEffect() {
        //Es scheint ein Effekt zu sein, aber ich bin mir nicht sicher, was es ist.
        return new AttackEffect[]{
                AttackEffect.SLASH_HEAVY,
                AttackEffect.FIRE,
                AttackEffect.SLASH_DIAGONAL,
                AttackEffect.SLASH_HEAVY,
                AttackEffect.FIRE,
                AttackEffect.SLASH_DIAGONAL
        };
    }
    public AbstractCard getStartCardForEvent() {
        return new TestPower() ;    //Ich weiß nicht, wofür es ist, aber vorerst
    }
    public BitmapFont getEnergyNumFont() {
        return FontHelper.energyNumFontBlue;
    }
    public void doCharSelectScreenSelectEffect() {
        //Ich denke, es ist der Ton- und Bildschirmeffekt, wenn Sie einen Charakter auswählen
        CardCrawlGame.sound.playV("AUTOMATON_ORB_SPAWN", 1.75f);
        CardCrawlGame.screenShake.shake(ScreenShake.ShakeIntensity.LOW, ScreenShake.ShakeDur.SHORT, true);
    }
    public String getCustomModeCharacterButtonSoundKey() {
        return "AUTOMATON_ORB_SPAWN";
    }

    public AbstractCard.CardColor getCardColor() {
        //Die Farbe der Karte, die für diesen Charakter verwendet wird
        return AbstractCardEnum.EXAMPLE_COLOR; //Kartenfarbvariable. Mach keinen Fehler.
    }

    public AbstractPlayer newInstance() {
        return new ExampleChar(this.name);
    }


    public ArrayList<String> getStartingDeck() { //Der Inhalt des ersten Decks. Fügen Sie die grundlegende RASIC-Rarität ein. wie es Dir gefällt.
        ArrayList<String> retVal = new ArrayList<>();
        retVal.add(TestAttack.ID);
        retVal.add(TestAttack.ID);
        retVal.add(TestAttack.ID);
        retVal.add(TestAttack.ID);
        retVal.add(TestAttack.ID);
        retVal.add(TestAttack.ID);
        retVal.add(TestAttack.ID);
        retVal.add(TestAttack.ID);
        retVal.add(TestAttack.ID);
        return retVal;
    }

    public ArrayList<String> getStartingRelics() { //Bezeichnung des Starterrelikts.
        ArrayList<String> retVal = new ArrayList<>();
        retVal.add(TestRelic.ID);
        UnlockTracker.markRelicAsSeen(TestRelic.ID);
        return retVal;
    }

    //Der Teil, der die Charakterfähigkeit bestimmt
    private static final int STARTING_HP = 75;
    private static final int MAX_HP = 75;
    private static final int STARTING_GOLD = 99;
    private static final int HAND_SIZE = 5;
    private static final int ORB_SLOTS = 0;
    private static final int ASCENSION_MAX_HP_LOSS = 5;

    public int getAscensionMaxHPLoss() {
        return ASCENSION_MAX_HP_LOSS;
    }

    public CharSelectInfo getLoadout() { //Ich denke, es sind die Informationen, die auf dem Charakterauswahlbildschirm angezeigt werden
        return new CharSelectInfo(
                charStrings.NAMES[0],
                charStrings.TEXT[0],
                STARTING_HP,
                MAX_HP,
                ORB_SLOTS,
                STARTING_GOLD,
                HAND_SIZE,
                this,
                getStartingRelics(),
                getStartingDeck(),
                false);
    }
}

Fügen Sie die folgenden Dateien zu Ressourcen / Lokalisierung hinzu.

char-JPN.json

{
  "examplemod:ExampleChar": {
    "NAMES": ["Charaktername"],
    "TEXT": ["Erläuterungstext. Wenn Sie es je nach Standort ändern möchten, teilen Sie es"]
  }
}

Da es sich um eine Übersee-Reise handelt, bereiten Sie bitte auch char-ENG.json vor.

Nun die endgültige Bearbeitung von example_mod / Main.java.

Main.java

import basemod.BaseMod;
import basemod.interfaces.*;
import com.evacipated.cardcrawl.modthespire.lib.SpireInitializer;
import com.megacrit.cardcrawl.core.Settings;
import com.badlogic.gdx.graphics.Color;
import com.badlogic.gdx.graphics.Texture;
import com.megacrit.cardcrawl.helpers.CardHelper;
import com.megacrit.cardcrawl.localization.CardStrings;
import com.megacrit.cardcrawl.localization.CharacterStrings;
import com.megacrit.cardcrawl.localization.RelicStrings;
import com.megacrit.cardcrawl.localization.PowerStrings;

//In diesem Fall möchten Sie das Debug-Protokoll ausgeben
import org.apache.logging.log4j.LogManager;
import org.apache.logging.log4j.Logger;

import example_mod.patches.*;
import example_mod.relics.*;

@SpireInitializer
public class Main implements
        EditCardsSubscriber,   //Implementieren Sie beim Hinzufügen einer Karte
        EditRelicsSubscriber,   //Implementierung beim Hinzufügen eines Relikts
        EditStringsSubscriber,  //Implementieren Sie beim Lesen einer Sprachdatei
        EditCharactersSubscriber //Implementieren Sie beim Hinzufügen eines Zeichens
{
    private static final Color EXAMPLE_COLOR_BG = CardHelper.getColor(100.0f, 50.0f, 50.0f);
    private static final String ATTACK_EXAMPLE         = "img/cards/bg_attack_512.png ";
    private static final String SKILL_EXAMPLE          = "img/cards/bg_skill_512.png ";
    private static final String POWER_EXAMPLE           = "img/cards/bg_power_512.png ";
    private static final String ENERGY_ORB_EXAMPLE         = "img/cards/orb_512.png ";
    private static final String ATTACK_PORT_EXAMPLE        = "img/cards/bg_attack_1024.png ";
    private static final String SKILL_PORT_EXAMPLE         = "img/cards/bg_skill_1024.png ";
    private static final String POWER_PORT_EXAMPLE         = "img/cards/bg_power_1024.png ";
    private static final String ENERGY_ORB_PORT_EXAMPLE = "img/cards/orb_1024.png ";
    private static final String ENERGY_ORB_CARD_EXAMPLE = "img/cards/orb_ui.png ";

    //Wenn Sie ein Debug-Protokoll ausgeben möchten.
    public static final Logger logger = LogManager.getLogger(Main.class.getName());


    public Main(){
        BaseMod.subscribe(this);
        BaseMod.addColor(
                AbstractCardEnum.EXAMPLE_COLOR    //Farbvariablen
                , EXAMPLE_COLOR_BG //bgColor
                , EXAMPLE_COLOR_BG//backColor
                , EXAMPLE_COLOR_BG//frameColor
                , EXAMPLE_COLOR_BG//frameOutlineColor
                , EXAMPLE_COLOR_BG//descBoxColor
                , EXAMPLE_COLOR_BG //trailVfColor
                , EXAMPLE_COLOR_BG//glowColor
                , ATTACK_EXAMPLE//attackBg
                , SKILL_EXAMPLE//skillBg
                , POWER_EXAMPLE//powerBG
                , ENERGY_ORB_EXAMPLE//energyOrb
                , ATTACK_PORT_EXAMPLE//attackBgPortrait
                , SKILL_PORT_EXAMPLE//skillBgPortrait
                , POWER_PORT_EXAMPLE//powerBgPortrait
                , ENERGY_ORB_PORT_EXAMPLE//energyOrbPortrait
                , ENERGY_ORB_CARD_EXAMPLE//CardEnergyOrb
        );
    }

    public static void initialize() {
        Main main = new Main();
    }

    @Override
    public void receiveEditStrings() {
        BaseMod.loadCustomStringsFile(CardStrings.class, "localization/cards-" + Settings.language + ".json");
        BaseMod.loadCustomStringsFile(RelicStrings.class, "localization/relics-" + Settings.language + ".json");
        BaseMod.loadCustomStringsFile(CharacterStrings.class, "localization/char-" + Settings.language + ".json");
        BaseMod.loadCustomStringsFile(PowerStrings.class, "localization/powers-" + Settings.language + ".json");
    }

    @Override
    public void receiveEditCards() {
        BaseMod.addCard(new example_mod.cards.TestAttack());
        BaseMod.addCard(new example_mod.cards.TestPower());
        //Ich werde es später erklären
    }

    @Override
    public void receiveEditCharacters() {
        //Hinzufügen von eindeutig definierten Zeichen
        BaseMod.addCharacter(
                new example_mod.character.ExampleChar("ExampleCharacter"),
                "img/charSelect/ExampleButton.png ",
                "img/charSelect/ExamplePortrait.png ",
                ExampleClassEnum.ExampleClass
        );

    }

    public void receiveEditRelics() {
        //Relikt hinzufügen
        logger.info("begin editing relics"); //So wird das Debug-Protokoll ausgegeben.
        BaseMod.addRelicToCustomPool(
                new TestRelic(),
                AbstractCardEnum.EXAMPLE_COLOR //Zur Farbe hinzufügen. Gemeinsames Relikt ist eine andere Methode
        );
        logger.info("done editing relics");
    }
}

Jetzt baue es, wähle den Charakter aus und das Spiel beginnt und du bist fertig! Danke für deine harte Arbeit!

…… e? Wird es sich festigen, nachdem der Kampf vorbei ist?

Oh, das liegt daran, dass es nicht genug Karten gibt. Wirst du am Ende des Kampfes zufällig 3 Karten anzeigen? Wenn Sie jetzt so vorgegangen sind, gibt es nur zwei Typen, sodass es abstürzt. Ich denke, dass das Debug-Protokoll auch an diesem Punkt gestoppt wird.

Dann weiß ich nicht, wie viele Zeichen für das Zeichen MOD benötigt werden (bitte sagen Sie es mir).

Ich weiß es nicht, aber die Kartenauswahl beträgt normalerweise 3 Karten. Sie kann durch Relikt um +1 erhöht werden. Wenn der Boss besiegt wird, sind alle selten Nun, wenn es 4 Arten von Angriffsfertigkeiten GEMEINSAM, UNGEMEINSAM und SELTEN gibt, wird es mindestens funktionieren. 3 Kategorien x 3 seltene x 4 Typen, 36 Blatt? Wenn Sie sich die MODs anderer Leute ansehen, gibt es ungefähr 70 ...

Vorerst habe ich die Produktion von Karten mit der gleichen Fähigkeit in meinem Repository erhöht, damit es funktioniert, also denke ich, dass es ein Modell geworden ist.

Es war irgendwie peinlich, dass das Repository "Training" statt "Beispiel" war. Ich frage mich, ob das Beispiel mit der Erklärung von BaseMod übereinstimmt.

das ist alles.

Weitere Hinweise ・ Wenn Sie eine Karte ziehen, die aufgrund des Effekts normalerweise nicht verfügbar ist, bereiten Sie eine Kartenfarbe dafür vor und machen Sie die Rarität SPEZIAL?

Recommended Posts

Wie erstelle ich einen MOD für Slay the Spire?
Einführung in Slay the Spire Mod Development (1) Einführung
Einführung in Slay the Spire Mod Development (2) Konstruktion der Entwicklungsumgebung
So erstellen Sie einen Java-Container
Wie unterschreibe ich Minecraft MOD?
So erstellen Sie einen JDBC-Treiber
So erstellen Sie einen Begrüßungsbildschirm
So erstellen Sie ein Jenkins-Plug-In
Wie erstelle ich ein Maven-Projekt?
So erstellen Sie ein Java-Array
SDWebImage: So löschen Sie den Cache für eine bestimmte UIImageView
Einführung in die Entwicklung der Spire Mod-Entwicklung (3) Definition der Originalkarte
So erstellen Sie eine Java-Kalenderzusammenfassung
So erstellen Sie ein Maven-Repository für 2020
Wie erstelle ich einen Discord Bot (Java)
So identifizieren Sie den Pfad, auf dem leicht Fehler gemacht werden können
So überprüfen Sie den Inhalt der Java-Zeichenfolge mit fester Länge
Wie man einen revolutionären Diamanten mit Java für Aussage macht wwww
So erstellen Sie überall eine H2-Datenbank
Machen Sie einen Rand links vom TextField
So erstellen Sie Pagenationen für das "Kaminari" -Array
[Java] (für MacOS) Methode zur Einstellung des Klassenpfads
[Java] Wie man mehrere for-Schleifen einzeln macht
Wie man ein schattiertes Glas macht
So erstellen Sie eine Beurteilungsmethode, um nach einem beliebigen Zeichen im Array zu suchen
So erstellen Sie eine eindeutige Datenkombination in der Schienen-Zwischentabelle
So führen Sie die SpringBoot-App als Dienst aus
So verwenden Sie ein Array für den TreeMap-Schlüssel
So schreiben Sie einen Komponententest für Spring Boot 2
[Spring Boot] So erstellen Sie ein Projekt (für Anfänger)
Wie schreibe ich einen Core Mod in Minecraft Forge 1.15.2
Wie man Kotlin zum ersten Mal studiert ~ Teil 2 ~
Wie man Kotlin zum ersten Mal studiert ~ Teil 1 ~
Java - So erstellen Sie JTable
Wie hinterlasse ich einen Kommentar?
[Schienen] Wie man Samen macht
So fügen Sie ein Video ein
So erstellen Sie eine Methode
So erstellen Sie ein Platzhalterteil zur Verwendung in der IN-Klausel
Ruby mit AtCoder lernen 13 So erstellen Sie ein zweidimensionales Array
[Ruby] So rufen Sie den Inhalt des Doppel-Hash ab
So geben Sie Array-Werte ohne Verwendung einer for-Anweisung aus
So fügen Sie dieselben Indizes in ein verschachteltes Array ein
Minecraft Modding [1.12] So fügen Sie einen speziellen Render für Item hinzu
Ein Memorandum, um den juckenden Ort für Java Gold zu erreichen
[jsoup] So erhalten Sie die gesamte Dokumentation
So erstellen und starten Sie eine Docker-Datei für Payara Micro
Eine kleine süchtig machende Geschichte nach dem Update des JDBC-Treibers für PostgreSQL
So erstellen Sie einen JDBC-Treiber
So erhalten Sie die neueste Live-Übermittlungs-ID für einen Kanal ohne Verwendung der YouTube-Daten-API
Mechanismus zum Konvertieren in eine Sprache, die der Browser erkennen kann
Verwendung der Methode form_with
Versuchen Sie, einen einfachen Rückruf zu tätigen
So legen Sie die Validierung für time_field fest
So installieren Sie JMeter für Mac
So finden Sie den durchschnittlichen Winkel