Hirdetés
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
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
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
É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 aFormBorderStyle = 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
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();
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.
WindowState = FormWindowState.Maximized;
Size=new Size(Screen.PrimaryScreen.WorkingArea.Width,Screen.PrimaryScreen.WorkingArea.Height);
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
Ú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:
{
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
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
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.
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.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
● ha kódot szúrsz be, használd a PROGRAMKÓD formázási funkciót!
- GYÖNYÖRŰ iPhone 13 Pro 128GB Graphite -1 ÉV GARANCIA - Kártyafüggetlen, MS3083
- Számlás!Windows 10 Pro 11 Pro,Windows 10 Home 11 Home, Office 2016,2019,2021 ,Vírusirtok,Mac
- Eladó karcmentes Realme 8 4/64GB / 12 hó jótállással
- GYÖNYÖRŰ iPhone 13 Pro 128GB Silver -1 ÉV GARANCIA - Kártyafüggetlen, MS3081
- Bomba ár! Dell Latitude 5401 - i5-9400H I 8GB I 256SSD I 14" FHD I HDMI I Cam I W11 I Gari!
Állásajánlatok
Cég: FOTC
Város: Budapest