XNA c# Random spawnar enemy på varandra!

Permalänk

XNA c# Random spawnar enemy på varandra!

Tja!

Håller på med ett 2d shooter spel i skolan och har litet problem. Just nu så använder jag Random för att få ut en X samt Y position som enemy ska spawna på. Problemet jag har är att Random kan ibland göra så Enemy1 hamnar ovanpå Enemy2. Någon som har någon ide hur jag kan lägga upp detta? Skulle man kanske kunna använda collisionboxarna jag har runt skeppen? För att kunna säga om de kolliderar så ska de flyttas?

Nån som har någon ide?

// Johan H

Permalänk
Medlem
Skrivet av Johan Holm:

Tja!

Håller på med ett 2d shooter spel i skolan och har litet problem. Just nu så använder jag Random för att få ut en X samt Y position som enemy ska spawna på. Problemet jag har är att Random kan ibland göra så Enemy1 hamnar ovanpå Enemy2. Någon som har någon ide hur jag kan lägga upp detta? Skulle man kanske kunna använda collisionboxarna jag har runt skeppen? För att kunna säga om de kolliderar så ska de flyttas?

Nån som har någon ide?

// Johan H

Om du bara vill lösa det så att fienderna inte hamnar ovanpå varandra så kan du använda dina befintliga kollisionsboxarna. Vanligtvis så definieras dessa som en radie eller rektangulär area, då du säger boxar så antar jag att det är det sistnämnda. Om den nya koordinatens area kolliderar med den befintliga så bör du slumpa fram en ny koordinat. XNA har färdiga metoder för att kontrollera sådant. Om inte så kan du göra en egen och använda dig av Rectangle-klassens medföljande metoder.

Visa signatur

ηλί, ηλί, λαμά σαβαχθανί!?

Permalänk
Skrivet av Leedow:

Om du bara vill lösa det så att fienderna inte hamnar ovanpå varandra så kan du använda dina befintliga kollisionsboxarna. Vanligtvis så definieras dessa som en radie eller rektangulär area, då du säger boxar så antar jag att det är det sistnämnda. Om den nya koordinatens area kolliderar med den befintliga så bör du slumpa fram en ny koordinat. XNA har färdiga metoder för att kontrollera sådant. Om inte så kan du göra en egen och använda dig av Rectangle-klassens medföljande metoder.

Hej!

Tack för svaret. Jag har redan en Rectangle runt Enemy. Jag har fått Intersect att fungera men problemet som är kvar är att om jag gör som du säger så kan den nya random position fortfarande slumpas på en annan enemy.
Det hade ju inte varit några problem om Enemy1 och Enemy2 inte använder sig av samma klass samt ligger i samma list. På något sätt måste jag ju kunna säga till om enemy1 intersect med enemy2 så ska enemy1 flyttar 20 i X led. Men det får inte enemy 2 göra för då får de samma position igen.

Permalänk
Medlem
Skrivet av Johan Holm:

Hej!

Tack för svaret. Jag har redan en Rectangle runt Enemy. Jag har fått Intersect att fungera men problemet som är kvar är att om jag gör som du säger så kan den nya random position fortfarande slumpas på en annan enemy.
Det hade ju inte varit några problem om Enemy1 och Enemy2 inte använder sig av samma klass samt ligger i samma list. På något sätt måste jag ju kunna säga till om enemy1 intersect med enemy2 så ska enemy1 flyttar 20 i X led. Men det får inte enemy 2 göra för då får de samma position igen.

Ja, du måste kontrollera att den nya positionen inte krockar med några andra fiender. Du måste kolla alla.
Om du tänker lite längre fram så kanske du har andra objekt som kan krocka. Väggar och andra hinder, dessa måste du också kontrollera.

Du borde fråga din spelplan på ett eller annat sätt om den nya positionen med en area är ok att placeras på spelplanen.

Visa signatur

ηλί, ηλί, λαμά σαβαχθανί!?

Permalänk
Medlem

Det kan inte vara så att din random inte är "korrekt"?
Hur går du tillväga för att slumpa ut?

Eller är det väldigt sällan du får ut samma värden?

Visa signatur

Corsair 16GB (4x4096MB) CL9 1600Mhz | Asus P8Z77-V PRO |
Samsung SSD Basic 830-Series 256GB | Intel Core i7 3770K 3,5Ghz |
Asus Xonar Essence STX | Noctua NH-U9B SE2 | Antec Performance One P280 | Corsair HX 850W 80+ Gold Modulär | MSI GTX 770

Permalänk
Skrivet av Leedow:

Ja, du måste kontrollera att den nya positionen inte krockar med några andra fiender. Du måste kolla alla.
Om du tänker lite längre fram så kanske du har andra objekt som kan krocka. Väggar och andra hinder, dessa måste du också kontrollera.

Du borde fråga din spelplan på ett eller annat sätt om den nya positionen med en area är ok att placeras på spelplanen.

Jag har koll på alla just nu som krockar. Enemy bullet, Enemy ship, Player bullet, Player, Powerup med player. Så det har jag fixat. Det är bara spawn med random position som jag har problem med.

Skrivet av NoPaiN^:

Det kan inte vara så att din random inte är "korrekt"?
Hur går du tillväga för att slumpa ut?

Eller är det väldigt sällan du får ut samma värden?

Det är inte ofta jag får ut samma värden för dom, men det är mest en princip sak för att få bättre kod så det inte kan hända.

Här är koden för när jag lägger till en ny Enemy samt att den får sin random position.

public void LoadEnemys() { //Creating random position to spawn at int randY = random.Next(-600, -50); int randX = random.Next(0, 750); //if there is less then 2 enemy ships spawn 1 new if (enemylist.Count() < amountofenemys) { //adding enemyship to the enemylist enemylist.Add(new Enemy(Content.Load<Texture2D>(@images/enemyship), new Vector2(randX, randY), Content.Load<Texture2D>(@images/projectile1))); } for (int i = 0; i < enemylist.Count; i++) { if (!enemylist[i].isVisible) { enemylist.RemoveAt(i); i--; } } }

Permalänk
Medlem
Skrivet av Johan Holm:

Jag har koll på alla just nu som krockar. Enemy bullet, Enemy ship, Player bullet, Player, Powerup med player. Så det har jag fixat. Det är bara spawn med random position som jag har problem med.

Det är inte ofta jag får ut samma värden för dom, men det är mest en princip sak för att få bättre kod så det inte kan hända.

Här är koden för när jag lägger till en ny Enemy samt att den får sin random position.

public void LoadEnemys() { //Creating random position to spawn at int randY = random.Next(-600, -50); int randX = random.Next(0, 750); //if there is less then 2 enemy ships spawn 1 new if (enemylist.Count() < amountofenemys) { //adding enemyship to the enemylist enemylist.Add(new Enemy(Content.Load<Texture2D>(@images/enemyship), new Vector2(randX, randY), Content.Load<Texture2D>(@images/projectile1))); } for (int i = 0; i < enemylist.Count; i++) { if (!enemylist[i].isVisible) { enemylist.RemoveAt(i); i--; } } }

Kan du inte återanvända kollisionsdetekteringen som du redan har? Finns det inte en sannolikhet att den nya slumpade fienden landar på exempelvis Player?

Jag tog bort dina kommentarer och la till egna. På detta vis tänker jag att det borde fungera.

public void LoadEnemys() { if (enemylist.Count() < amountofenemys) { //Instansierar ett Enemy-objekt med startvärden för X och Y till 0. var enemy = new Enemy(Content.Load<Texture2D>(@images/enemyship), new Vector2(0, 0), Content.Load<Texture2D>(@images/projectile1)) //Loopen sker minst en gång //Loopen sätter ny position på objektet //Loopen fortsätter om positionen för objektet anses vara olämpligt av en metod som hanterar kollisionsdetekteringen do { //Sätter Y-positionen på fienden enemy.Ypos = random.Next(-600, -50); //Sätter X-positionen på fienden enemy.Xpos = random.Next(0, 750); } while (!this.isValidPosition(enemy)) enemylist.Add(enemy); } for (int i = 0; i < enemylist.Count; i++) { if (!enemylist[i].isVisible) { enemylist.RemoveAt(i); i--; } } }

Visa signatur

ηλί, ηλί, λαμά σαβαχθανί!?