Vydělávej až 160.000 Kč měsíčně! Akreditované rekvalifikační kurzy s garancí práce od 0 Kč. Více informací.
Hledáme nové posily do ITnetwork týmu. Podívej se na volné pozice a přidej se do nejagilnější firmy na trhu - Více informací.

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

Aktivity
Avatar
awertol
Člen
Avatar
awertol:18.11.2018 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.11.2018 23:08
Avatar
Odpovídá na awertol
Luboš Běhounek Satik:19.11.2018 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í
+2,50 Kč
Řešení problému
Nahoru Odpovědět
19.11.2018 1:09
https://www.facebook.com/peasantsandcastles/
Avatar
Luboš Běhounek Satik:19.11.2018 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.11.2018 1:09
https://www.facebook.com/peasantsandcastles/
Avatar
ostrozan
Tvůrce
Avatar
Odpovídá na awertol
ostrozan:19.11.2018 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.11.2018 7:32
Avatar
awertol
Člen
Avatar
awertol:19.11.2018 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.11.2018 17:48
Avatar
Luboš Běhounek Satik:19.11.2018 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.11.2018 19:55
https://www.facebook.com/peasantsandcastles/
Avatar
FicaV
Člen
Avatar
FicaV:28.11.2018 8:47

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

 
Nahoru Odpovědět
28.11.2018 8:47
Avatar
Nahoru Odpovědět
28.11.2018 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.