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!