Ismétlés (Grafikai lehetőségek WPF-ben)

Slides:



Advertisements
Hasonló előadás
TAMOP B-11/ „A fiatalok családi életre nevelését, a kismamák munkaerő piaci elhelyezését segítő, innovatív családbarát szolgáltatások.
Advertisements

A kártyanyomtatás fortélyai Csákvári Krisztián Kártya és címke gyártás
A családsegítő és gyermekjóléti szolgálatokat érintő változások A család és gyermekjóléti szolgáltatás.
TÖMÖRÍTÉS. Fogalma A tömörítés egy olyan eljárás, amelynek segítségével egy fájlból egy kisebb fájl állítható elő. A tömörítési arány függ a fájl típusától,
A Non-Profit teljesítménymérés problémái (mérési és fejlesztési lehetőség) Márkus Gábor CVS, PVM, TVM, igazgató Stúdium Kft. Oktatás és Projekt menedzsment.
Bevezetés a C# nyelvbe Az alapok összefoglalása Farkas Csaba.
Szabadtéri rendezvények. A TvMI vonatkozik: OTSZ szerinti szabadtéri rendezvényekre szabadtéri rendezvény: az 1000 főt vagy az 5000 m 2 területet meghaladó,
A kifizetési kérelem összeállítása TÁMOP-3.2.9/B-08 Audiovizuális emlékgyűjtés.
Manhertz Gábor; Raj Levente Tanársegéd; Tanszéki mérnök Budapesti Műszaki és Gazdaságtudományi Egyetem Mechatronika, Optika és Gépészeti Informatika Tanszék.
V 1.0 Programozás III. Ismétlés (Grafikai lehetőségek WPF-ben) Visual utódok.
GUARDING YOUR BUSINESS ■ Linux disztribúciók és FreeBSD az upstream szemszögéből Czanik Péter Community manager syslog-ng upstream.
BEST-INVEST Független Biztosításközvetítő Kft.. Összes biztosítási díjbevétel 2004 (600 Mrd Ft)
Internet tudományos használata
Fájlkezelés.
OLVASÓSZOLGÁLATI TEREK
Operációs rendszerek.
Made in Hungary kiállítás
Scilab programozás alapjai
A közigazgatással foglalkozó tudományok
Alkalmazásfejlesztés gyakorlat
Programozás III. Gyakorlás.
A cégvezetők problémái az informatikával kapcsolatban
LabVIEW bevezetéstől a feszültség-áram karakterisztikáig Vida Andrea
RÁDIÓRENDSZEREK Képi jelek Győr.
Tömörítés.
T.R. Adatbázis-kezelés - Alapfogalmak Adatbázis:
Downstream Power Back Off (DPBO)
Programozás I. Gyakorlás egydimenziós tömbökkel Többdimenziós tömbök
Ismétlés (Grafikai lehetőségek WPF-ben) Visual utódok
Dependency Injection Moq Feladat
Programozás III. Ismétlés (Grafikai lehetőségek WPF-ben)
Animációk.
Adatbázis-kezelés (PL/SQL)
2. Bevezetés A programozásba
Hernyák Zoltán Magasszintű Programozási Nyelvek I.
☺ Programozási környezetek Validátorok Fazekas Judit PTI 2010.
Downstream Power Back Off (DPBO)
Unity.
Közigazgatási alapvizsga a Probono rendszerben
Business Mathematics
Algoritmusok és Adatszerkezetek I.
Rendszerfejlesztés gyakorlat
Az Endnote bibliográfia adatbázis-kezelő szoftver alapvető használata november Skultéti Attila
STRUKTURÁLT SERVEZETEK: funkció, teljesítmény és megbízhatóság
Ismétlés (Grafikai lehetőségek WPF-ben) Visual utódok
Tilk Bence Konzulens: Dr. Horváth Gábor
Alsó-ausztriai alapfokú oktatási intézmények
Tájékoztató az Önkormányzati ASP Projektről
Vonalkódok Kajdocsi László Informatika tanszék A602 iroda
Készítette: Sinkovics Ferenc
AVL fák.
Informatikai gyakorlatok 11. évfolyam
B M Java Programozás 4. Gy: Java GUI IT A N Tipper, MVC kalkulátor
Online jegyzőkönyv kitöltési segédlet
Új pályainformációs eszközök - filmek
Oracle Adatbázisok kezelése c#-ban
TÁRGYI ESZKÖZÖK ELSZÁMOLÁSA
B M Java Programozás 9. Gy: Java alapok IT A N Adatkezelő 5.rész
A szállítási probléma.
I. HELYZETFELMÉRÉSI SZINT FOLYAMATA 3. FEJLESZTÉSI FÁZIS 10. előadás
Binomiális fák elmélete
SQL jogosultság-kezelés
Szöveges adatok tárolása
JAVA programozási nyelv NetBeans fejlesztőkörnyezetben I/13. évfolyam
Az MKET új stratégiája – Szolgáltató MKET
A geometriai transzformációk
Mesterséges intelligencia
A POWERPOINT 2007 újdonságai
Algoritmusok.
Kórházi és ágazati gazdálkodást érintő informatikai fejlesztések és az azokban rejlő lehetőségek Horváth Tamás Vezérigazgató CompuTREND Zrt.
Előadás másolata:

Ismétlés (Grafikai lehetőségek WPF-ben) Programozás III. Ismétlés (Grafikai lehetőségek WPF-ben) Visual utódok TODO: Üres területre nem lehet kattintani, billentyűzet csak ablakhoz rendelhető VAGY Focusable=true és fókuszálni kell

Grafikai lehetőségek WPF-ben Shape-ek (System.Windows.Shapes.Shape leszármazottak) Egyszerű, előre elkészített grafikai alakzatok Toolboxban is szerepelnek FrameworkElement utódok: input, fókusz, események… Csak kevés számú (max 100) objektum esetén Drawing objektumok (System.Windows.Media.Drawing leszármazottak) Nincs belső támogatásuk input eseményekhez Nem képesek maguktól a megjelenésre, hosztoló objektumban kell őket elhelyezni Legtöbbször XAML-ból kezeljük Gyorsabb a Shape-eknél (max néhány 100 objektumig) Visual objektumok (System.Windows.Media.Visual) Legbonyolultabb, leggyorsabb (max kb. 10000 objektumig) XAML lehetőségek korlátozottak, mindig kódból kezeljük

Visual Ahhoz biztosít szolgáltatásokat, hogy a leszármazott típus renderelhető legyen Több speciális célú utódosztály: pl. DrawingVisual (2D), Viewport3DVisual (3D) Az ezzel való rajzolásnak elsősorban kétféle variációja létezik: Egy adott grafikusfelület-elem „vizuális gyermekei” (kirajzolandó objektumok) közé beteszünk újabb Visual objektumokat Egyedi leszármazott típust definiálunk valamelyik grafikusfelület-elemből (tipikusan: FrameworkElement), kihasználva, hogy a GUI-elemek maguk is Visual utódok

DrawingVisual 2D rajzolásra RenderOpen() függvényét kell hívni, DrawingContext objektumot ad vissza A DrawingContext segítségével „tölthetjük fel” a Visualt (vagy egy DrawingGroupot) tartalommal Pl. a következő függvények értelmezettek rajta: DrawEllipse() DrawRectangle() DrawGeometry() DrawImage() … A grafikai parancsok igazából nem rajzolnak, hanem csak tárolják/ megadják a kirajzolandó dolgokat (visszatartott módú grafikai rendszer) A Visualon belül Drawingok formájában vannak tárolva a rajzok (DrawingGroupban). A rajzolás időpontját a rendszer dönti el The DrawingContext allows you to populate a Visual with visual content. When you use a DrawingContext object's draw commands, you are actually storing a set of render data that will later be used by the graphics you are not drawing to the screen in real-time. DrawingGroup.Open and DrawingVisual.RenderOpen. Ezekkel lehet DrawingContextet nyerni. A Visual describes its content as one or more Drawing objects contained within a DrawingGroup

Visual használat – 1. variáció Minden Visual utódnak (így a grafikusfelület-elemeknek is) vannak „vizuális gyermekei” (kirajzolandók) Új Visual objektumokat (pl. DrawingVisualokat) kell létrehozni és azokat elhelyezni a „vizuális gyermekek” között Kötelező felülírni az új Visualok „tulajdonosában” a VisualChildrenCount, GetVisualChild tulajdonságokat VisualChildrenCount: adjuk vissza, hogy hány „vizuális gyermek” van. GetVisualChild: adjuk vissza az n. „vizuális gyermeket”. Lehetséges az új Visual objektumokat az objektumfákban is elhelyezni (AddVisualChild(), AddLogicalChild()) Események és találattesztelés támogatása miatt

Visual használat 1. variáció példa public partial class MainWindow : Window { //sokszor nem a MainWindow-ban DrawingVisual visualChild; //csináljuk, hanem egy FrameworkElement public MainWindow() //utódot származtatunk és azt rakjuk { //a MainWindow-ra majd InitializeComponent(); visualChild = new DrawingVisual(); using (DrawingContext context = visualChild.RenderOpen()) { context.DrawEllipse(Brushes.Red, null, new Point(50, 50),10,10); } AddVisualChild(visualChild); AddLogicalChild(visualChild); protected override int VisualChildrenCount get { return base.VisualChildrenCount + 1; } protected override Visual GetVisualChild(int index) if (index < base.VisualChildrenCount) return base.GetVisualChild(index); else return visualChild;

Visual használat 2. variáció Kihasználjuk, hogy az ablak (vagy bármilyen más GUI elem) is Visual Amikor rajzolódik, az OnRender() metódusa hívódik Ez felülírható, DrawingContext objektumot kap paraméterül, a DrawingContext-en keresztül tudunk rajzolni a Visualra Új rajzolás mindig kikényszeríthető az InvalidateVisual() függvénnyel class MainWindow : Window //tipikusan ezt sem a MainWindow-ban, { //hanem pl. FrameworkElement utód... //... //- ablaknál Background=Transparent kell. protected override void OnRender(DrawingContext drawingContext) { drawingContext.DrawGeometry(Brushes.Blue, new Pen(Brushes.Red, 2), geometry); } Ez a megoldás egyszerűbb, de a másikat szokták alkalmazni egyébként.

Feladat – Asteroids

Asteroids szabályok: Játékos csak foroghat és lőhet. Az aszteroida véletlenszerű irányba egyenletesen mozog, ha a képernyő szélére ér, visszatér a másik oldalon Ha a játékos lövése eltalál egy aszteroidát, az eltűnik. (Nehezebb verzió: két kisebb és gyorsabban mozgó részre válik szét, egy bizonyos mérethatárig.) Ha a játékos lövése a képernyő szélére ér, visszatér a másik oldalon. Viszont a lövés csak bizonyos ideig „él”, egy idő után eltűnik.

Transzformációk Transform utódokkal reprezentálódnak (transzformációs mátrix) Forgatás (RotateTransform) Skálázás (ScaleTransform) Nyújtás (SkewTransform) Mozgatás (MoveTransform) Általános transzformáció (MatrixTransform) Több transzformáció egymás után (TransformGroup)

Transzformáció alkalmazásai GUI-elemeken (FrameworkElement utódok): LayoutTransform (kihelyezés előtt transzformál) RenderTransform (kihelyezés után transzformál) Geometriákon: Transform Figyelem: nem módosít koordinátákat! A Transform-ot levéve (xxx.Transform = Transform.Identity) az eredeti koordinátákon marad az objektum Metszésnél esetleg gondot okoz

Geometriák metszése (érintésvizsgálat) Geometriák metsződésének vizsgálatához az elmetszéssel létrejött új geometriát létre kell hozni (Geometry.Combine()), majd a területét vizsgálni (GetArea()) Figyelem: LineGeometry-nak nincs kiterjedése, így a metszet területe 0 Megoldása a vonal „kiterjesztésével” geometry.GetWidenedPathGeometry(new Pen(Brushes.Blue, 2)) Geometry intersection = Geometry.Combine(geometry, otherGeometry, GeometryCombineMode.Intersect, null); return intersection.GetArea() != 0;

Feladat – Flappy Birds Turbo

Megoldási alternatíva Minden játékelem Geometry típusú adattagja úgy kerül beállításra, hogy a középpont koordinátája (0;0) legyen Kirajzolás/ütközésvizsgálat előtt transzformáljuk a megfelelő pozícióba TransformGroup tg = new TransformGroup(); tg.Children.Add(new TranslateTransform(cx, cy)); tg.Children.Add(new RotateTransform(degree, cx, cy)); Geometry copy = area.Clone(); copy.Transform = tg; return copy.GetFlattenedPathGeometry();

Grafikai lehetőségek WPF-ben Megközelítés Eseménykezelés / rajzolás vezérlése Használat Objektumok száma Shape Rajzolt objektumonként külön XAML + Binding ~100 Drawing Hosztoló objektum kezeli, az összes rajzolt objektumot együtt XAML + Binding + Converterek (xxx  Geometry) ~1000 Visual Hosztoló objektum kezeli, egyedi kirajzoló metódus CS kód: OnRender + DrawingContext + Geometry ~10000