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
.

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.

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;
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.
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.