Animace a pohyb
Př. program s popojíždějícím autíčkem o 50 pixelů při každém stisku Popojeď
namespace Autíčko public partial class oknoprogramu : Form int x = 10, y = 10; public oknoprogramu() InitializeComponent(); private void oknoprogramu_paint(object sender, PaintEventArgs e) Graphics kp = e.graphics; kp.drawimage(properties.resources.autíčko, x, y); private void tlačítkopopojeď_click(object sender, EventArgs e) for (int i = 0; i < 50; i++) x += 2; Refresh(); System.Threading.Thread.Sleep(50);
Zdvojení obrazové paměti Asi jste si všimli, že autíčko problikává. Je to způsobeno tím, že se okno neustále maže a překresluje na nové pozici. Při nastavení vlastnosti DoubleBuffered okna na true kreslící metody nepracují přímo s částí RAM grafické karty, která je zobrazena, ale s jinou částí, která momentálně vidět není. Teprve když je obraz komplet připraven, dojde k přepnutí mezi viditelnou a neviditelnou částí. Tím se problikávání (téměř) odstraní.
Časovač Předchozí program má zásadní nevýhodu, a to že usíná, čímž se stává každou chvíli de facto mrtvým. Řešením je neusínat, ale použít časovač, který po zadaných časových prodlevách generuje událost Tick. Prodleva se nastavuje parametrem Interval a je uvedena v milisekundách.
namespace Autíčko public partial class oknoprogramu : Form int x = 10, y = 10; public oknoprogramu() InitializeComponent(); private void oknoprogramu_paint(object sender, PaintEventArgs e) Graphics kp = e.graphics; kp.drawimage(properties.resources.autíčko, x, y); private void tlačítkorozjeďse_click(object sender, EventArgs e) časovač.enabled = true; private void tlačítkozastav_click(object sender, EventArgs e) časovač.enabled = false; private void časovač_tick(object sender, EventArgs e) x += 2; Refresh();
Př. upravte program tak, aby se dala nastavovat rychlost auta v pixelech za sekundu stačí členskou proměnnou v programu. Z fyziky víte, že s = v. t Čas časovače je potřeba převést z milisekund na sekund, tedy double čas = 0.001 * časovač.interval;
Př. program, který odpočítá od 10 do 0 a potom skončí. Př. program, který bude simulovat blikání na žel. přejezdu, včetně zvuku. Př. autíčko, co nikdy nezmizí. Tip: kreslící plocha má bod [0, 0] vlevo nahoře, ale lze pracovat i se zápornými souřadnicemi.
Př. program na slideshow pěti fotek po pěti sekundách. Př. digitální hodiny. Tip: Použijte instanci DateTime, aktuální datum a čas se zjistí přes vlastnost DateTime.Now. Lze převést pomocí metody ToLongTimeString nebo použít vlastnosti Hour, Minute a Second. Rozmyslete si za domácí úkol ručičkové hodiny.ď
Dvourozměrný pohyb Vektor rychlosti se skládá ze dvou složek, x-ové a y-ové v x a v y souřadnice x = v x. t souřadnice y = v y.t Př. program, který pošle kuličku ze středu panelu náhodným směrem náhodnou rychlostí Na začátku kuličku vykreslete mimo panel, aby nebyla vidět. Složky vektoru rychlosti vygenerujte z intervalu < 100, 100>
Upravte program tak, aby se kulička odrážela od hran okna jako ve známé hře Pinball. Př. program simulující chodícího panáčka. Nejprve je potřeba připravit několik obrázků rozfázovaného pohybu.
Dobrovolná látka Př. kruhový pohyb. http://cs.wikipedia.org/wiki/pohyb_po_kru%c 5%BEnici Budeme zadávat pomocí dvou parametrů fázové rychlosti a poloměru kružnice. // Parametry kružnice int xstředukružnice = 100; int ystředukružnice = 100; int poloměrkružnice = 80; // Parametry kuličky double úhel = 0; // Úhel průvodiče ve stupních double omega = 60; // Úhlová rychlost ve stupních za sekundu int poloměrkuličky = 5;
using System; using System.Drawing; using System.Windows.Forms; namespace Kruhový_pohyb public partial class oknoprogramu : Form // Parametry kružnice int xstředukružnice = 100; int ystředukružnice = 100; int poloměrkružnice = 80; // Parametry kuličky double úhel = 0; // Úhel průvodiče ve stupních double omega = 60; // Úhlová rychlost ve stupních za sekundu int poloměrkuličky = 5; public oknoprogramu() InitializeComponent(); private void oknoprogramu_paint(object sender, PaintEventArgs e) Graphics kp = e.graphics; // Výpočet pomocných hodnot pro kružnici int xlh = xstředukružnice - poloměrkružnice; int ylh = ystředukružnice - poloměrkružnice; int šířka = 2 * poloměrkružnice; int výška = šířka; // Kreslíme kružnici kp.drawellipse(pens.cornflowerblue, xlh, ylh, šířka, výška); // Výpočet středu kuličky (NEJDŮLEŽITĚJŠÍ!) double úhelrad = úhel * Math.PI / 180; double rozdílx = poloměrkružnice * Math.Cos(úhelRad); double rozdíly = poloměrkružnice * Math.Sin(úhelRad); double xstředukuličky = xstředukružnice + rozdílx; double ystředukuličky = ystředukružnice + rozdíly; // Výpočet pomocných hodnot pro kuličku // ("recyklujeme" jednou použité pomocné proměnné) xlh = Convert.ToInt32(xStředuKuličky - poloměrkuličky); ylh = Convert.ToInt32(yStředuKuličky - poloměrkuličky); šířka = 2 * poloměrkuličky; výška = šířka; // Kreslíme kuličku kp.fillellipse(brushes.cornflowerblue, xlh, ylh, šířka, výška); private void časovač_tick(object sender, EventArgs e) double čas = 0.001 * časovač.interval; úhel += omega * čas; Refresh();
Př. program, který simuluje kuličku točící se na šňůře. Po přestřižení šňůry kulička odletí rovnoměrným přimočarým pohybem směrem a rychlostí, co zrovna měla.
Př. upravte příklad s přímočarým pohybem tak, aby kulička postupně bledla, až se ztratí. Tip: Štětec vytvoříme pomocí new SolidBrush s barvou, kterou vyrobíme pomocí Color.FromArgb(Alfa, R, G, B), kde Alfa, je tzv. alfa-kanál, který udává průhlednost. Př. poskakující okno, které se bude chaoticky pohybovat po monitoru s odskokem max. o 10 px. Tip: Aktuální pozici okna zjistíte pomocí Location.X a Location.Y, nové nastavení pozice lze provést např. přes SetDesktopLocation(x, y)