Diskuze: C# Jedna proměnná mezi třídami

C# .NET .NET (C# a Visual Basic) C# Jedna proměnná mezi třídami American English version English version

Avatar
coolomboc
Člen
Avatar
coolomboc:

Ahojte chtěl bych se zeptat jestli jde v C# sdílet promněnnou mezi třídami


class a class b
{ {
public float f = 0.5f; console.write­line(f);
} }
předem děkuji za odpověď

 
Odpovědět 9.11.2013 15:54
Avatar
coolomboc
Člen
Avatar
coolomboc:

class a------------------------------ class b
{-------------------------------------{
public float f = 0.5f;----------------console.write­line(f);
}-------------------------------------}

omlouvám se teď je to správně

 
Nahoru Odpovědět 9.11.2013 15:56
Avatar
Jan Vargovský
Redaktor
Avatar
Odpovídá na coolomboc
Jan Vargovský:

Když jí uděláš jako veřejnou a statickou, tak jí klidně můžeš sdílet. Ale je to takové prasácké řešení, zkus nastínit více problém a my ti poradíme lépe.

 
Nahoru Odpovědět 9.11.2013 15:58
Avatar
Paradise
Redaktor
Avatar
Odpovídá na Jan Vargovský
Paradise:

Podle čeho usuzuješ, že je to prasácké? Nechci nijak rýpat, jen mě to zajímá.

 
Nahoru Odpovědět 9.11.2013 16:05
Avatar
hypnozc
Člen
Avatar
hypnozc:

Tak já vím minimálně o dvou možnostech:

  1. udělej si tuto proměnnou statickou (bude patřit třídě, ne instanci). Pak tuto proměnou budeš nastavovat:
Class A
{
public static float f { get; set; }
}
Class B
{
ClassA.f = 0.5f;
}

nebo

  1. passovat data přes parametr:
ClassA
{
float f;
public ClassA()
{
ClassB NovaTridaB = new ClassB(f);
}
}
Class B
float f;
public ClassB(int parametr)
{
f = 0.5f;
}
{
}
Editováno 9.11.2013 16:10
Nahoru Odpovědět 9.11.2013 16:09
Schopný programátor si štěrbinu vždy najde...
Avatar
Kit
Redaktor
Avatar
Odpovídá na coolomboc
Kit:

Nejlépe to uděláš asi tak, že ji vytvoříš jako objekt, který předáš konstruktorům obou tříd.

Ty tvé kreace jsou pro mne poněkud nepochopitelné. Čeho chceš dosáhnout?

Nahoru Odpovědět 9.11.2013 16:12
Vlastnosti objektů by neměly být veřejné. A to ani prostřednictvím getterů/setterů.
Avatar
Jan Vargovský
Redaktor
Avatar
Odpovídá na Paradise
Jan Vargovský:

V tom, že by ty třídy byly navzájem závislé. To už bych si radši udělal strukturu/třídu s takovými daty a předal jí oboum těm třídám, které to budou využívat. Ale jak říkám, záleží na problému. Když mi řekne že je to class1 a class2 tak z toho nic nemám...

Editováno 9.11.2013 16:15
 
Nahoru Odpovědět  +1 9.11.2013 16:13
Avatar
Kit
Redaktor
Avatar
Odpovídá na hypnozc
Kit:

Podle původní ukázky soudím, že coolomboc vůbec nepotřebuje to, oč žádá. Raději bych počkal, až nám to blíže specifikuje.

Nahoru Odpovědět  +1 9.11.2013 16:16
Vlastnosti objektů by neměly být veřejné. A to ani prostřednictvím getterů/setterů.
Avatar
coolomboc
Člen
Avatar
coolomboc:

Přesněji řečeno potřebuji když autonarazí do překážky aby se nějak porovnaly hodnoty pozic mám totiž dvě třídy jednu pro auto a druhou pro překážku díky moc za ochotu

 
Nahoru Odpovědět 9.11.2013 16:45
Avatar
coolomboc
Člen
Avatar
coolomboc:

Jsem i schopný sdílet zdrojový kód

 
Nahoru Odpovědět 9.11.2013 16:46
Avatar
Kit
Redaktor
Avatar
Odpovídá na coolomboc
Kit:

Použij třídu Vector2, umí i počítat vzdálenosti.

Nahoru Odpovědět 9.11.2013 17:04
Vlastnosti objektů by neměly být veřejné. A to ani prostřednictvím getterů/setterů.
Avatar
coolomboc
Člen
Avatar
coolomboc:

Ano ale neumím porovnat hodnoty z těch dvou tříd a ano použivám vector2

 
Nahoru Odpovědět 9.11.2013 17:07
Avatar
coolomboc
Člen
Avatar
coolomboc:

Tady je ten zdroják a """""hra""""" :D

 
Nahoru Odpovědět 9.11.2013 17:14
Avatar
coolomboc
Člen
Avatar
coolomboc:
public class Car : Microsoft.Xna.Framework.DrawableGameComponent
    {

        public Texture2D car;
        private Game game;
        public Vector2 c = new Vector2(150, 0);
        public KeyboardState key;
        private float rotation = 0.0f;



        public Car(Game game)
            : base(game)
        {
            this.game = game; // TODO: Construct any child components here
        }

        /// <summary>
        /// Allows the game component to perform any initialization it needs to before starting
        /// to run.  This is where it can query for any required services and load content.
        /// </summary>
        public override void Initialize()
        {
            // TODO: Add your initialization code here

            base.Initialize();
        }

        protected override void  LoadContent()
        {
        car = game.Content.Load<Texture2D>(@"graphics\car");
            base.LoadContent();
        }


        /// <summary>
        /// Allows the game component to update itself.
        /// </summary>
        /// <param name="gameTime">Provides a snapshot of timing values.</param>
        public override void Update(GameTime gameTime)
        {

            if (GamePad.GetState(PlayerIndex.One).Buttons.Back == ButtonState.Pressed)
                this.Exit();
            key = Keyboard.GetState();


            // TODO: Add your update code here

            if (key.IsKeyDown(Keys.Left))
            {
                c.X--; c.X--;
                rotation = rotation - 0.02f;

            }else
                if (rotation < 0)
                {
                    rotation = rotation + 0.025f;
                    c.X--;
                }





            if (key.IsKeyDown(Keys.Right))
            {
                c.X++;c.X++;
                rotation = rotation + 0.02f;
            } else
                if (rotation > 0)
                {
                    rotation = rotation - 0.025f;
                    c.X++;
                }

            base.Update(gameTime);
        }

        private void Exit()
        {
            throw new NotImplementedException();
        }




        public override void Draw(GameTime gameTime)
        {
            game.spriteBatch.Begin();
            game.spriteBatch.Draw(car, new Vector2(c.X, 400), null, Color.White, rotation, new Vector2(car.Width / 2, car.Height / 2), 1, 0, 0);
            game.spriteBatch.End();
            base.Draw(gameTime);
        }


    }
}
Editováno 9.11.2013 17:38
 
Nahoru Odpovědět  -1 9.11.2013 17:15
Avatar
Kit
Redaktor
Avatar
Odpovídá na coolomboc
Kit:

Máš na to statickou metodu

float vzdalenost = Vector2.Distance(auto.pozice, zeď.pozice);

Pokud však jen vyhodnocuješ kolizi, použij raději

float vzdalenostNaDruhou = Vector2.DistanceSquared(auto.pozice, zeď.pozice);

Je podstatně rychlejší.

Nahoru Odpovědět 9.11.2013 17:19
Vlastnosti objektů by neměly být veřejné. A to ani prostřednictvím getterů/setterů.
Avatar
coolomboc
Člen
Avatar
coolomboc:
public class Bloky : Microsoft.Xna.Framework.DrawableGameComponent
    {
        private Game game;
        public Random rand = new Random();
        public bool preky = false;
        public bool prekya = true;
        public bool prekyb = false;
        public bool prekyc = false;
        public int rnd=0;
        public Texture2D prekazka, prekazkaa, prekazkab, prekazkac;
        public Vector2 pc  = new Vector2(0, -50);
        public Vector2 pb = new Vector2(0, -50);
        public Vector2 pa = new Vector2(0, -50);
        public Vector2 p  = new Vector2(0, -50);
        public float f = 1.0f;



        public Bloky(Game game)
            : base(game)
        {
            this.game = game;// TODO: Construct any child components here
        }

        /// <summary>
        /// Allows the game component to perform any initialization it needs to before starting
        /// to run.  This is where it can query for any required services and load content.
        /// </summary>
        public override void Initialize()
        {
            // TODO: Add your initialization code here

            base.Initialize();
        }

        protected override void LoadContent()
        {
            prekazka = game.Content.Load<Texture2D>(@"graphics\prekazka");
            prekazkac = game.Content.Load<Texture2D>(@"graphics\prekazka");
            prekazkab = game.Content.Load<Texture2D>(@"graphics\prekazka");
            prekazkaa = game.Content.Load<Texture2D>(@"graphics\prekazka");
            base.LoadContent();
        }
        /// <summary>
        /// Allows the game component to update itself.
        /// </summary>
        /// <param name="gameTime">Provides a snapshot of timing values.</param>
        public override void Update(GameTime gameTime)
        {
            // TODO: Add your update code here

            if (p.Y > 600)
                p.Y = -50;
            if (pa.Y > 600)
                pa.Y = -50;
            if (pb.Y > 600)
                pb.Y = -50;
            if (pc.Y > 600)
                pc.Y = -50;



            if (f < 12)
                f = 0.001f + f;
            int rnd = rand.Next(0, 2000);
            switch (rnd)
            {
                case 0: preky = true;
                    break;
                case 500: prekya = true;
                    break;
                case 1000: prekyb = true;
                    break;
                case 1500: prekyc = true;
                    break;
            }

            if (preky == true)
            {
                p.Y += f;
            }

            if (prekya == true)
            {
                pa.Y += f;
            }

            if (prekyb == true)
            {
                pb.Y += f;
            }

            if (prekyc == true)
            {
                pc.Y += f;
            }


            base.Update(gameTime);
        }


        public override void Draw(GameTime gameTime)
        {
            game.spriteBatch.Begin();
            game.spriteBatch.Draw(prekazka, new Vector2(0, p.Y), Color.White);
            game.spriteBatch.Draw(prekazkaa, new Vector2(100, pa.Y), Color.White);
            game.spriteBatch.Draw(prekazkab, new Vector2(200, pb.Y), Color.White);
            game.spriteBatch.Draw(prekazkac, new Vector2(300, pc.Y), Color.White);
            game.spriteBatch.End();
            base.Draw(gameTime);
        }






    }
}
Editováno 9.11.2013 17:37
 
Nahoru Odpovědět 9.11.2013 17:20
Avatar
David Čápka
Tým ITnetwork
Avatar
Odpovídá na coolomboc
David Čápka:

To ti nepřijde divné sem ten zdroják takhle vložit a to dokonce 2x zasebou? POUŽIJ TLAČÍTKO "VLOŽIT ZDROJOVÝ KÓD".

Nahoru Odpovědět  +1 9.11.2013 17:37
Miluji svou práci a zdejší komunitu, baví mě se rozvíjet, děkuji každému členovi za to, že zde působí.
Avatar
Zdeněk Pavlátka
Tým ITnetwork
Avatar
Odpovídá na coolomboc
Zdeněk Pavlátka:

Co takhle to vkládat jako kód.

Nahoru Odpovědět 9.11.2013 17:41
Kolik jazyků umíš, tolikrát jsi programátor.
Avatar
Jan Vargovský
Redaktor
Avatar
Odpovídá na coolomboc
Jan Vargovský:

To chceš řešit kolize? To se řeší o úroveň výš (alespoň já bych to tak řešil, v XNA nedělám, tak třeba se to řeší jinak) v nějakém kontroleru, který spravuje všechny ty prvky.

 
Nahoru Odpovědět 9.11.2013 17:43
Avatar
coolomboc
Člen
Avatar
Odpovídá na David Čápka
coolomboc:

Omlouvám se jsem strašný trolík a to tlačítko nefungovalo a stydím se za sebe

Editováno 9.11.2013 17:47
 
Nahoru Odpovědět 9.11.2013 17:45
Avatar
Odpovídá na coolomboc
Jakub Lásko[Saarix]:

Vector umí porovnávat vzálenosti, tak to přes ty 2 vektory můžeš porovnat, nebo to také lze udělat skrze rectangle.

btw. vektory máš ve třídách veřejné, tak není problém je v Game1 porovnat.

Nahoru Odpovědět 9.11.2013 18:10
Časem je vše možné.
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 21 zpráv z 21.