Grafik i DrRacket AV TOMMY KARLSSON

Relevanta dokument
TDDC74 Programmering: Abstraktion och modellering Tentamen, lördag 29 augusti 2015, kl 8 12

Lab5 för prgmedcl04 Grafik

Lektion 7, del 1, kapitel 15 Filter och Transformationer

Affina avbildningar och vektorgrafik

Grafik i Racket. Rasmus Andersson. Senast uppdaterad 30 mars 2015

TDDC74 Programmering: Abstraktion och modellering Dugga 3, kl 14 16, 25 mars 2015

ID1004 Laboration 3, 5-6 November 2012

Detta dokument är ett exempel, cirka andra hälften av en tentamen för TDA545 Objektorienterad programvaruutveckling

Programutveckling för Tekniska Tillämpningar Arbetsblad 5

Robotarm och algebra

3 Man kan derivera i Matlab genom att approximera derivator med differenskvoter. Funktionen cosinus deriveras för x-värdena på följande sätt.

Objektorienterad Programkonstruktion. Föreläsning 3 9 nov 2015

Detaljbeskrivning av Player

TDDC74 Programmering: Abstraktion och modellering Tentamen, lördag 27 augusti 2016, kl 8 12

TDDC74 Programmering: Abstraktion och modellering Tentamen, onsdag 9 juni 2016, kl 14 18

Department of Physics Umeå University 27 augusti Matlab för Nybörjare. Charlie Pelland

Malmö högskola 2007/2008 Teknik och samhälle

Tentamen. Datalogi I, grundkurs med Java 10p, 2D4112, Lördagen den 30 november 2002 kl , salar E33, E34

TAIU07 Matematiska beräkningar med Matlab

WINDOWS PRESENTATION FOUNDATION LEKTION 1

USB styrt DMX gränssnitt

Objektorienterad Programkonstruktion. Föreläsning 3 7 nov 2016

Exempel på användning av arv: Geometriska figurer

SgLib Simple Graphics Library

TDDC74 Programmering: Abstraktion och modellering Tentamen, onsdag 19 oktober 2016, kl 14 18

Skolan för Datavetenskap och kommunikation. Programmeringsteknik. Föreläsning 16

Börja med att kopiera källkoden till din scheme-katalog (som du skapade i Laboration 1).

Objektorienterad programmering

Laboration: Grunderna i MATLAB

Grafiska användargränssnitt i Java

PROGRAMMERINGSTEKNIK TIN212

Starta ett fönster... Hur håller tkinter reda på musklick? Olika sätt att organisera fönsterinnehåll. Och för att placera våra widgets

TDP005 Projekt: Objektorienterat system

SMD091 Lektion 9. Definition. Inkapsling. Lite repetition. Grafik. Gränssnitt Definition och Implementation. Sammansättning... Implementation.

Rita Egna Bilder, Timer

NYHETER I AUTOCAD 2006

F1 grundläggande funktioner i AutoCad Architecture Johan Jönsson

TDDI82 - Projekt. Christoffer Holm. Institutionen för datavetenskap (IDA)

Objektorienterad programmering i Racket

Att prova på en enkel Applet och att lära sig olika sätt att hämta data från tangentbordet. Du får även prova på att skapa din första riktiga klass.

Objektorienterad programmering i Racket

3.5 Visuell programmering

Programmeringsteknik II - HT18. Föreläsning 6: Grafik och händelsestyrda program med användargränssnitt (och Java-interface) Johan Öfverstedt

Grunderna i C++ T A. Skapad av Matz Johansson BergströmLIMY

Labb i Datorsystemteknik och programvaruteknik Programmering av kalkylator i Visual Basic

Grafiska användargränssnitt i Java

Spelprogrammering med JavaScript och HTML5

STOCKHOLMS UNIVERSITET VT 2011 Avd. Matematisk statistik GB DATORLABORATION 1: TIDSSERIER.

Sphero SPRK+ Appen som används är Sphero Edu. När appen öppnas kommer man till denna bild.

Introduktion till Matlab

INSTÄLLNINGAR FÖR IRONCADS 2D-RITNING

TENTAMEN I PROGRAMMERING. På tentamen ges graderade betyg:. 3:a 24 poäng, 4:a 36 poäng och 5:a 48 poäng

TDDC74 FÖRELÄSNING 9 ANDERS MÄRAK LEFFLER IDA/HCS

Extramaterial till Matematik Y

Rullningslisten. Klicka på rullningslistpilar (pil upp eller pil ner) 1 för att förflytta dig i önskad riktning, en liten bit i taget.

Introduktion till Matlab

Programmering. Den första datorn hette ENIAC.

Tynker gratisapp på AppStore

Grafiskt användargränssnitt (GUI-Graphical User Interface) intro Komponenter

NYHETER I AUTOCAD LT 2006

Fyra i rad Javaprojekt inom TDDC32

Modelsvar för Tentamen för Objektorienterad programvaruutveckling, TDA545

F1 grundläggande funktioner i AutoCad Architecture Johan Jönsson

Det är principer och idéer som är viktiga. Skriv så att du övertygar rättaren om att du har förstått dessa även om detaljer kan vara felaktiga.

Extramaterial till Matematik Y

Bildbehandla med Photoshop Elements 11

Grafik. TDDC66 Datorsystem och programmering Föreläsning 4. Peter Dalenius Institutionen för datavetenskap

Grafik. För enklare datorsystem

Lär dig programmera! Prova på programmering med enkla exempel! Björn Regnell

Cadcorp SIS. Användarkurs

Videokonferenssystem Deltagarmanual. GoToMeeting

Konvexa höljet Laboration 6 GruDat, DD1344

Objektorientering i liten skala

TDDC74 Programmering: Abstraktion och modellering Datordugga 2 - exempel

Institutionen för matematik och datavetenskap Karlstads universitet. GeoGebra. ett digitalt verktyg för framtidens matematikundervisning

TDDC74 Programmering: Abstraktion och modellering Dugga 2, , kl 17-19

Instruktioner för Articulate Storyline 2

TDDD78, TDDE30, 729A Grafik: Att "rita" egna komponenter

Varför behövs det? I Allegro finns t.ex. stöd för:

TANA17 Matematiska beräkningar med Matlab

UML. Objekt-orienterad programmering och design (DIT952) Niklas Broberg, 2016

Föreläsning 13 Innehåll

Laboration 3 GUI-programmering

Interaktion 2 STYRDON, PEKDON OCH ANNAN INTERAKTION ATT RÄKNA MED

Kom igång med RIB Karta 1.1

Klassen javax.swing.timer

TENTAMEN PROGRAMMERING I JAVA, 5P SOMMARUNIVERSITETET

Innehållsförteckning

Mäta rakhet Scanning med M7005

Påminnelse: en datatyp för bilder. Programmering. En datatyp för bilder. Spegelbild. hh.se/db2004

Bilaga 4, Skapa grafiskt användargränssnitt med guide

Att skapa en bakgrundsbild och använda den i HIPP

Objektorienterad programmering Föreläsning 15. Grafiska användargränssnitt (GUI Graphical User Interface)

Installationsanvisning för etikettskrivare Intermec PF8d/PC43d

Optisk bänk En Virtuell Applet Laboration

Uppdrag för LEGO projektet Hitta en vattensamling på Mars

Skärmtangentbordet som är enkelt att använda både med mus, touchskärmar och interaktiva whiteboards

Videokonferenssystem Deltagarmanual. GoToMeeting

Vi börjar med en penna som ritar när du drar runt den på Scenen.

Transkript:

Grafik i DrRacket AV TOMMY KARLSSON

Upplägg Grundläggande grafik i racket Frame% Kodexempel! Generella problemlösarstrategier Grafisk kodstruktur Button% Pane% & Panel% Canvas% Bitmap% Grafisk effektivisering Tile-baserad grafik Olika sätt att bestämma rörelse

Frame% ; Skapar ett objekt av typen frame% (ett fönster!) (define *a-window* (new frame% [width 300] [height 200] [label "Detta är ett fönster"])) ; Säger till vår frame att den ska synas (send *a-window* show #t) ; En frame% är en container (man kan placera saker i den!) Det finns en mängd olika inargument som man kan utnyttja beroende på vad man vill att den ska göra! Se docs.racket-lang.org!

Button% ; Vår procedur som bestämmer vad som ska hända (define (button-proc button event) (send button set-label Klick fungerade! )) ; Skapar ett objekt av typen button% (en knapp!) (define *a-button* (new button% [parent *a-window*] [label En knapp ] [callback button-proc]) ; En button måste ha en container (som t.ex. frame) som parent! Det finns en mängd olika inargument som man kan utnyttja beroende på vad man vill att den ska göra! Se docs.racket-lang.org!

Panel% & Pane% De är båda containers, så de kan fyllas med t.ex. button eller canvas Kan användas för att få en bättre struktur! Underklasser: horizontal-pane% horizontal-panel% vertical-pane% vertical-panel% Se dokumentationen hur de används! (PS: kanterna kring panelerna fås genom att sätta style till (border) när man skapar panelerna!)

Canvas% ; Säger vad som ska ritas när canvasen uppdateras (define (our-render-fn canvas dc) ; Innehåller någon form av kropp! ) ; Skapar ett objekt av typen canvas% (en målarduk!) (define *a-canvas* (new canvas% [parent *a-window*] [paint-callback our-render-fn])) ; En canvas är alltså en målarduk som vi kan rita figurer eller bilder på! Det finns en mängd olika inargument som man kan utnyttja beroende på vad man vill att den ska göra! Se docs.racket-lang.org!

Exempel på dc%- kommandon Ritande Kommandon: (send dc draw-rectangle x y width height) (send dc draw-rounded-rectangle x y width height radius) (send dc draw-arc x y width height startradians end-radians) (send dc draw-ellipse x y width height) (send dc draw-line x1 y1 x2 y2) (send dc draw-spline x1 y1 x2 y2 x3 y3) (send dc draw-lines list-of-points) (send dc draw-polygon list-of-points) (send dc draw-text text x y) (send dc draw-bitmap source x y) Koordinatsystemsförändrande kommandon (send dc translate dx dy) (send dc rotate angle) (send dc scale x-scale y-scale) Färginställningar och liknande (send dc set-pen color-name width style) (send dc set-brush color-name style) (send dc set-alpha opacity) (send dc set-background color) (send dc set-font font) Rensa skärmen (send dc clear)

Canvas: Exempel ; Skapar fönstert (define *a-window* (new frame% [width 600] [height 400] [label "Detta är ett fönster"])) ; Gör fönstret synligt (send *a-window* show #t) ; Vad ska ritas på vår canvas? (define (render-fn canvas dc) (send dc set-brush "red" 'solid) ; Ändrar färg på vår pensel (send dc set-pen "green" 10 'solid) ; Ändrar färg på vår penna (send dc set-text-foreground "blue") ; Ändrar färg på vår text (send dc draw-rectangle 10 10 50 50) (send dc draw-text "Hallå där!" 200 200) (send dc set-brush (make-object color% 1 0 0) 'solid) ; Vi skapar en egen färg istället! (send dc draw-ellipse 240 240 100 100)) ; Skapar vår canvas (define *a-canvas* (new canvas% [parent *a-window*] [paint-callback render-fn])) Det finns en mängd olika inargument som man kan utnyttja beroende på vad man vill att den ska göra! Se docs.racket-lang.org!

Translateringar, rotationer och skalning Rotation kring origo Rotation kring vårt nya origo!

Translateringar, rotationer och skalning Exempel på koordinatsystemsberoende kommandon: (send dc translate xvalue yvalue) ; Förskjuter origo I den givna riktningen (send dc rotate angle) ; Roterar den givna vinkeln kring origo (send dc scale xfactor yfactor) ; Skalar bilden från Ofta vill man utgå ifrån centrum av bilden: (send dc translate (+ xvalue (/ width 2)) (+ yvalue (/ height 2))) OBS! Glöm ej att återställa koordinatsystemet efter att ni använt det, annars blir det riktigt jobbigt för er!

Bitmap% Många användningsområden! ; Skapa en bitmap av en bildfil: (define *our-bitmap* (make-object bitmap% testbild.png ) ; Dimensionerna sätts till bildens dimensioner! ; Skapar en tom bitmap (define *our-bitmap* (make-object bitmap% 100 100) ; Dimensionerna sätts till argumenten, här 100 x 100! ; Hämta DC för bitmapen så att vi kan måla precis som på canvasen! (define *our-dc* (new bitmap-dc% [bitmap *our-bitmap*])) ; Ritar ut en bitmap med någon dc, t.ex. på en canvas! (send *some-dc* draw-bitmap *our-bitmap* xpos ypos)

Tangentbords och musavkänning Canvas% innehåller funktionalitet för att känna av mus- eller Tangentbordsinmatning, men den är normalt sett avstängd! För att ändra på detta utnyttjar vi arv: (define input-canvas% (class canvas% ; Vi lägger till ytterligare inargument ; (procedurer som vi själva måste skriva!) (init-field keyboard-handler ; ska hantera tangentbord mouse-handler) ; ska hantera mus ; Vid ett knapptryck, anropa vår keyboard-handler (define/override (on-char key-event) (keyboard-handler key-event)) ; Vid musrörelse, anropa vår mouse-handler (define/override (on-event mouse-event) (mouse-handler mouse-event)) (super-new))) OBS! Se vad man kan göra med argumenten key-event% och mouse-event% i dokumentationen!

Exempel: mus + bitmap

Exempel: mus + bitmap

Timers Timer% kan användas för att så få procedurer att upprepas vid specifika tider (Jämför med att en itererande procedur alltid anropar sig själv direkt när den är klar!) 60 Hz => periodtid 16,666 ms ; Vi definierar en timer som kommer anropa vår procedur our-update (define *game-timer* (new timer% [notify-callback our-update])) ; Vi startar timern och säger att den ska anropa sin procedur varje 16 millisekund (send *game-timer* start 16 #f) ; #f säger att den inte bara ska köras en gång! ; Vi stannar timern (send *game-timer* stop)

Exempel: mus + bitmap

Grafisk kodstruktur Gör looparna så lättviktiga som möjligt! Är det några onödiga beräkningar? Finns det beräkningar som inte måste ske varje iteration? Gör det lättläst! Flytta specifika rit-delar till respektive objekt! Anropa t.ex. player s ritprocedur istället för att skriva ritproceduren i grafik-loopen! Ex: (send player draw-player dc) Istället för: (send dc draw-bitmap (send player get-bitmap) ) Detta ger ökad läsbarhet och en lättare överblick över vad som egentligen sker i grafik-loopen!

Grafisk effektivisering Vad händer om koden är för ineffektiv? Programmet kan frysa Programmet kan lagga Vår fysikmotor kan sluta fungera! (Beror på implementation) Hur kan man undersöka evalueringstid? Ex: (define (our-update) (let ([starttime (current-inexact-milliseconds)]) ; BODY (displayln (- (current-inexact-milliseconds) starttime)))) OBS! Testa evalueringstiden på era loopar ibland under projektets gång Om det är någon del som är ineffektiv så är det lätt att hitta!

Tile-baserad grafik Lätt att rita ut! Lätt att göra kollisionsdetektering! Lätt att göra kartan!

Tile-baserad grafik Exempel (rita): Element på plats [3,12] har nummer 30. Rita bitmapen som svarar mot siffran 30 på position: Y = 3 * höjd-på-bitmap X = 12 * bredd-på-bitmap Klart! Exempel (kollision): Spelaren försöker gå till position (12, 153) Tillåten tile att gå på? Koordinaterna motsvarar element: Rad = 153 / höjd-på-bitmap ; Avrundat neråt Kolumn = 12 / bredd-på-bitmap ; Avrundat neråt Får spelaren gå på tiles med siffran som finns på position [rad, kolumn]?

Matriser 0,0 0,1 0,2 0,3 1,0 1,1 1,2 1,3 2,0 2,1 2,2 2,3 Jämför med: 0,0 0,1 0,2 0,3 1,0 1,1 1,2 1,3 2,0 2,1 2,2 2,3 3,0 3,1 3,2 3,3 Hämta element r ur matrisen Hämta element k ur det => Element (r,k)! 3,0 3,1 3,2 3,3

Olika sätt att bestämma rörelse Lästa textfil och bygga tile-baserad karta Det är lättare att redigera en txt-fil än att skriva en tile-baserad karta direkt i racket! Vektorbaserad rörelse Linjär algebra: Vi vill gå från punk (a.b) till (c,d). Normerad riktningsvektor: (c-a, d-b) / Vektorns längd Ny kooridnat: xpos = xpos + Normerad-riktningsvektor-x * ΔS ypos = ypos + Normerad-riktningsvektor-y * ΔS Klart! Waypoints Ex: Lista med koordinater: ( (1.1), (1. 2), (3. 2), ) Riktning: Från nuvarande position till (1.1)! När avståndet mellan nuvarande position och (1.1) < något värde Lista med koordinater = ( (1. 2), (3. 2), ) Börja om!

Allmänna tips! Dela upp grafik och fysik? Fördelar: Ex: Fysik (som är viktigare) kan uppdateras oftare. Kortare evalueringstid Fysik och grafik måste inte evalueras samtidigt! ; Hantera all fysik, t.ex. rörelse och kollision (define (physics-update) ; Kan köras med högre frekvens (OBS! ; inte för hög frekvens!) ; Rita bara ut saker på koordinater som redan är uträknade (define (graphics-update) ; Körs med frekvens på 60Hz Jämn rörelse? Icket FPS-beroende hastighet: Utnyttja ΔT och hastighetsformeln ΔS = V * ΔT Börja med icket-grafik Större delen av projektet går att skriva utan grafik Testa programmera enkla grafiska problem innan ni börjar med grafiken i projektet.