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í.
Avatar
Pepa Mochr Vladik:27.5.2020 8:05

Ahoj, před 2 roky jsem udělal mikro "hru" ve vb.net a xna ( https://www.youtube.com/watch?… ) ,ale kod byl, slusne receno spatny.
Nyní mám chut si trochu "odpocnout" od kresleni a 3D tisku a rad bych to modernizoval.
Chtel bych se drzet C# a monogame, coz je nastupce prave XNA. s C# zkusenosti nemam, jen par jednoduchych tutorialu na syntaxi. Zaroven je pro me nove OOP, coz teoreticky chapu ale prakticky v tom plavu.
Zkusil jsem udelat vykresleni cary objektove, a to dvema zpusoby.
Funguje to, otazka ovsem zni: je to spravne?
nebo to jde zjednodusit,ci je to blbost a takhle se to nedela?

Dekuji za odpovedi

prikladam kod
PS. je rozdil pouzivat PromennaPoziceX X Promenna_pozice_x ?
proc se temer vsude pouzivat prvni forma?

Zkusil jsem: //Game1.cs

using Game1;
using Microsoft.Xna.Framework;
using Microsoft.Xna.Framework.Graphics;
using Microsoft.Xna.Framework.Input;

namespace Monogame_draw
{


    /// <summary>
    /// This is the main type for your game.
    /// </summary>
    public class Game1 : Game
    {
        GraphicsDeviceManager graphics;
        SpriteBatch spriteBatch;


        Texture2D pixel;
        Draw_line cara;


        public Game1()
        {
            graphics = new GraphicsDeviceManager(this);



            Content.RootDirectory = "Content";

        }


        protected override void Initialize()
        {
            // TODO: Add your initialization logic here

            base.Initialize();
            cara = new Draw_line();



        }


        protected override void LoadContent()
        {
            // Create a new SpriteBatch, which can be used to draw textures.
            spriteBatch = new SpriteBatch(GraphicsDevice);
            pixel = Content.Load<Texture2D>("pixel");


            // TODO: use this.Content to load your game content here
        }


        protected override void UnloadContent()
        {

        }


        protected override void Update(GameTime gameTime)
        {
            if (GamePad.GetState(PlayerIndex.One).Buttons.Back == ButtonState.Pressed || Keyboard.GetState().IsKeyDown(Keys.Escape))
                Exit();




            base.Update(gameTime);
        }


        protected override void Draw(GameTime gameTime)
        {
            GraphicsDevice.Clear(Color.CornflowerBlue);
            spriteBatch.Begin(SpriteSortMode.FrontToBack, BlendState.AlphaBlend);

            //prvni definice bodu
            int x = 10;
            int y = 10;
            int delka = 50;
            int tloustka = 1;

            cara.Pozice = new Vector2(x, y);
            cara.Textura = pixel;

            //vykresleni horizontalni cary
            cara.Draw_H(spriteBatch, pixel, new Vector2(x, y), delka, tloustka, Color.Lime);

            //vykresleni vertikalni cary
            cara.Draw_V(spriteBatch, pixel, new Vector2(x, y), delka, tloustka, Color.Lime);

            //---------------------------------------------------------------------------------
            //zmena hodnot cary
            cara.Pozice = new Vector2(20, 80);
            cara.Delka = 150;
            cara.Tloustka = 3;
            cara.Barva = Color.Red;

            //jednodusi vykresleni
            cara.Draw_H(spriteBatch);

            //prepsani cary a vykresleni horizontalni cary
            cara.Draw_H(spriteBatch, pixel, new Vector2(0, 300), 1000, 5, Color.Blue);


            // TODO: Add your drawing code here
            spriteBatch.End();
            base.Draw(gameTime);
        }
    }
}

//Draw_line.cz

using Microsoft.Xna.Framework;
using Microsoft.Xna.Framework.Graphics;

namespace Game1
{
    public class Draw_line
    {
        public Texture2D Textura { get; set; }
        public Vector2 Pozice { get; set; }

        public int Delka { get; set; }

        public int Tloustka { get; set; }

        public Color Barva { get; set; }

        public virtual void Draw_H(SpriteBatch sb, Texture2D textura, Vector2 pozice, int delka, int tloustka, Color barva)
        {
             sb.Draw(textura, pozice, new Rectangle((int)pozice.X, (int)pozice.Y, delka - (int)pozice.X, tloustka), barva);
        }

        public virtual void Draw_H(SpriteBatch sb)
        {
            sb.Draw(Textura, Pozice, new Rectangle((int)this.Pozice.X, (int)this.Pozice.Y, this.Delka - (int)this.Pozice.X, this.Tloustka), this.Barva);
        }

        public void Draw_V(SpriteBatch sb, Texture2D textura, Vector2 pozice, int delka, int tloustka, Color barva)
        {
            sb.Draw(textura, pozice, new Rectangle((int)pozice.X, (int)pozice.Y, tloustka, delka - (int)pozice.X), barva);
        }

    }
}

Chci docílit: Pochopeni OOP

Editováno 27.5.2020 8:06
 
Odpovědět
27.5.2020 8:05
Avatar
Jan Stodůlka
Tvůrce
Avatar
Jan Stodůlka:27.5.2020 9:23

Myslím, že Draw_line nemá jasně definovanou funkci. Máš to jen jako zapouzdření vykreslení čáry.
Spíše udělej třídy, které vykreslí celé složité objekty a tím skryješ příkazy pro výpočet souřadnic...
Např:

levelBackgroud.Draw();
machine.Draw();
persons.Draw();

Pak např. po změně levelu, jen vyměníš instanci levelBackgroud za jinou, ale hlavní smyčka ti zůstane stejná. Kód je tak i lépe čitelnější.

Dále bych do tvého příkladu to třídy Draw_line dal do konstruktoru instanci spriteBatch - pokud by to z pohledu životního cyklu šlo.

Také v jedné metodě Draw_H používáš instanční vlastnosti Delka, Tloustka a v druhé to předáváš přes parametry.
Lepší by bylo první Draw_H udělat statickou a ze druhé Draw_H volat tu první. Pokud totiž upravíš vykreslení čáry, pak to musíš upravit na dvou místech.

Nejlepší na naučení je něco naprogramovat. Z mých zkušeností plyne, že každý první projekt na nové technologii je hrozný. Tak se toho neboj a přemýšlej nad tím a vylepšuj.
Klidně napiš, kdyby jsi chtěl poradit. :-)

Nahoru Odpovědět
27.5.2020 9:23
Nechodím do hospody, protože doma programuji.
Avatar
Jan Stodůlka
Tvůrce
Avatar
Jan Stodůlka:27.5.2020 9:43

V C# se používá tato konvence: PromennaPoziceX

Pročti si + stránky v menu kolem:
https://docs.microsoft.com/…tifier-names

Nahoru Odpovědět
27.5.2020 9:43
Nechodím do hospody, protože doma programuji.
Avatar
Peter Mlich
Člen
Avatar
Peter Mlich:27.5.2020 12:17

Obvykle se pro funkce a class pouziva PromennaPoziceX. Pro promenne promenna_pozice_x. Jestli to jazyku nevadi, pouzivej, co se ti zda vic lepsatejsi.

OOP se pouziva tak, ze zapouzdrujes spolecne prvky k sobe. Neco jako namespace.
Co bych ti doporucil, aby jsi vedl datove struktury zvlast a funkce zvlast. Schematicky asi nejak takto (presny cecko zapis bych si musel nastudovat)

class ClassPlayer(int delka, int tloustka)
{
int delka = delka;
int tloustka = tloustka;
}

list_player;
item_player;
item_player = new ClassPlayer(x, y); // nebo jeste pouzivam new_player
list_player.add(item_player); // list_players[0] = item_player; // list_players[0] = new ClassPlayer(x, y)

classPlayerFunc() - upravy playera
classPlayerFunc.uberzivoty(player)
classPlayerListFunc() - pridani, odebrani z playerlistu, import, export

class ClassGame()
{
game.playerList = new classPlayerListFunc(list_player)
game.player = new classPlayerFunc()
}

Cili, podobne, jak resis tu carou. Nebo pouzivam i toto:

game ()
{
private playerAdd() ...
private playerRemove() ...
}
Editováno 27.5.2020 12:19
 
Nahoru Odpovědět
27.5.2020 12:17
Avatar
Peter Mlich
Člen
Avatar
Peter Mlich:27.5.2020 12:28
levelBackgroud.Draw();
machine.Draw();
persons.Draw();

// To bych prave resil takto
level = list_level[i];
machine = list_machine[j];
persons = list_personsl[k];
FnLevel.Draw(level);
FnMachine.Draw(machine);
FnPerson.Draw(person);
// cili, predas objektu s funkcemi pro level data pro level a a pouzijes pro nej funkci Draw
 
Nahoru Odpovědět
27.5.2020 12:28
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 5 zpráv z 5.