Vánoční nadílka Vánoční nadílka
Vánoční akce! Daruj lepší budoucnost blízkým nebo sobě. Až +50 % zdarma na dárkové poukazy. Více informací

Diskuze: Jak správně použít časovač a jak použít proměnné ve hře?

C# .NET .NET (C# a Visual Basic) Jak správně použít časovač a jak použít proměnné ve hře? American English version English version

Aktivity (3)
Avatar
awertol
Člen
Avatar
awertol:18. listopadu 23:08

Zdravím, snažím se nějak udělat prográmek/hru, ve které by se uživatel "staral" o nějaké zvíře, jenže jsem se zasekl již na prvním problému. V návrhu mám udělané labely pro HLAD, SPÁNEK a ZÁBAVU, jenže netuším, jak jejich hodnotu zmenšit každých pár vteřin, aniž by to hodilo výjimku:

Operace mezi vlákny není platná: Přístup k ovládacímu prvku lb_hlad proběhl z jiného vlákna než z vlákna, v rámci kterého byl vytvořen.

Zde hlavní část kódu se kterou mám problém...

private static System.Timers.Timer timer;

        public Form1()
        {


            InitializeComponent();

            int hlad;
            int spanek;
            int zabava;

            hlad = Convert.ToInt32(lb_hlad.Text.ToString());
            spanek = Convert.ToInt32(lb_spanek.Text.ToString());
            zabava = Convert.ToInt32(lb_zabava.Text.ToString());

            timer = new System.Timers.Timer(5000);
            timer.Interval = 5000;
            timer.Elapsed += Snížení_hodnot;
            timer.AutoReset = true;
            timer.Enabled = true;

            void Snížení_hodnot(Object source, System.Timers.ElapsedEventArgs e)
            {
                hlad = hlad - 5;
                spanek = spanek - 5;
                zabava = zabava - 5;
                lb_hlad.Text = Convert.ToString(hlad);
                lb_spanek.Text = Convert.ToString(spanek);
                lb_zabava.Text = Convert.ToString(zabava);
            }

        }

Zkusil jsem: Jsem poměrně nováček a nevím si rady, zkoušel jsem přemístit deklarace int pro hlad, spánek i zábavu, vím, že bude problém někde v timeru, ale nevím jak to upravit.

Chci docílit: Toho aby se hodnota snižovala a zároveň se nová snížená hodnota zobrazila v labelu.

 
Odpovědět 18. listopadu 23:08
Avatar
Luboš Satik Běhounek
Autoredaktor
Avatar
Odpovídá na awertol
Luboš Satik Běhounek:19. listopadu 1:09

Ahoj, pouzij Timer z Forms, ten pouziva normalne mainthread, takze ti nebude hazet vyjimku.

A jinak obecne navrh her vetsinou vychazi ze zakladu, kde mas hlavni smycku, ve ktery se vsechno dela porad dokola, vypada asi takhle, do komentaru popisu, jak to muzes resit ty:

while (gameRunning) // nemusis resit, staci ti form a na nem forms.timer a v kazdym ticku opakovat
{
  ProcessInput(); // nemusis resit nijak extra, na formulari tohle resis pres onclick u tlacitek apod
  GameLogic(); // tady budes resit, co se ma stat v kazdym snimku, v tvym pripade chces snizit spanek o nejakou hodnotu, nejspis budes potrebovat mit spanek jako float a idealne spanek snizit o hodnotu vynasobenou delkou posledniho snimku, aby ti hra bezela porad stejne rychle, kdyz ti pobezi 10fps nebo 100 fps
  Draw(); // vykreslovani hry ty budes resit jen tim, ze budes updatovat treba label, ve kterym je hodnota spanku z hodnoty, co mas nekde ulozenou atd.
}
Akceptované řešení
+20 Zkušeností
+1 bodů
Řešení problému
Nahoru Odpovědět  +1 19. listopadu 1:09
https://www.facebook.com/peasantsandcastles/
Avatar
Luboš Satik Běhounek
Autoredaktor
Avatar
Luboš Satik Běhounek:19. listopadu 1:09

Jinak hlad, spanek apod. by nemely bejt zadny hodnoty u formulare, ale mel by sis na to vytvorit primo classu treba pro hrace nebo potvoru :)

Nahoru Odpovědět 19. listopadu 1:09
https://www.facebook.com/peasantsandcastles/
Avatar
ostrozan
Redaktor
Avatar
Odpovídá na awertol
ostrozan:19. listopadu 7:32

Tvůj hlavní problém ale je , že proměnné hlad,spanek , zabava a obslužnou metodu pro timer.Elapsed máš jako lokální v konstruktoru Formu. Takže je musíš umístit mimo, stejně tak nastavení hodnot proměnných provést nejlépe pomocí tlačítka.

Aby ti ti fungovalo musí to vypadat asi takhle:

public partial class Form1 : Form
{
    private static System.Timers.Timer timer;
    int hlad;
    int spanek;
    int zabava;

    public Form1()
    {
        InitializeComponent();
        timer = new System.Timers.Timer(5000);
        timer.Interval = 5000;//toto je zbytecne - hodnotu uz jsi nastavil o radek vyse
        timer.Elapsed += Snížení_hodnot;
        timer.AutoReset = true;
        timer.Enabled = true;
    }
    void Snížení_hodnot(Object source, System.Timers.ElapsedEventArgs e)
    {
        hlad = hlad - 5;
        spanek = spanek - 5;
        zabava = zabava - 5;
        lb_hlad.Text = Convert.ToString(hlad);
        lb_spanek.Text = Convert.ToString(spanek);
        lb_zabava.Text = Convert.ToString(zabava);
    }

    private void button_set_Click(object sender, EventArgs e)
    {
        hlad = Convert.ToInt32(lb_hlad.Text.ToString());
        spanek = Convert.ToInt32(lb_spanek.Text.ToString());
        zabava = Convert.ToInt32(lb_zabava.Text.ToString());
    }
}
 
Nahoru Odpovědět 19. listopadu 7:32
Avatar
awertol
Člen
Avatar
awertol:19. listopadu 17:48

Mockrát děkuji, už mi to funguje ^^
Ještě jeden malý dotaz, existuje nějaký snadný způsob jak vytvořit pop-up okno, ve kterém kupříkladu uživatel při startu hry zadal jméno toho zvířete, přičemž to by se pak zobrazovalo v hlavním okně?

 
Nahoru Odpovědět 19. listopadu 17:48
Avatar
Luboš Satik Běhounek
Autoredaktor
Avatar
Luboš Satik Běhounek:19. listopadu 19:55

proste si udelas dalsi form, na kterej hodis textbox a pripadne tlacitko, ten form pri startu zobrazis (nejspis budes chtit showmodal) a po odkliknuti tu hodnotu jen nastavis do hry. nemel bys mit ty hodnoty u formu, ale mel bys na hru mit tridu zvlast.

Nahoru Odpovědět 19. listopadu 19:55
https://www.facebook.com/peasantsandcastles/
Avatar
FicaV
Člen
Avatar
FicaV:28. listopadu 8:47

Jak byste řešili toto časování ve WPF, kde Timer z Form není?

 
Nahoru Odpovědět 28. listopadu 8:47
Avatar
Nahoru Odpovědět  +2 28. listopadu 9:11
Nikdy neříkej nahlas, že to nejde. Vždycky se totiž najde blbec, který to neví a udělá to...
Děláme co je v našich silách, aby byly zdejší diskuze co nejkvalitnější. Proto do nich také mohou přispívat pouze registrovaní členové. Pro zapojení do diskuze se přihlas. Pokud ještě nemáš účet, zaregistruj se, je to zdarma.

Zobrazeno 8 zpráv z 8.