Mängukaardi lisamine serverisse

Selleks, et teie AI oskaks mängukaardi peal navigeerida, tuleks kaart lisada ka serverisse.

See tähendab, et kui mäng algab, või server pannakse käima, laetakse kaart serverisse, ja pannakse selle järgi AI-d liikuma.

Kui te tegite oma kaardi tiled-iga, siis kaart salvestatakse Translation Memory Exchange failina, laiendiga .tmx.

Siin materjalides vaatamegi kuidas .tmx kaart parsida serverisse. Kui teie mängukaart on mõne muu formaadiga, siis tegelikult töötab kõik samamoodi, peate ainult üles leidma, kust algab kaardi nii-öelda array.

Kaardi lisamine serveri failidesse

Esiteks oleks vaja see kaart lisada serveri kataloogi.

Teil võiks olla serveri mooduli all mingi kaust andmete jaoks, mida server sisse loeb, näiteks data.

1

Sinna lisage oma kaardi fail, antud juhul .tmx kaardi fail. Hiljem on sinna lihtsam ka lisada muid faile (näiteks kaardi tegemiseks kasutatud tileseti failid), mida serveril võib vaja minna, nagu ka antud pildil on näha.

Kaardi parsimine serveris

1. Olgu teil enda mängu serveris Game klass, või mõni muu klass, mis luuakse kui mäng algab või server käima pannakse, seal peaksite välja kutsuma ka kaardi sisse lugemise.

2

Näiteks meetod nimega readTileMapData, kus loetakse kaart serverisse sisse.

2. Kuna on vaja kaart sisse lugeda, tuleks importida java.io asjad, ning samuti on javas olemas tmx failide lugeja:

import java.io.File;
import java.util.Objects;
import javax.xml.parsers.DocumentBuilderFactory;
import javax.xml.parsers.DocumentBuilder;
  1. Loome funktsiooni readTileMapData

private void readTilemapData () {
    try {
        //code here
    }
    catch (Exception e)
    {
        e.printStackTrace();
    }
}

4. Järgmiseks loeme sisse faili, ja samuti leiame kõik layer elemendid. Need on need elemendid, kus on teie kaardi tilede layerid.

   // Faili objekt: asenda see oma TMX kaardifaili asukohaga serveri projektis
File file = new File("Server/data/MapGeneral.tmx");

// Loome DocumentBuilderFactory ja DocumentBuilder objektid TMX (XML) faili lugemiseks
DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();
DocumentBuilder db = dbf.newDocumentBuilder();

// Parseerime TMX faili XML dokumenti
Document doc = db.parse(file);

// Normaliseerime dokumendi (koondab tekstisõlmed)
doc.getDocumentElement().normalize();

// Leiame kõik 'layer' elemendid, mis sisaldavad kaardi layerite andmeid
NodeList nodeList = doc.getElementsByTagName("layer");

5. Peaksite tuvastama millises kaardi layeris teil collision on. Igas layeris ei ole collisionit. Kui tegite kaardi ise sõltub see sellest, millisele layerile te collisioni lisasite. Kõiki layereid pole mõtet sisse lugeda, sest see tekitaks ülemäärast segadust.

Antud näites on collisioni layer indeksiga 2. Loeme selle layeri sisse ja genereerime selle põhjal kahedimensioonilise int array.

// Siin määrame, millises layeris on collision. Näites on layer indeksiga 2
// NB! Kui sul on erinev layer, muuda indeks vastavalt
Node node = nodeList.item(2);

// Teeme Node'ist Element objekti, et saaksime XML elemendi sisu lugeda
Element eElement = (Element) node;

// Loeme layeri 'data' elemendi sisu - see sisaldab kaardi tile andmeid CSV-na
String data = eElement.getElementsByTagName("data").item(0).getTextContent();

// Jagame read eraldi stringideks, kuna igal real on veerud (CSV)
String[] columns = data.split("\n");

// Loome 2D int array, kuhu paneme collision info
// columns.length = ridade arv, columns[1].split(",").length = veergude arv
int[][] collisions = new int[columns.length][columns[1].split(",").length + 1];

Kaardi tiled on tagis nimega data, loeme need sisse, ja arvutame selle suuruse (read ja veerud), ja selle põhjal loome int[][] collisions muutuja.

Kuna iga kaardi veerg on eraldi real, loeme selle data stringiks, ja splitime new linega. Read on eraldatud komadega, ja selle järgi saame ridade pikkuse. Tegu on csv-ga, millega olete arvatavasti juba pythonist tuttavad. Splittimist teeme selle jaoks, et saada teada kaardi mõõdud.

  1. Edasi tuleks veerud ja read läbi loopida

// Loome muutujad loopimiseks
int y = columns.length - 1; // alustame viimasest reast (TMX kaardid algavad y=0 alt)
int x = 0;

// Läbime kõik read
for (String column : columns) {
    // Jagame iga rea veergudeks, CSV eraldajana koma
    String[] rows = column.split(",");

    x = 0;

    // Läbime kõik veerud reas
    for (String row : rows) {
        // Kui veeru väärtus on suurem kui 0, tähistame collisioni 1-ga
        if (!Objects.equals(row, "") && Integer.parseInt(row) > 0) {
            collisions[y][x] = 1;
        }
        x++;
    }
    y--;
}

// Salvestame loodud collision array klassi muutujasse
this.collisions = collisions;

Muudame collisions arrayd nii, et seal kus on collision (kaardi mingi elemendi väärtus on suurem kui 0), oleks numbriliselt tähistatud 1-ga, ja seal kus collision ei ole, oleks tähistatud 0-ga. Nii on lihtne aru saada, kus on collision ja kus ei ole.

Ja lõpetuseks lisame klassi muutujasse collisions selle sama collisions muutuja, mille just tekitasime.

Nüüd, kui kaart on serveris, saab seda kasutada mitmel viisil. Näiteks võib mängu alguses määrata mängijale juhusliku positsiooni, et ta ei satuks kuhugi block'i sisse. Lisaks on võimalik teha serveri poolne kokkupõrgete tuvastus (collision detection), et mängijad ei saaks cheat'ide abil läbi seinte liikuda või takistada mängijatel esemeid seljakotist block'ide sisse viskamast.

Kaart on serveris vajalik ka AI liikumiseks. Seda saab kasutada, et tagada, et kui teie AI liigub kaardil ringi (kas suvaliselt või mingi kindla tunnuse järgi), et ta ei liiguks nii-öelda läbi seinte.