Dando sequência a nossa série sobre criar o seu próprio Pokemon GO (que você pode conferir aqui), vamos ver a terceira e última parte, que traz logo de cara a 5ª etapa, sobre a geração de monstros no mapa.
Etapa 5: Gerando Monstros no Mapa (Parte B)
Enquanto somos capazes de converter os dados de longitude e latitude para o mundo do jogo, é hora de criar alguns dados do monstro fictício no servidor de análise. Vá para o seu painel e crie um monstro chamado classe.
Insira a coluna: Location with data type Geopoint
Insira algum monstro próximo a você.
Os monstros fictícios estão definidos e estão só esperando você chamar. Então, crie um MonsterSpawn GameObject com script Spawn. Coloque nele LocationManager GameObject (para utilizar os dados GPS) M pré-estabelecido Monster para desovar um monstro.
É hora de trazer os dados do monstro fictício ao seu programa:
void Start () {
monsterXZCoordination = new List<double[]>();
monsterLL = new List<double[]> ();
var query = ParseObject.GetQuery ("Monster");
//you can use WhereWithinGeoBox or WhereNear or WhereWithinDistance to simulate pkmgo serach range
playerlon = locationManager.GetComponent<LocationManager>().getLon();
playerlat = locationManager.GetComponent<LocationManager>().getLat();
query.FindAsync ().ContinueWith (t => {
IEnumerable<ParseObject> results = t.Result;
foreach (var result in results) {
ParseGeoPoint temp = result.Get<ParseGeoPoint>("Location");
double[] tempxz = GeoDistance.convertXZ(playerlon,playerlat,temp.Longitude,temp.Latitude);
double[] trueLL = {temp.Longitude,temp.Latitude};
monsterLL.Add(trueLL);
monsterXZCoordination.Add(tempxz);
}
spawn = true;
});
}
O código acima obtém o resultado um por um e converter os dados GeoPoint para ser as coordenadas do mundo XYZ e empurra o resultado para a Lista. Depois de adicionar o resultado obtido, Spawn se torna verdade para permitir que o programa gere o monstro.
void Update () {
playerlon = locationManager.GetComponent<LocationManager>().getLon();
playerlat = locationManager.GetComponent<LocationManager> ().getLat ();
DebugConsole.Log (locationManager.GetComponent<LocationManager>().getLon().ToString());
if (spawn == true) {
monsterSpawn ();
}
if (monster.Count != 0) {
if (playerlon != lastlon || playerlat != lastlat) {
updateMonstersPosition ();
}
}
lastlat = playerlon;
lastlon = playerlat;
}
void monsterSpawn(){
DebugConsole.Log ("HIHIHI");
for (int i = 0; i < monsterXZCoordination.Count; i++) {
GameObject temp = Instantiate (m, new Vector3 ((float)monsterXZCoordination [i][0], 0.07f, (float)monsterXZCoordination [i][1]), new Quaternion (0, 0, 0, 0)) as GameObject;
DebugConsole.Log (temp.transform.position.ToString());
monster.Add (temp);
}
spawn = false;
}
void updateMonstersPosition(){
for (int i = 0; i < monster.Count; i++) {
double[] tempxz = GeoDistance.convertXZ(playerlon,playerlat,monsterLL[i][0],monsterLL[i][1]);
monster [i].gameObject.transform.position = new Vector3 ((float)tempxz[0],0.07f,(float)tempxz[1]);
DebugConsole.Log (monster [i].gameObject.transform.position.ToString ());
}
}
Após os Monstros serem gerados, eles vão manter a atualização quando os dados do GPS do jogador forem atualizados. Testes. O monstro é gerado nas coordenadas corretas XYZ com seus dados, latitude e longitude.
Testar em movimento:
O cálculo é bastante preciso. O monstro vai continuar atualizando a posição correta quando o jogador se move.
É isso! Espero que tenha gostado!












