Wpis z mikrobloga

#programowanie #c #unity3d #unity mirki mam pytanie do waszych tęgich głów. Jestem poczatkujacym "programistą" i nie do końca jeszcze czuje sie komfortowo przy inkrementacji.
Generalnie robie sobie prostego #roguelike i spawnuje sobie potworki na mapie. Jak jest ich duzo (100+) to zaczyna mi przycinać przy chodzeniu. Chce napisać prosty algorytm optymalizacyjny który sprawdzi w jakiej odleglosci od gracza jest potwor i jesli ta odleglosc jest np ponizej 10 kratek, to dopiero go ozywia.
splodzilem cos takiego

void CheckMonsterDistance(int posX, int posY, int range)
{
if (range >= 0)
{
if (mapGenerator.map[posX, posY] == 'm')
{
for (int j = 0; j < Enemies.Length; j++)
{
if (Enemies[j].transform.position.x == posX &&
Enemies[j].transform.position.z == posY)
Enemies[j].GetComponent().awake = true;
Debug.Log("enemy at " + range);

}
}
CheckMonsterDistance(posX - 1, posY, range - 1);
CheckMonsterDistance(posX + 1, posY, range - 1);
CheckMonsterDistance(posX, posY - 1, range - 1);
CheckMonsterDistance(posX, posY + 1, range - 1);
}
else
{
return;
}
}

wołam to tym:
if (TimeManager.playerTurn)
{
CheckMonsterDistance((int)transform.position.x, (int)transform.position.z, 4);
}

a potwór ma w update na początku
if (awake){
}

i niby odpala, errorów nie ma, ale cos nie dziala tak jak powinno (wykrywa mi potwora dopiero jak jestem obok niego i proboje na niego "wejsc")
wydaje mi sie ze blad jest gdzies po stronie samego algorytmu CheckMonsterDistance
Jakis pomysl?
  • 7
@psyhatog:
Tak na szybko
1) do posY podajesz pozycje Z ? Tak ma być?
2) Co robi ten if?

if (mapGenerator.map[posX, posY] == 'm')
3) Co sprawdzasz tutaj?

if (Enemies[j].transform.position.x == posX &&
Enemies[j].transform.position.z == posY)

Dalej jak dobrze rozumiem jest wybudzenie potworka

PosX i posY to są współrzędne postaci tak?
4)

CheckMonsterDistance(posX - 1, posY, range - 1);
CheckMonsterDistance(posX + 1, posY, range - 1);
CheckMonsterDistance(posX, posY - 1, range
@psyhatog: Nazerin ładnie podsumował. Nie prościej będzie Tobie napisać algorytm obliczający odległość (x1, y1, x2, y2)?
http://www.math4ged.com/finding-the-distance-between-two-points-on-a-coordinate-grid/
Prosta matma, jedna funkcja (która może być powielona do wielu innych zadań). Sprawdzasz po prostu
IF getdistance(monster.x,monster.y,player.x,player.y) < activationdistance THEN monster.active == 1 ELSE monster.active == 0

Wywołujesz to w forze na każdym przeciwniku. Potem możesz elegancko korzystać z funkcji do np. ataku z dystansu, czy sprawdzenia czy gracz jest odpowiednio daleko
@Nazerin: 1) do posY podajesz pozycje Z ? Tak ma być?


Tak. Generalnie trzymam informacje o pozycji gracza, obiektach na mapie itd. w dwuwymiarowej tablicy charów, której reprezentacją są obiekty 3d na scenie. Więc gdy mam tablice charow X, Y to odpowiada im w przestrzeni 3d X i Z.

@Nazerin: 2) Co robi ten if?

if (mapGenerator.map[posX, posY] == 'm')
Sprawdza czy na tablicy charów znajduje sie w tej pozycji
@psyhatog:`if (abs(Enemies[j].transform.position.x - posX)<=range && abs(Enemies[j].transform.position.z - posY<=range)) Enemies[j].GetComponent().awake = true' Nie jest zbyt efektywne, ale najprostsze rozwiązanie. Budzi stworka gdy ten jest w odległości mniejszej równej Range w osi X i Y
@psyhatog: Wydaje mi się, że za dużo kombinujesz. Nie możesz po prostu korzystać z wbudowanych klas? np.:

float distance = Vector3.Distance(enemy.transform.position, player.transform.position);
i sprawdzać jaka jest wartość 'distance'?