Keresés

Hirdetés

!! SZERVERLEÁLLÁS, ADATVESZTÉS INFORMÁCIÓK !!
Köszönjük a sok biztatást, támogatást! Utolsó pillanat a féláras hirdetésfeladásra, előfizetésre!

Új hozzászólás Aktív témák

  • Tomi_78

    aktív tag

    válasz joysefke #10150 üzenetére

    Köszönöm a tanácsokat és a hivatkozásokat; meg is nézem mindjárt azokat.
    Egyébként arra is gondoltam, hogy az is okozhatja a hibát, hogy a programnak nem állítok be egy fő felbontást, hanem azt szeretném érni, hogy minden képernyőfelbontáson egyformán fusson, közel azonos kinézettel, tehát legfeljebb a monitor által lekicsinyítve vagy felnagyítva a képek. Lehet, hogy tévúton vagyok ezzel az elképzeléssel is...

  • Tomi_78

    aktív tag

    válasz joysefke #10148 üzenetére

    Köszi, tehát a Count-1. Csak azt furcsállom, hogy olyan különösen viselkedik ezzel, ha másik névtérbe viszem át egy változóban a Count-1 értéket, mint most az elhelyez alprogramba, mert minden tankot elmozdít.
    A másik, hogy igen, az induló Y koordinátáit akarom meghatározni a dolgoknak, de az nem olyan egyszerű, ha eltérő a képek mérete. Úgy meg tudom oldani, hogy a pályán legyen külön olyan lehetőség, hogy platform fölött a tank (van is), de ez fölösleges szaporítása az elemeknek. Az lenne az ideális, ha mindenhol csak a tank, stb. lenne és önműködően az alatta vagy felette (ami közelebb van) levő platformhoz igazodna, amikor létrejön.

  • Tomi_78

    aktív tag

    Sziasztok!
    Annak megválaszolásában kérném a segítségeteket, hogy egy listába a legutóbb beszúrt elem indexét hogyan lehet megkapni? Mert én most a listanév.Count-1 képletet használom hozzá, de valamiért ez nem jó.
    A programomban van egy palya nevű térkép, amely alapján elhelyezem a képernyőre a játék elemeit, viszont nem mindenhol illeszkednek így pontosan egymáshoz, amiknek kéne, pl. a szereplőknek a platformok fölé. Ezért azt csinálom, hogy a létrehozáskor az y koordinátájuk módosuljon úgy, hogy leessenek az alattuk levő platformra, és azután indulhatna a játék - de ez eddig nem sikerült nekem.
    Így néz ki most, felvázolva lényege:
    /*1: Játékos, 2: robot1, 3: platform, 4: platform és fölötte robot1, 5: tank1, 6: platform és fölötte tank1,
                7: ketrec, 8: platform fölötte ketreccel, 9: kis drón*/
                switch (mostpalya) {
                    case 1:
                        palya = new int[,]{{0,0,0,0,0,0,0,0,0,0},
                                        {0,0,9,0,0,0,0,0,5,0},
                                        {0,0,0,0,3,3,4,8,3,3},
                                        {0,0,0,0,0,0,0,0,0,0},
                                        {3,4,3,3,0,0,0,0,0,0},
                                        {0,0,0,0,0,0,0,0,0,0},
                                        {0,0,0,3,3,0,0,3,8,3},
                                        {0,0,0,0,0,0,0,0,0,0},
                                        {0,3,3,0,0,3,3,3,0,0},
                                        {2,0,0,0,1,0,0,0,0,5},
                                        };

    Aztán egy tank létrehozása:
    case 5:
                                    var egyell3 = new JatekElemei();
                                    egyell3.xhely = xh;
                                    egyell3.yhely = yh-tank1all.Height;
                                    egyell3.nezirany = "balra";
                                    egyell3.mitcsinal = "jarkal";
                                    egyell3.mostkepe = tank1all;
                                    egyell3.neve="tank1";
                                    egyell3.mozgseb = 6;
                                    egyell3.elete=3;
                                    egyell3.melyseg = 0;
                                    jatelemlista.Add(egyell3);
                                    elhelyez(jatelemlista.Count-1,egyell3.xhely,egyell3.yhely,egyell3.mostkepe.Width,egyell3.mostkepe.Height);
                                break;

    és az elhelyező alprogramok:
    void elhelyez(int jatelem, int xh, int yh, int kepszel, int kepmag) {
                while (yh<=Screen.PrimaryScreen.Bounds.Height-talcamag-cimsormag && kivelutkozik(jatelem,xh,yh+kepmag+1,kepszel,kepmag)==-1) {
                    yh+=1;
                }
                jatelemlista[jatelem].yhely = yh;
            }

    int kivelutkozik(int hivoobj, int ittx, int itty, int objkepszel, int objkepmag) {
                for (int i=0; i<jatelemlista.Count; i++) {
                    var je = jatelemlista[i];
                    if (hivoobj!=i && je.neve!="arcocska" && ittx<je.xhely+je.mostkepe.Width && ittx+objkepszel>je.xhely && itty<je.yhely+je.mostkepe.Height && itty+objkepmag>je.yhely) return i;
                }
                return -1;
            }

    És az a fő baj, hogy az elhelyez alprogram hívása az összes tankot elmozgatja, nemcsak a jatelem indexűt, ami elvileg a jatelemlista.Count-1.
    Az meg már csak a hab a tortán, hogy nem is jól teszi lentebb őket, hanem lóg a levegőben az egyik a kettő közül.

  • Tomi_78

    aktív tag

    Sziasztok!
    Egy kis 3D-szerű programot készítek C#-ban és ebben szükségem van arra, hogy tudjam, hogy egy pont melyik irányban van egy másiktól a síkban.
    Ehhez a következő képletet használom, miután kiböngésztem a világháló bugyraiból:
    Math.Atan2(kamnezy-(a_kamera.yhely+5),kamnezx-(a_kamera.xhely+5))*(180/Math.PI)A kamera 10 képpont sugarú kör, ezért a középpontja +5 pixellel van a szélétől. Illetve van a kamnezx-kamnezy pont, ami 20 képpontnyira van a kamera előtt, és egy fekete vonal jelzi az irányát és a végét a mellékelt képen. A képeltben e két pont egymáshoz viszonyított irányát vizsgálom, próbaképpen.
    Na de ami furcsa, az a visszaadott értékek. Ugyanis ha a kamera felfelé néz, akkor negatív számokat mutat irányként, míg ha lefelé, akkor a várttól teljesen eltérőt, pl. a képen látható 90-et a 270 helyett.
    Végül is tudom ezeket korrigálni (felfelé az Abs() függvény használatával, míg lefelé úgy, hogy az új irányérték az a régi + (180 - régi) legyen), és így megkapni a valós értékeket, de akkor is kíváncsi vagyok arra, hogy mi lehet ezen hibák oka?
    Netán mégis rossz a képlet?

  • Tomi_78

    aktív tag

    válasz joysefke #10090 üzenetére

    S valóban. Hát, erre bizony nem gondoltam volna sosem, hogy egy konkrét szám maga is lehet valamilyen típusú. De köszönöm szépen a segítséget; az int típusra állítás tényleg megoldotta.
    Amúgy csupán memóriatakarékossági okból lett volna szükségem a byte típusra, mert az id és idk nem lett volna több a programban, mint 255.

  • Tomi_78

    aktív tag

    Na, ez vajon miért van?
    Van egy saját osztály a programomban, a JatekElemei. Ebben egy public byte típusú, id nevű változó.
    Aztán adott egy idk nevű, 0 kezdőértékű globális változó a program elején:
    public partial class MainForm : Form
    {
    byte idk=0;

    És amikor létrehozom a JatekElemei egy példányát:
    var egyarc = new JatekElemei();
    (...)
    egyarc.id=idk+1;
    idk+=1;

    a következő hibaüzenet "örvendeztet meg" az egyarc.id=idk+1; sorral kapcsolatban:
    "A(z) „int” típus nem konvertálható implicit módon „byte” típusra. Van explicit konverzió (esetleg hiányzik egy típuskonverzió). (CS0266)"

    Kérdésem: hol van itt az int típus, mikor mindkettőt byte-ként adtam meg?

  • Tomi_78

    aktív tag

    válasz Alexios #10077 üzenetére

    Rendben, köszi a választ!
    Egyébként ami a var kulcsszóval van megadva változó, az nálam egy saját osztálynak a new utasítással létrehozott példánya. Ez milyen típust jelent?

  • Tomi_78

    aktív tag

    Hát igen, furcsa egy kicsit nekem a változókezelés, de azért csak kapisgálom, hogy C#-ban a blokkon vagy névtéren belül létrehozott változók csak ott érvényesek.
    De pl. az miért van, hogy ha megadok egy változót és ugyanazt if feltétel elágazásaiban használnám fel, akkor rendellenesen viselkedik tőle a programom?
    Akkor ezt így nem lehet?
    int valtozo;
    if (...) {
    valtozo = ...;
    (...)
    }
    (... még pár ugyanilyen if ág ...)
    if (...) {
    valtozo = ...;
    (...)
    }
    Tehát minden ághoz külön változónevet adjak meg? Ez kissé pazarlónak tűnik a változónevekkel.
    És ugyanezt tapasztaltam switch elágazásnál is:
    var valtozo;
    switch (...) {
    case 0: valtozo = ...;
    break;
    case 1: valtozo = ...;
    break;
    }
    Hibaüzenet ez utóbbinál: Az implicit típusmeghatározású lokális változókat inicializálni kell.

  • Tomi_78

    aktív tag

    Tanácsaitok alapján végül így hibaüzenetek nélkül működni kezdett a programom:
    int[,] palya = null;
                
    switch (mostpalya) {
         case 1:
               palya = new int[,]{{0,0,0,0,0,0,0,0,0,0},

    Akkor ezek szerint az első és legfőbb deklarálási helyen már értéket kell adni neki, még ha ez null is, illetve az utána következő, értékekkel történő feltöltés helyén használni kell a new int[,]-et?

  • Tomi_78

    aktív tag

    válasz joysefke #10069 üzenetére

    Sajnos nem, mert azt írja ki, hogy:
    Inicializálatlan „palya” lokális változó használata (CS0165)

    Pedig egyszer már deklarálva van, csak éppen a switch() névtéren kívül, az előtt.
    De nekem az kéne, hogy deklarálom egyszer a MainFormLoad() elején, és azon belül felhasználható legyen akármilyen belső szerkezetben.

  • Tomi_78

    aktív tag

    válasz joysefke #10067 üzenetére

    Töröltem, de akkor más hibaüzeneteket kapok:
    Érvénytelen elem a kifejezésben: „{” (CS1525)
    meg:
    Itt pontosvesszőnek ( ; ) kellene szerepelnie. (CS1002)
    és:
    Érvénytelen elem a kifejezésben: „,” (CS1525)

  • Tomi_78

    aktív tag

    Még egy kérdés: ha egy 2d tömböt deklarálok, de később, más névtéren belül inicializálnám, azt hogyan kell megtenni? Mert ez most hibás; azt írja, hogy: "Itt azonosítónak kellene szerepelnie."

    void MainFormLoad(object sender, EventArgs e)
            {
               int[,] palya;
                
               switch (mostpalya) {
                    case 1:
                               palya[,] = {{0,0,0,0,0,0,0,0,0,0},//Ennél írja a hibát!
                                        {0,0,0,0,0,0,0,0,0,0},
                                        {0,0,0,0,0,0,0,0,0,0},
                                        {0,0,0,0,0,0,0,0,0,0},
                                        {0,0,0,0,0,0,0,0,0,0},
                                        {0,0,0,0,0,0,0,0,0,0},
                                        {0,0,0,0,0,0,0,0,0,0},
                                        {0,0,0,0,0,0,0,0,0,0},
                                        {0,0,0,0,0,0,0,0,0,0},
                                        {2,0,0,0,1,0,0,0,0,2},
                                       };
                        break;
                }

    }

  • Tomi_78

    aktív tag

    válasz dqdb #10064 üzenetére

    Értem már.
    És arra van mód, hogy lekérdezzem a menüsor magasságméretét (ami most nálam 24 képpont, de ezt is az egér Y helyzetéből tudtam kikövetkeztetni)? Mert most a WorkingArea teteje (Top) 0-nál van, de mindig beleszámítja a fenti menüsort is, ami nekem nem kell.
    Vagy csakis az a megoldás, hogy eltüntetek mindenféle menüsort a
    FormBorderStyle = FormBorderStyle.None
    paranccsal?

  • Tomi_78

    aktív tag

    És az miért van, hogy így számítom ki az értékeket:
    kepernyomag=Screen.PrimaryScreen.Bounds.Height;
    talcamag=kepernyomag-Screen.PrimaryScreen.WorkingArea.Height;
    cimsormag=Screen.PrimaryScreen.WorkingArea.Height-ClientSize.Height;

    és ha a MainFormPaint-ben a DrawString-gel kiíratom, akkor kb. 40-nel eltérnek az értékek egymástól, ha a DrawString-ben a fenti változók szerepelnek attól, mintha változók helyett a konkrét számítást tenném be, ToString()-gel a végén?
    Tehát a DrawString(kepernyomag+"-"+talcamag...)
    nem ugyanazt adja, mint a
    DrawString(Screen.PrimaryScreen.Bounds.Height.ToString()...stb.

  • Tomi_78

    aktív tag

    válasz dqdb #10061 üzenetére

    Köszönöm a választ, Dqdb!
    Ez alapján elindulva a Tálca tetejét a következő kóddarabbal találtam meg (remélhetőleg):
    Screen.PrimaryScreen.WorkingArea.Height-(Screen.PrimaryScreen.WorkingArea.Height-ClientSize.Height)Remélem, ez különféle felbontások és méretezések esetén is megfelelően működik majd, de ezt csak próbálgatások után tudom megállapítani.

  • Tomi_78

    aktív tag

    Sziasztok!

    Kis programomat teljes képernyős módban futtatom az alábbi kóddarab segítségével:
    InitializeComponent();
                
    WindowState = FormWindowState.Maximized;
    Size=new Size(Screen.PrimaryScreen.WorkingArea.Width,Screen.PrimaryScreen.WorkingArea.Height);
    Viszont lent a Windows 10 tálcája belóg a programablakba, így van úgy, hogy a grafikai elemeket is takarja, ha éppen oda helyeződnek. Kerestem a Google-lal arra, hogy hogyan lehetne eltüntetni a Tálcát C#-ban, de nem találtam semmit ezzel kapcsolatban. Aztán most próbálom megnézni, hogy mennyi a képernyőfelbontás magassága, hogy abból kivonva valami értéket megkapjam a Tálca nélküli részt, de nem találok ilyen felbontásérték visszaadó függvényt, utasítást.
    Az is érdekes, hogy a Windows-ban megnézve a képernyőfelbontást, az 1920*1080, tehát 1080 képpont a magasság, viszont a C#-ot sehogysem bírom rávenni ezen érték kiírására, mert mindig 864-et mutat valamiért, mikor az egér Y koordinátáját kérdezem le, és a képernyő alján van, vagy így:
    e.Graphics.DrawString("Egér Yhely: "+Cursor.Position.Y+"-"+Screen.PrimaryScreen.Bounds.Height.ToString(),this.Font,new SolidBrush(Color.Black),2,2);Valaki el tudná magyarázni nekem erre a megoldást? Tehát:
    1. Miért 864 képpont nálam C#-ban a képernyőmagasság 1080 helyett?
    2. Hogyan kaphatom meg csak a hasznos területet a képernyőből, tehát a Tálca és a felső menüsor magassága nélküli értéket?

  • Tomi_78

    aktív tag

    Sziasztok!
    Egyedi képeket már tudok kezelni (betölteni és megjeleníteni) a C#-pal, de jó volna tudnom kezelni képcsíkokat.
    Van erre lehetőség és ha igen, hogyan, milyen utasítás alkalmas arra, hogy egy nagy képből kinyerjem annak alképeit és hozzárendeljem egy bitmap-hoz?

  • Tomi_78

    aktív tag

    válasz sztanozs #10057 üzenetére

    Azt nem tudom... Viszont közben rábukkantam egy megoldásra:
    Size=new Size(Screen.PrimaryScreen.WorkingArea.Width,Screen.PrimaryScreen.WorkingArea.Height);

  • Tomi_78

    aktív tag

    Úgy látszik, a WindowState nem állítja át az ablak Width és Height értékeit - legalábbis ha ezt a kódot alkalmazom és kiíratom az ablszel és ablmag változók értékeit, azok még mindig a 800*600-at mutatják, amik az InitializeComponent()-ben is be vannak állítva:
    InitializeComponent();
    WindowState = FormWindowState.Maximized;
    Size = new Size(Width,Height);
    ablszel=Size.Width;
    ablmag=Size.Height;

  • Tomi_78

    aktív tag

    És az miért van, hogy ha én maximumra állítom a játéktér ablakméretét, akkor induláskor a játékelemek az eredeti, 800*600-as beállításhoz alkalmazzák a koordinátáikat?
    Tehát az alábbi kód beállítja ugyan a képernyő kitöltésére a pályát, de ha pl. az a_jatekos példány lekérdezi magának induláskor a Width és Height koordinátákat, azok mintha még mindig 800 és 600 lennének, holott nálam 1600*900-nak kellene lenniük (kiírva is annyi), de mégis a közép elhelyezés helyett balra fel kerül a játékelem:
    InitializeComponent();
    WindowState = FormWindowState.Maximized;
    Size = new Size(Width,Height);

    a_jatekos = new Jatekos();
    a_jatekos.kepe = jaturhajokepe1;
    a_jatekos.xhely = Width/2+a_jatekos.kepe.Width;
    a_jatekos.yhely = Height-a_jatekos.kepe.Height*2;

  • Tomi_78

    aktív tag

    válasz Tomi_78 #10024 üzenetére

    Tanácsaitok alapján végül egy List használatával oldottam meg a problémát, mégpedig így:
    class JatekElemei
    {
        public int xhely,yhely;   
    }
            
    List<JatekElemei> jatelemeilista = new List<JatekElemei>();
            
    class Jatekos: JatekElemei
    {
        public Bitmap kepe;
        public byte animidozito=5,lovesvsz;
    };

    Jatekos a_jatekos;
           
    class JatLovedekei: JatekElemei
    {
        public Bitmap kepe;   
    };
            
    List<JatLovedekei> jatlovlista = new List<JatLovedekei>();
            
    class Deneverek: JatekElemei
    {
        public int dirx,diry;
        public Bitmap kepe;
        public byte animidozito=5;
    }

    List<Deneverek> deneverlista = new List<Deneverek>();

    Aztán minden példányt a létrehozásakor beleteszek ebbe a jatelemeilista listába, pl.:
    a_jatekos = new Jatekos();
    (...)
    jatelemeilista.Add(a_jatekos);

    S most már mehet rajta a foreach ciklus:
    foreach (var jatelem in jatelemeilista) {
            jatelem.xhely=...
                }


    Nekem jónak tűnik így, de ha láttok benne valami hibát, írjátok meg okvetlenül.

  • Tomi_78

    aktív tag

    Quailstorm: Ron Penton: Kezdő C# játékprogramozás c. könyvéből tanulom most az alapokat, valamint a világhálóról böngészgetve.
    Alexios: azt, hogy egy fő osztályból származik minden más osztály, azért csináltam, hogy megkönnyítsem a dolgom olyan esetekre, amikor a program összes elemén végig kell menni, pl. mentés esetére vagy ha az ablak átméretezésekor mindent új helyre kell rakni.
    Tehát ha mindennek van egy közös szülőobjektuma, akkor elvileg elég lenne ezen végigmenni az eredmény eléréséhez. Azt gondoltam, ehhez elég egy foreach ciklus, bár azt is, hogy az nem lesz jó, hogy a JatekElemei kétszer szerepel benne, mert nem tudom, hogy osztályokat milyen változótípusként kell megadni - már ha egyáltalán lehet.
    Akkor hozzak létre egy Listát is, amelybe belekerülnek az osztályobjektumok, és ennek a Listának a nevét adjam meg a foreach-ben az egyik JatekElemei helyett? Akkor így már lassanként elvész az egyszerűség, mert ezesetben ugyanúgy gondoskodni kell a Lista kezeléséről, amikor elemeket adok hozzá vagy törlök belőle.

  • Tomi_78

    aktív tag

    Még egy kérdés a tisztelt szakértőkhöz: van rá valamilyen mód C#-ban, hogy egyszerűen végigmenjek egy osztály tagjain? Mert most én kezdőként úgy próbálkoztam, hogy van egy fő osztály, amelyből minden más osztály származik a programban és foreach ciklussal próbálkozom elérni a tagokat - sikertelenül.
    Tehát ez a mostani kódom:
           class JatekElemei
            {
                public int xhely,yhely;    
            }
            
            class Jatekos: JatekElemei
            {
                public Bitmap kepe;
                public byte animidozito=5,lovesvsz; //alképváltó és lövésvisszaszámláló
            };
            
            class JatLovedekei: JatekElemei
            {
                public Bitmap kepe;    
            };
            
            List<JatLovedekei> jatlovlista = new List<JatLovedekei>();
            byte jatlovdb = 0;
            
            class Deneverek: JatekElemei
            {
                public int dirx,diry;
                public Bitmap kepe;
                public byte animidozito=5;
           };
    És így próbálok végigmenni rajtuk az ablak átméretezésekor:
            void MainFormResize(object sender, EventArgs e)
    {
    foreach (JatekElemei jatelem in JatekElemei) {
    jatelem.xhely*=Width/ablakszel;
    jatelem.yhely*=Height/ablakmag;
    }
    ablakszel=Width;
    ablakmag=Height;
    }
    Erre kapom ezt a hibaüzenetet:
    A(z) „Animacios.MainForm.JatekElemei” egy „típus” konstruktor, de „változó” konstruktorként használva. (CS0118)
    Most akkor mi hogyan van ebben a foreach-ben? Vagy ez nem is jó erre?
    Azért lenne jó valami hasonló megoldást találni, hogy amikor szükséges végigmenni valamiért a program összes elemén, el lehessen azt intézni egy ciklussal.

  • Tomi_78

    aktív tag

    Köszönöm mindhármótok segítségét!
    A List használatával sikerült működésre bírnom a programot:
    List<Deneverek> deneverlista = new List<Deneverek>();

  • Tomi_78

    aktív tag

    Sziasztok!

    Arraylist-et hogy kell használni arra, hogy osztályokat teszek bele és törlöm őket? Van néhány ilyen objektumom, amiket így hozok létre:
    public partial class MainForm : Form
        {    
            Bitmap deneverkepe1 = new Bitmap("kepei\\kisdenever1bmp.bmp");
            Bitmap deneverkepe2 = new Bitmap("kepei\\kisdenever2bmp.bmp");
            
            class Deneverek
            {
                public int dirx,diry,xhely,yhely;
                public Bitmap kepe;
            };
            
            Deneverek egydenever;
            System.Collections.ArrayList deneverlista = new System.Collections.ArrayList();
            public MainForm()
            {
                for (int i=0; i<3; i++) {
                    egydenever = new Deneverek();
                    
                    svsz = vsz.Next(1);
                    if (svsz==0) {
                        egydenever.dirx = -1;
                    } else {
                        egydenever.dirx = 1;
                    };
                    svsz = vsz.Next(1);
                    if (svsz==0) {
                        egydenever.diry = -1;
                    } else {
                        egydenever.diry = 1;
                    };
                    svsz = vsz.Next(1);
                    if (svsz==0) {
                        egydenever.kepe = deneverkepe1;
                    } else {
                        egydenever.kepe = deneverkepe2;
                    };
                    egydenever.xhely=vsz.Next(1,Width-egydenever.kepe.Width);
                    egydenever.yhely=vsz.Next(1,Height-egydenever.kepe.Height);
                    
                    deneverlista.Add(egydenever);
                };
    Eddig rendben is van (remélhetőleg), de ha pl. már ki akarom rajzolni őket így:
    void MainFormPaint(object sender, PaintEventArgs e)
            {
                for (int i=0; i<3; i++) {
                        var denever = deneverlista[i];
                        e.Graphics.DrawImage(denever.kepe,denever.xhely,denever.yhely,denever.kepe.Width,denever.kepe.Height);
                };
            }
    akkor hibaüzenetet kapok, hogy "„object” nem tartalmazza a(z) „dirx” metódus definícióját, és nem található olyan „dirx” kiterjesztésmetódus, amely „object” típusú első argumentumot fogad el (esetleg hiányzik egy „using” direktíva vagy egy szerelvényre mutató hivatkozás). (CS1061)"
    és ugyanez a többi változójára is.
    Azt szeretném, hogy legyenek ilyen képi objektumok a programomban, amikből később el is távolíthatok. Eredetileg sima tömbbel próbálkoztam, de azok tartalmát nem lehet megváltoztatni.

  • Tomi_78

    aktív tag

    válasz Keem1 #9348 üzenetére

    Utánanézek a könyvnek, bár nekem is vannak programozással (C++ és C# is) foglalkozó köteteim, igaz, végigolvasni még egyet sem volt időm vagy türelmem. Inkább célirányosan kutatok, ha szembesülök valami problémával, mert azt már nem kell nekem elmagyarázni, hogy mi a tömb, az elágazás vagy a ciklus, hanem inkább az olyan dolgokat, amik az adott fejlesztőkörnyezet sajátosságai, mint pl. hogy C#-ban hol kell elhelyezni a globális változókat a kódban vagy hogy bizonyos deklarálásokat milyen formában kell megadni.
    Lehet, hogy velem van a hiba, hogy szájbarágósan és nem bikkfanyelven várom el a szakkönyvektől is a magyarázatokat, dehát ez van.
    Az OOP lényegét is úgy mondanám el, hogy tagolva vannak benne a dolgok, az események csak azok szükségessége esetén hajtódnak végre, és nem folyamatosan, ciklikusan figyeli a program az összes tennivalót.

  • Tomi_78

    aktív tag

    válasz Tomi_78 #9346 üzenetére

    Na végre, minden működik, kivéve hogy a képek villognak egy kissé. Ezt nem lehet valahogy kiküszöbölni? Az Invalidate(); függvény ennyire akadozna?

  • Tomi_78

    aktív tag

    Bocs, az előbb javítottam és láttam, hogy nem kezdőérték nélküli a Deneverek tömb... Így javítottam a programomon, de most csak egy denevér jelenik meg, az sem animálódik és nem is mozog:
    namespace Animacios
    {    
        public partial class MainForm : Form
        {    
            Bitmap deneverkepe1 = new Bitmap("kepei\\kisdenever1bmp.bmp");
            Bitmap deneverkepe2 = new Bitmap("kepei\\kisdenever2bmp.bmp");
            
            class Deneverek
            {
                public int dirx,diry,xhely,yhely;
                public Bitmap kepe;
            };
            
            Deneverek[] egydenever;
            
            public MainForm()
            {
                //
                // The InitializeComponent() call is required for Windows Forms designer support.
                //
                InitializeComponent();
                //
                // TODO: Add constructor code after the InitializeComponent() call.
                //
                deneverkepe1.MakeTransparent();
                deneverkepe2.MakeTransparent();
                
                egydenever = new Deneverek[3];
                int svsz;
                for (int i=0; i<3; i++) {
                    egydenever[i]= new Deneverek();
                    System.Random vsz = new System.Random();
                    svsz = vsz.Next(1);
                    if (svsz==0) {
                        egydenever[i].dirx = -1;
                    } else {
                        egydenever[i].dirx = 1;
                    };
                    svsz = vsz.Next(1);
                    if (svsz==0) {
                        egydenever[i].diry = -1;
                    } else {
                        egydenever[i].diry = 1;
                    };
                    svsz = vsz.Next(1);
                    if (svsz==0) {
                        egydenever[i].kepe = deneverkepe1;
                    } else {
                        egydenever[i].kepe = deneverkepe2;
                    };
                    egydenever[i].xhely=vsz.Next(1,800-egydenever[i].kepe.Width);
                    egydenever[i].yhely=vsz.Next(1,600-egydenever[i].kepe.Height);
                };
            }
            void AnimIdozitoTick(object sender, EventArgs e)
            {
                for (int i=0; i<3; i++) {
                    if (egydenever[i].kepe==deneverkepe1) {
                        egydenever[i].kepe=deneverkepe2;
                    }
                    else {
                        egydenever[i].kepe=deneverkepe1;
                    };
                };
            }
            void MozgIdozitoTick(object sender, EventArgs e)
            {
                for (int i=0; i<3; i++) {
                    switch (egydenever[i].dirx) {
                        case -1:
                            if (egydenever[i].xhely>0) {
                                egydenever[i].xhely-=4;
                            }
                            else egydenever[i].dirx*=-1;
                        break;
                        case 1:
                            if (egydenever[i].xhely<800-egydenever[i].kepe.Width) {
                                egydenever[i].xhely+=4;
                            }
                            else egydenever[i].dirx*=-1;
                        break;
                    };
                    switch (egydenever[i].diry) {
                        case -1:
                            if (egydenever[i].yhely>0) {
                                egydenever[i].yhely-=4;
                            }
                            else egydenever[i].diry*=-1;
                        break;
                        case 1:
                            if (egydenever[i].yhely<600-egydenever[i].kepe.Height) {
                                egydenever[i].yhely+=4;
                            }
                            else egydenever[i].diry*=-1;
                        break;
                    };
                };
            }
            void MainFormPaint(object sender, PaintEventArgs e)
            {
                for (int i=0; i<3; i++) {
                        e.Graphics.DrawImage(egydenever[i].kepe,egydenever[i].xhely,egydenever[i].yhely,egydenever[i].kepe.Width,egydenever[i].kepe.Height);
                }
            }
        }
    }

  • Tomi_78

    aktív tag

    válasz Alexios #9343 üzenetére

    Szia Alexios!

    Köszönöm a választ; ezzel egyúttal azt a kérdésemet is megválaszoltad, hogy kezdőérték nélküli, dinamikus tömböt hogyan lehet létrehozni. :K
    Még javítottam a kódomon annyit, hogy a képe egy változóba kerüljön, tehát:
    class Deneverek
            {
                public int dirx,diry;
                public Bitmap kepe;
           };                      

    (...)
    if (svsz==0) {
                        egydenever[i].kepe = deneverkepe1;
                    } else {
                        egydenever[i].kepe = deneverkepe2;
                    };

    De ezek után pl. a kirajzolásban nem ismeri fel a képhez tartozó Left és Top változókat:
    void MainFormPaint(object sender, PaintEventArgs e)
            {
                for (int i=0; i<3; i++) {
                        e.Graphics.DrawImage(egydenever[i].kepe,egydenever[i].kepe.Left,egydenever[i].kepe.Top,egydenever[i].kepe.Width,egydenever[i].kepe.Height);
                }
            }

    Ez miért van?
    És hogy miért pont SharpDevelop? Martonxnek is válaszolva: már régebben a gépemen pihen letöltve és csak most vettem elő. Az tetszett benne annakidején, hogy ingyenes és kicsi: csak letöltöd, kitömöríted és használatra kész. Nem tudom, van-e még ilyen fejlesztőkörnyezet, de nekem egyelőre bejön. :K Azt viszont én is sajnálom, hogy már nem fejlesztik tovább a készítői.

  • Tomi_78

    aktív tag

    Sziasztok!
    Most kezdtem kóstolgatni a C# programozást, és ehhez egy kis grafikus programot írnék SharpDevelop környezetben. Viszont a programom futtatásakor azt írja ki, hogy:
    "Az "egydenever" név nem szerepel ebben a környezetben"
    illetve a DrawImage-ben a két utolsó paramétert (srcRect és units) nem ismeri, bár nem is tudom, hogy ide miket kéne megadni.
    Tudnátok segíteni ennek a két hibajelenségnek a megoldásában? Íme a kódom:
    using System;
    using System.Collections.Generic;
    using System.Drawing;
    using System.Windows.Forms;

    namespace Animacios
    {
        /// <summary>
        /// Description of MainForm.
        /// </summary>
        
        public partial class MainForm : Form
        {    
            Bitmap deneverkepe1 = new Bitmap("kepei\\kisdenever1bmp.bmp");
            Bitmap deneverkepe2 = new Bitmap("kepei\\kisdenever2bmp.bmp");
            
            class Deneverek
            {
                public int dirx,diry,kepe;
            };
            
            public MainForm()
            {
                //
                // The InitializeComponent() call is required for Windows Forms designer support.
                //
                InitializeComponent();
                //
                // TODO: Add constructor code after the InitializeComponent() call.
                //
                deneverkepe1.MakeTransparent();
                deneverkepe2.MakeTransparent();
                
                Deneverek[] egydenever = new Deneverek[3];
                int svsz;
                for (int i=0; i<3; i++) {
                    egydenever[i]= new Deneverek();
                    System.Random vsz = new System.Random();
                    svsz = vsz.Next(1);
                    if (svsz==0) {
                        egydenever[i].dirx = -1;
                    } else {
                        egydenever[i].dirx = 1;
                    };
                    svsz = vsz.Next(1);
                    if (svsz==0) {
                        egydenever[i].diry = -1;
                    } else {
                        egydenever[i].diry = 1;
                    };
                    svsz = vsz.Next(1);
                    if (svsz==0) {
                        egydenever[i].kepe = 0;
                    } else {
                        egydenever[i].kepe = 1;
                    };
                };
            }
            void AnimIdozitoTick(object sender, EventArgs e)
            {
                for (int i=0; i<3; i++) {
                    if (egydenever[i].kepe==0) {
                        egydenever[i].kepe=1;
                    }
                    else {
                        egydenever[i].kepe=0;
                    };
                };
            }
            void MozgIdozitoTick(object sender, EventArgs e)
            {
                for (int i=0; i<3; i++) {
                    switch (egydenever[i].dirx) {
                        case -1:
                            if (egydenever[i].Left>0) {
                                egydenever[i].Left-=4;
                            }
                            else egydenever[i].dirx*=-1;
                        break;
                        case 1:
                            if (egydenever[i].Left<800-egydenever[i].Width) {
                                egydenever[i].Left+=4;
                            }
                            else egydenever[i].dirx*=-1;
                        break;
                    };
                    switch (egydenever[i].diry) {
                        case -1:
                            if (egydenever[i].Top>0) {
                                egydenever[i].Top-=4;
                            }
                            else egydenever[i].diry*=-1;
                        break;
                        case 1:
                            if (egydenever[i].Top<600-egydenever[i].Height) {
                                egydenever[i].Top+=4;
                            }
                            else egydenever[i].diry*=-1;
                        break;
                    };
                };
            }
            void MainFormPaint(object sender, PaintEventArgs e)
            {
                for (int i=0; i<3; i++) {
                    if (egydenever[i].kepe==0) {
                        e.Graphics.DrawImage(deneverkepe1,egydenever[i].Left,egydenever[i].Top,srcRect, units);
                    }
                    else {
                        e.Graphics.DrawImage(deneverkepe2,egydenever[i].Left,egydenever[i].Top,srcRect, units);
                    }
                }
            }
        }
    }

Új hozzászólás Aktív témák