C# XNA - Nefunkční randomizátor   otázka

C#, XNA

Dobrý den, jsem začátečník v XNA a vytvářím si drobnou hru.

Narazil jsem na problém: Když chci cyklem naplnit pole o x prvků náhodnými čísly, tak mi to tam nenaháže náhodná čísla, nýbrž stejná.

Myslím že je to tím, že se čísla generují ve stejnou dobu a proto se jejich hodnota nemění. Jestli je to pravda, tak mě napadá v každém tiku cyklu pozastavit program na pár milisekund.

Takže moje otázka zní: Jak vygenerovat náhodná čísla v jedné milisekundě?

Jde to vůbec?

Jo a ještě bych se chtěl zeptat jak pozastavit běh programu v XNA na určitý čas... Předem děkuji za odpovědi.

nahlásit spamnahlásit spam 0 odpovědětodpovědět

Zapomněl jste uvést to nejdůležitější: jak generujete náhodná čísla. Vhodné řešení je použití pseudonáhody poskytované třídou random:

Dim random = New Random()
For index = 0 To 9
  ' náhodné číslo od nuly do devíti (!)
  Dim nahodneCislo = random.Next(0, 10)
Next
nahlásit spamnahlásit spam 0 odpovědětodpovědět

Ano, přesně tuhle třídu používám...

nahlásit spamnahlásit spam 0 odpovědětodpovědět

Pokud se Vám přesto generují stejné sady čísel, nejspíš je problém ve způsobu, jakým náhodu používáte. Třída Random je určeno k tomu, aby existovala jedna její instance co vlákno (není thread-safe), takže nejlepší bude si ve třídě, která drží informace o hře vytvořit veřejný člen, který bude obsahovat instanci náhody, kterou vytvoříte v konstuktoru herní třídy. Po celou dobu existence herní třídy (ba celé aplikace) tedy přistupujte pouze k tomuto jednomu objektu Random.

nahlásit spamnahlásit spam 0 odpovědětodpovědět

No ono jde spíše o to, že cyklem vytvářím objekty a skládám je do pole. Konstruktor zavolá metodu, která vždy vytvoří náhodné číslo a uloží ho do členské proměnné aktuálního objektu. Můj problém je, že každý objekt si do své proměnné vygeneruje stejné číslo.

Zde je hlavní část mé třídy:

public class balon
    {      
        public Texture2D ballon;
        public int X;
        public int Y;
        public Random rnd; 

        public balonek(Texture2D loadedsprite)
        {
            rnd = new Random();
           ballon = loadedsprite;     
           generateposition(); // jde se generovat
        }

        public void generateposition()
        { 
            X = rnd.Next(1320);     
            Y = 768 + rnd.Next(300);
        }
}

nahlásit spamnahlásit spam 0 odpovědětodpovědět

Jo pardon špatně jsem to překopíroval, ta funkce balonek je konstruktuktor samozřejmě, třída se jmenuje balonek.

nahlásit spamnahlásit spam 0 odpovědětodpovědět

Jak jsem říkal, chyba je v tom, že generátor náhodných čísel vytváříte pro každou instanci třídy Balon. Vzhledem k tomu, že se ty instance vytvářejí rychlostí blesku, má generátor pořád stejný seed - aktuální čas, a proto produkuje stejná čísla. Řešení je následující:

public class Game
{
  // Vytvořena jedna instance generátoru pro celou hru
  public static Random Random = new Random();

}
public class Ball
{
  public int X { get; set; }
  public int Y { get; set; }
  public Ball()
  {
    this.X = Game.Random.Next(0, 200);
    this.Y = Game.Random.Next(0, 200);
  }
}

nahlásit spamnahlásit spam 1 / 1 odpovědětodpovědět

Velmi děkuji za pomoc, funguje podle mých představ.

nahlásit spamnahlásit spam 1 / 1 odpovědětodpovědět

Další možnost je použít implementaci, kterou jsem uvedl zde:

http://www.vbnet.cz/blog-clanek--411-net...

nahlásit spamnahlásit spam 0 odpovědětodpovědět
                       
Nadpis:
Antispam: Komu se občas házejí perly?
Příspěvek bude publikován pod identitou   anonym.
  • Administrátoři si vyhrazují právo komentáře upravovat či mazat bez udání důvodu.
    Mazány budou zejména komentáře obsahující vulgarity nebo porušující pravidla publikování.
  • Pokud nejste zaregistrováni, Vaše IP adresa bude zveřejněna. Pokud s tímto nesouhlasíte, příspěvek neodesílejte.

přihlásit pomocí externího účtu

přihlásit pomocí jména a hesla

Uživatel:  
Heslo:  

zapomenuté heslo

 

založit nový uživatelský účet

zaregistrujte se

 
zavřít

Nahlásit spam

Opravdu chcete tento příspěvek nahlásit pro porušování pravidel fóra?

Nahlásit Zrušit

Chyba

zavřít

feedback