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.

File file = new File("Server/data/MapGeneral.tmx"); // asendada faili asukoht oma mapi asukohaga
DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();
DocumentBuilder db = dbf.newDocumentBuilder();
Document doc = db.parse(file);
doc.getDocumentElement().normalize();
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.

Node node = nodeList.item(2);
Element eElement = (Element) node;
String data = eElement.getElementsByTagName("data").item(0).getTextContent();
String[] columns = data.split("\n");
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

int y = columns.length - 1;
int x = 0;
for (String column : columns) {
    String[] rows = column.split(",");
    x = 0;
    for (String row : rows) {
        if (!Objects.equals(row, "") && Integer.parseInt(row) > 0) {
            collisions[y][x] = 1;
        }
        x++;
    }
    y--;
}
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.