BME MOGI Gépészeti informatika 16. 1. feladat Írjon alkalmazást, melyben egy 4 pixel sugarú, pirosra kifestett kört egy másik körön mozgat! A mozgást időzítő vezérelje! Megoldási mód: Windows Forms alkalmazás Oktatási cél: rajzelemek mozgatásának bemutatása Az elkészítendő form: A form vezérlői tulajdonságainak beállításai: Form1 Form Size 400;400 Text Mozgó kör timer1 Timer Enabled True Interval 100 A Form1 osztályba írandó programkód: double szög = 0; Point pont = new Point(); // a kör középpontja int sugár = 0; // a kör sugara private void Form1_Paint(object sender, PaintEventArgs e) Graphics g = e.graphics; // a nagy kör befoglaló téglalapja Rectangle t1 = new Rectangle(pont.X - sugár, pont.y - sugár, 2 * sugár, 2 * sugár); g.drawellipse(pens.black,t1); // a kis kör középpontjának koordinátái int x = pont.x + Convert.ToInt32(sugár * Math.Cos(szög / 180 * Math.PI)); int y = pont.y - Convert.ToInt32(sugár * Math.Sin(szög / 180 * Math.PI)); // a kis kör befoglaló téglalapja Rectangle t3 = new Rectangle(x - 4, y - 4, 8, 8); g.fillellipse(brushes.red, t3); 1
2. feladat private void Form1_Load(object sender, EventArgs e) pont.x = this.clientsize.width / 2; // a nagy kör középpontja és sugara pont.y = this.clientsize.height / 2; sugár = 3 * Math.Min(pont.X, pont.y) / 4;; private void Form1_Resize(object sender, EventArgs e) Form1_Load(sender, e); Refresh(); private void timer1_tick(object sender, EventArgs e) Refresh(); szög = (szög + 5) % 360; Készítsen alkalmazást, amely az ablak közepén álló billiárdgolyónak megfelelő alakzatot gombnyomás hatására, véletlenszerű irányban és lépésekkel elindítja, majd az ablakot határoló kerethez teljesen rugalmatlanul ütközteti! A mozgatást időzítő vezérelje! Teljesen rugalmatlan ütközés esetén a golyó sebességének fallal párhuzamos összetevője változatlan marad, míg a falra merőleges összetevő előjelet vált. Megoldási mód: Windows Forms alkalmazás Oktatási cél: rajzelemek mozgatásának bemutatása A form vezérlői tulajdonságainak beállításai: Form1 Form Size 550; 350 Text Visszapattanó billiárdgolyó button1 Button Text Start Anchor Bottom; Left timer1 Timer Enabled False Interval 60 Az elkészítendő form: 2
A Form1 osztályba írandó programkód: const int r = 20; int x = r, y = r; int dx = 1, dy = 1; private void timer1_tick(object sender, EventArgs e) x += dx; y += dy; // a függőleges falak közelében (r távolságon belül) if (x <= r x >= (ClientSize.Width - r)) dx = -dx; // a vízszintes falak közelében if (y <= r y >= (ClientSize.Height - r)) dy = -dy; Refresh(); private void Form1_Load(object sender, EventArgs e) x = ClientSize.Width / 2; y = ClientSize.Height / 2; Refresh(); private void Form1_Paint(object sender, PaintEventArgs e) Graphics g = e.graphics; g.fillellipse(brushes.red, x - r, y - r, 2 * r, 2 * r); private void button1_click(object sender, EventArgs e) Random rnd = new Random(); dx = rnd.next(r) * (2 * rnd.next(2) - 1); // (r-1)..0 dy = rnd.next(r) * (2 * rnd.next(2) - 1); // (r-1)..0 timer1.interval = 60; // 60ms timer1.enabled =!timer1.enabled; if (timer1.enabled) button1.text = "Stop"; else button1.text = "Start"; 3
3. feladat Írjon alkalmazást, melyben egy csészét forgat a függőleges tengelye körül! A forgatást időzítő vezérelje! Megoldási mód: Windows Forms alkalmazás Oktatási cél: animáció készítésének bemutatása Az elkészítendő form: A form vezérlői tulajdonságainak beállításai: Form1 Form Size 300; 300 Text Forgó csésze picturebox1 PictureBox Size 170; 170 Location 60; 30 Anchor Top; Left imagelist1 ImageList ImageSize 180; 180 Images csésze1.gif Images csésze2.gif Images csésze3.gif Images csésze4.gif Images csésze5.gif Images csésze6.gif Images csésze7.gif Images csésze8.gif button1 Button Text Indítás Anchor Bottom; Left button2 Button Text Leállítás Anchor Bottom; Left timer1 Timer Enabled False Interval 200 A Form1 osztályba írandó programkód: int képszám = 0; 4
private void timer1_tick(object sender, EventArgs e) // a következő képet jeleníti meg picturebox1.image = imagelist1.images[képszám]; // növeli a képszámot képszám = (képszám + 1) % 8; private void button1_click(object sender, EventArgs e) timer1.enabled = true; private void button2_click(object sender, EventArgs e) timer1.enabled = false; private void Form1_Activated(object sender, EventArgs e) picturebox1.image = imagelist1.images[képszám]; 4. feladat önálló feldolgozásra Írjon programot, melyben folyadék átfolyását szimulálja egy teli tartályból egy vele csővel összekötött másik tartályba! Megoldási mód: Windows Forms alkalmazás Oktatási cél: animáció alkalmazásának bemutatása Az elkészítendő form: 5
A form vezérlői tulajdonságainak beállításai: Form1 Form Text Tartályok button1 Button Text Start/Stop timer1 Timer Enabled False Interval 50 A Form1 osztályba írandó programkód: private const int szélesség1 = 220-1; // a tartály1 szélessége private const int szélesség2 = 150-1; // a tartály2 szélessége // a tartály1-ben a víz mennyisége, ha 150 pixel magasan áll private const int térfogat = szélesség1 * 150; private Rectangle tartály1 = new Rectangle(20, 80, szélesség1 + 1, 170); private Rectangle tartály2 = new Rectangle(360, 150, szélesség2 + 1, 200); private Rectangle cső = new Rectangle(240, 220, 120, 8); private int magasság1 = 150, magasság2 = 0; private bool folyik = false; private void Form1_Load(object sender, EventArgs e) // az ablak nem méretezhető át this.formborderstyle = System.Windows.Forms.FormBorderStyle.Fixed3D; this.minimizebox = false; this.maximizebox = false; timer1.interval = 50; private void TartályRazolás(Graphics g, Rectangle tartály) g.drawline(pens.black, tartály.left, tartály.top, tartály.left, tartály.bottom); g.drawline(pens.black, tartály.left, tartály.bottom, tartály.right, tartály.bottom); g.drawline(pens.black, tartály.left, tartály.bottom, tartály.right, tartály.bottom); g.drawline(pens.black, tartály.right, tartály.bottom, tartály.right, tartály.top); private void Form1_Paint(object sender, PaintEventArgs e) Graphics g = e.graphics; TartályRazolás(g, tartály1); TartályRazolás(g, tartály2); g.drawrectangle(pens.black, cső); // a víz a tartály1-ben g.fillrectangle(brushes.darkcyan, new Rectangle(tartály1.Left + 1, tartály1.bottom - magasság1, szélesség1, magasság1)); if (folyik) g.drawrectangle(pens.black, cső); // a víz a csőben g.fillrectangle(brushes.darkcyan, new Rectangle(cső.Left, cső.top + 1, cső.width, cső.height - 1)); // a víz a tartály2-ben g.fillrectangle(brushes.darkcyan, new Rectangle(tartály2.Left + 1, tartály2.bottom - magasság2, szélesség2, magasság2)); 6
private void button1_click(object sender, EventArgs e) folyik =!folyik; timer1.enabled = folyik; private void timer1_tick(object sender, EventArgs e) magasság1--; // a tartály1-ben csökken a vízmagasság // az átfolyt víz mennyisége int újtérfogat = térfogat - magasság1 * szélesség1; // az átfolyt víz magassága a tertály2-ben magasság2 = újtérfogat / szélesség2; Refresh(); // ha a két tartályban azonos a víz magassága, // az ablak aljától számítva, leáll az átfolyás if (tartály1.bottom - magasság1 >= tartály2.bottom - magasság2) timer1.stop(); button1.enabled = false; 5. feladat önálló feldolgozásra Készítsen játékprogramot, melyben egy a form tetején oda-vissza mozgó léggömböt, egy a form aljáról indítható golyóval kell eltalálni! A form fejlécében jelezze, hogy az összes lövésből hányszor talált! Megoldási mód: Windows Forms alkalmazás Oktatási cél: példa animáció alkalmazására Az elkészítendő form: 7
A form vezérlői tulajdonságainak beállításai: Form1 Form Size 400;500 Text Céllövölde BackColor White button1 Button Text Lő picurebox1 PictureBox Size 50;60 Location 0;5 SizeMode StretchImage Image Léggömb.jpg picurebox2 PictureBox Size 20;30 SizeMode StretchImage Image Golyó.jpg timer1 Timer Enabled False Interval 100 timer2 Timer Enabled False Interval 100 A Form1 osztályba írandó programkód: int golyóy0; int lépésléggömb = 5; int lépésgolyó = 10; Random rnd = new Random(); int találat = 0; int lövések = 0; private void Form1_Load(object sender, EventArgs e) timer1.interval = timer2.interval = 60; timer2.stop(); timer1.start(); golyóy0 = picturebox2.top; // A golyó függőleges pozíciójának elmentése picturebox2.hide(); // A golyó eltüntetése private void timer1_tick(object sender, EventArgs e) picturebox1.show(); picturebox1.left += lépésléggömb; // A léggömb léptetése if ((picturebox1.left + picturebox1.width >= this.clientsize.width) (picturebox1.left <= 0)) // Az ablak jobb // széléről visszafelé indul el lépésléggömb = -lépésléggömb; // visszafelé timer1.interval = rnd.next(30, 200); // új sebességgel private void timer2_tick(object sender, EventArgs e) picturebox2.top -= lépésgolyó; // A golyó léptetése if ((picturebox2.left >= picturebox1.left) && (picturebox2.right <= picturebox1.right) && (picturebox2.top >= picturebox1.top) && (picturebox2.bottom <= picturebox1.bottom)) // Ha a golyó bemegy a // léggömbbe picturebox2.hide(); picturebox1.hide(); 8
picturebox1.left = 0; // A léggömböt az ablak bal oldalára visszük lépésléggömb = 5; találat++; this.text = "Céllövölde: " + találat.tostring() + "/" + lövések.tostring(); if (picturebox2.top + picturebox2.height <= 0) // Ha a golyó az ablak // tetején kilépett picturebox2.hide(); timer2.stop(); picturebox2.top = golyóy0; button1.enabled = true; // Az új lövés engedélyezése private void button1_click(object sender, EventArgs e) picturebox2.top = golyóy0; // A golyó függőleges kiindulási pozíciója picturebox2.show(); // A golyó megjelenítése timer2.start(); // A golyó mozgatás indítása button1.enabled = false; // A gomb letiltása lövések++; this.text = "Céllövölde: " + találat.tostring() + "/" + lövések.tostring(); 9
Gyakorló feladatok grafika 3 1. Készítsen Windows Forms alkalmazást, melyben két különböző színű golyó mozog elliptikus pályán, az egyik gyorsabban, a másik lassabban! Véletlenszerűen határozza meg, hogy a golyók induláskor hol állnak, és véletlenszerűen válassza meg a golyók sebességét is! A golyók álljanak meg, ha az egyik utoléri a másikat! 2. Írjon Windows Forms alkalmazást, melyben 5 mozgó, kis színes kör jelenik meg az ablak felületén véletlenszerűen! A körök színe legyen véletlenszerű, a körök átmérője véletlenszerűen 1 és 10 pixel között változzék! A körök pattanjanak egymáson és az ablak szélein! 3. Készítsen Windows Forms alkalmazást, melyben előállít véletlen módon 5 kis, kék körlapot, és kirajzolja azokat a formon! A körlapok mozogjanak vízszintesen az ablak szélei között oda vissza! Gombnyomásra álljanak meg, ekkor keresse meg a két legtávolabbi körlapot (a középpontok távolsága) fesse át őket pirosra, valamint a két legközelebbi körlapot és fesse át őket zöldre! 4. A tanszéki honlapon a tananyagok mappában talál egy Képek/Felhők nevű mappát, melyben van két felhőket ábrázoló kép! Készítsen Windows Forms alkalmazásban animációt, melyben a képek segítségével a felhőmozgást szimulálja! 5. A tanszéki honlapon a tananyagok mappában talál egy Képek/Holdfázisok nevű mappát, melyben van két holdfázisokat ábrázoló kép! Képszerkesztő programmal készítsen belőlük egyforma méretű önálló képeket! Készítsen Windows Forms alkalmazásban animációt, melyben a képek segítségével a Hold változását mutatja be! 6. A tanszéki honlapon a tananyagok mappában talál egy Képek/Napok nevű mappát, melyben van 8 darab napocskát ábrázoló kép! Készítsen Windows Forms alkalmazásban animációt, melyben kör alakban megjeleníti a formon a képeket, és azokat gombok segítségével vagy automatikusan jobbra vagy balra mozgatja! 10
7. Írjon Windows Forms alkalmazást, melyben henger alakú, adott méretű hordót adott magasságig töltsön fel két, a hordó fölé helyezett csapból! Az adatokat TextBox vezérlőkből olvassa be! 11