Avatar
Petr Nymsa
Redaktor
Avatar
Petr Nymsa:

Zdravíčko, tak nějak poprvé si vytvářím vlastní události a přemýšlím, jestli je tento návrh dobře. Mám třídu Button a zatím obsahuje dvě události - Click a Hover. Uvnitř třídy mám privátní metody obsluhující tyto dvě události. Při Hoveru se mění barva textu. Události jsou veřejné, abyych mohl mimo třídu jednoduše reagovat na kliknutí, přejetí myší apod. Abych zjistl, že jsem klikl, přejel myší apod volám veřejnou metodu Update, která bere Rectangle myši a bool jestli se stisklo levé tlačítko myši.

Je tento návrh dobře ? Děkuju za odpovědi :)

class Button
   {
       Texture2D texture;
       Rectangle rect;
       Vector2 textPosition;
       SpriteFont font;
       Color color;
       string text;

       public event EventHandler Click;
       public event EventHandler Hover;

       public Button(Texture2D texture, SpriteFont font, Vector2 position, string text)
       {

           this.texture = texture;
           this.text = text;
           this.font = font;
           Click += Button_Click;
           Hover += Button_Hover;
           color = Color.White;

           int size = text.Length * 14;
           this.textPosition = new Vector2(position.X + text.Length, position.Y);
           this.rect = new Rectangle((int)textPosition.X, (int)textPosition.Y, size - text.Length, 25);

       }

       void Button_Hover(object sender, EventArgs e)
       {
           if (color == Color.White)
               color = Color.Red;
           else color = Color.White;

       }

       void Button_Click(object sender, EventArgs e)
       {

       }

       public void Draw(BetterSpriteBatch spriteBatch)
       {
           if (texture != null)
               spriteBatch.Draw(texture, rect, Color.White);
           spriteBatch.DrawString(font, text, textPosition,color);
       }

       public void Update(Rectangle mouse,bool clicked)
       {
           if (CheckCollision(mouse) && clicked)
           {
               Click(null, EventArgs.Empty);
           }
           else if (CheckCollision(mouse))
               Hover(null, EventArgs.Empty);
       }

       public bool CheckCollision(Rectangle rect)
       {
           return this.rect.Intersects(rect);
       }
   }
Odpovědět 5.5.2013 15:48
Pokrok nezastavíš, neusni a jdi s ním vpřed
Avatar
Petr Nymsa
Redaktor
Avatar
Petr Nymsa:

Nechci zakládat nové vlákno. Nevíte proč to padá :/

tx = new Texture2D(device, rect.Width, rect.Height);
            Color[] p = new Color[rect.Width * rect.Height];
            for (int i = 0; i < p.Length; i++)
                p[i] = Color.Blue;
            tx.SetData(p);

Spadne to hned na prvním řádku, kdy se zakládá textura

HRESULT: [0x80070057], Module: [Unknown], ApiCode: [Unknown/Unknown], Message: The parameter is incorrect.

Používám MonoGame pro Win8 (Metro). Nesetkali jste se s tím někdo ?

Editováno 5.5.2013 17:42
Nahoru Odpovědět 5.5.2013 17:41
Pokrok nezastavíš, neusni a jdi s ním vpřed
Avatar
Jan Vargovský
Redaktor
Avatar
Jan Vargovský:

Jen jsem natom koukl, použilíval jsi to už v praxi? Jde mi jen o to, že tam je docela dost věcí, které ti chybí(nebo alespoň mi by chyběly), ale na ně přijdeš sám postupem času :)
Btw, řekl bych že se VS nebude líbit, že máš nazvanou třídu jako jejich, ale tím si teď nejsem jistý.
EDIT: K tvojí chybě našel jsem toto:
Looks like a corrupted assembly being referenced.

Clear both:

the \bin folder of your project

the temp folder (should be C:\Users\your_u­sername\AppDa­ta\Local\Temp\Tem­porary ASP.NET Files in windows 7)

and see if the error still happens

from stackoverflow.com

Editováno 5.5.2013 17:57
 
Nahoru Odpovědět 5.5.2013 17:55
Avatar
Jan Vargovský
Redaktor
Avatar
Jan Vargovský:

Tak jsem ještě googloval a vypadá to na nějaké dll-ka nebo něco s registrama, však dej do googlu ten error + typ OS a chybu vyřešíš i sám.

 
Nahoru Odpovědět 5.5.2013 18:00
Avatar
Petr Nymsa
Redaktor
Avatar
Odpovídá na Jan Vargovský
Petr Nymsa:

Ano, vytvoření takto textury v klasickém XNA / MonoGame pro Desktop funguej zcela v pořádku. V projektu i na jiných místech takto taky tvořím textury a funguje to. Textury slouží jenom pro debug (zde například kolize myši s tlačítkem).

Když nevyužívám WinForm stejný název podle mě nevadí :)

Nahoru Odpovědět 5.5.2013 18:06
Pokrok nezastavíš, neusni a jdi s ním vpřed
Avatar
Petr Nymsa
Redaktor
Avatar
Petr Nymsa:

Prosím znova o pomoc. Mám tedy třídu Button obsahující event Click. Ve třídě Menu (představuje menu), mám několik Buttonu. Každému Buttonu přiřazuju stejnou metodu pro obsluhu Click.

double width = g.CoreScreen.Bounds.Width;
          double height = g.CoreScreen.Bounds.Height;
          string[] names=new string[]{"New Game","Load Game","Settings"};
          for (byte i = 0; i < 3; i++)
          {
              Vector2 size=g.FontGinkoBig.MeasureString(names[i]);
              buttons.Add(new Button(null,g.FontGinkoBig,new Vector2((int)(width/2-size.X/2),250+(i*size.Y+25)),names[i],i));
              buttons[i].Click+=Menu_Click;
          }

Metoda Menu_Click

private void Menu_Click(object sender, EventArgs e)
       {
           Button btn = (Button)sender;

           switch (btn.ID)
           {
               case 0: break;
               case 1: break;
               case 2: break;
           }

       }

Třída Button

class Button
    {
        Texture2D texture;
        Rectangle rect;
        Vector2 textPosition;
        SpriteFont font;
        Color color;
        string text;

        public byte ID { get; private set; }



        public event EventHandler Click;
        public event EventHandler Hover;

        public Button(Texture2D texture, SpriteFont font, Vector2 position, string text, byte id )
        {

            this.texture = texture;
            this.text = text;
            this.font = font;
            this.ID = id;
            Hover += Button_Hover;
            color = Color.White;

            Vector2 fontSize = font.MeasureString(text);

            int size = (int)(fontSize.X);
            this.textPosition = new Vector2(position.X + text.Length, position.Y);
            this.rect = new Rectangle((int)textPosition.X, (int)textPosition.Y, size, font.LineSpacing);


        }

        void Button_Hover(object sender, EventArgs e)
        {
            color = Color.Red;
        }

        public void Draw(BetterSpriteBatch spriteBatch)
        {


            if (texture != null)
                spriteBatch.Draw(texture, rect, Color.White);
            spriteBatch.DrawString(font, text, textPosition,color);
        }

        public void Draw(BetterSpriteBatch spriteBatch, Texture2D tx)
        {


            if (texture != null)
                spriteBatch.Draw(texture, rect, Color.White);
            spriteBatch.Draw(tx, rect, Color.White);
            spriteBatch.DrawString(font, text, textPosition, color);
        }

        public void Update(Rectangle mouse,bool clicked)
        {
            color = Color.White;
            if (CheckCollision(mouse) && clicked)
            {
                Click(this, EventArgs.Empty);
            }
            else if (CheckCollision(mouse))
                Hover(null, EventArgs.Empty);
        }

        public bool CheckCollision(Rectangle rect)
        {
            return this.rect.Intersects(rect);
        }
    }

Při kliknutí se v pohodě metoda Menu_Click zavolá, sender se správně přetypuje na Button ale jakmile to skočí do switche hází mi to tuto chybu
(DisconectedCon­textException)

Transition into COM context 0xa1e948 for this RuntimeCallableWrapper failed with the following error: Exception from HRESULT: 0xE0434352. This is typically because the COM context 0xa1e948 where this RuntimeCallableWrapper was created has been disconnected or it is busy doing something else. Releasing the interfaces from the current COM context (COM context 0xa1e890). This may cause corruption or data loss. To avoid this problem, please ensure that all COM contexts/apartments/threads stay alive and are available for context transition, until the application is completely done with the RuntimeCallableWrappers that represents COM components that live inside them.

Prosím, co dělám špatně ? Nebo je návrh zcela v pořádku a já zase mám někde nějakou pitomost ?

//EDIT
Když vyhodím switch a zkusím to přes podmínky, vše funguje. Co je tohle zase za chybku ?

Editováno 5.5.2013 19:37
Nahoru Odpovědět 5.5.2013 19:34
Pokrok nezastavíš, neusni a jdi s ním vpřed
Avatar
Petr Nymsa
Redaktor
Avatar
Petr Nymsa:

Nevíte někdo ?

Nahoru Odpovědět 5.5.2013 20:14
Pokrok nezastavíš, neusni a jdi s ním vpřed
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 7 zpráv z 7.