Aktywne Wpisy

Brydzo +296
Telewizja, która skupia się na konkretach.
#debata
#debata
źródło: Screenshot 2025-05-23 205425
Pobierz
matthew1990 +15
Nawrocki mial za zadanie sie nie zblaznic i tego nie zrobil :-)
9 dni i odpoczniemy od tuskobotow
#debata
9 dni i odpoczniemy od tuskobotow
#debata




![Nieistniejące "masowe groby" w Kanadzie [fragment podcastu]](https://wykop.pl/cdn/c3397993/b3e9c9a59dcfe98620d09f1ff3af46f41f3214293e5ad1cfb44dd94b2cc371d6,q80.png)
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?
Tak na szybko
1) do posY podajesz pozycje Z ? Tak ma być?
2) Co robi ten if?
if (mapGenerator.map[posX, posY]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
Komentarz usunięty przez autora
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.
if
float distance = Vector3.Distance(enemy.transform.position, player.transform.position);i sprawdzać jaka jest wartość 'distance'?