Programmering av grafisk display

Relevanta dokument
Programmering av grafisk display

Demonstration och konsultation Arbetsbokens avsnitt 5 och 6 LCD Grafisk display Introduktion till laboration 3

Programmering av inbyggda system

Demonstration och konsultation Arbetsbokens avsnitt 8 Ett exempel på spelprogrammering Kan vara till hjälp inför laboration 5

Enkla datatyper minne

C-programmering del 4. Ulf Assarsson. extern, sta.c, Överkurs: const, inline, Gameloop, grafikloop, fraktalt berg

(Lösningsförslag finns sist i denna fil.)

Structs och funktionspekare

Recap Mera om nya typer Kort Fält. Programmering. Sommarkurs Verónica Gaspes. IDE-sektionen.

Grundläggande C-programmering

Laboration 4: Digitala bilder

Ulf Assarsson. Grundläggande C-programmering del 5 Applika'onsbyggnad/Spelprogrammering (real'dsstyrsystem) och Avancerad C.

Översikt Introduktion DST 1. Nicholas Wickström. IDE, Högskolan i Halmstad. N. Wickström

6 Lågnivåprogrammering

Ulf Assarsson. Grafisk display + seriekommunika3on (USART) Läromoment: USART Grundläggande C-programmering del 2

TDIU01 - Programmering i C++, grundkurs

Övning 7. Timer, serieport

Ulf Assarsson. Grundläggande C-programmering del 2 Pekare och Arrayer. Läromoment:

Programmeringsteknik med C och Matlab

Övning 6. Parallellport, timer

Digitala Projekt(EITF40) - Larm

#include <avr/io.h> #include <avr/interrupt.h> #include <util/delay.h> unsigned char num;

Datatyper. Programmering. Att definiera datatyper i Java. Laddade partiklar. (x,y) (Rx,Ry) hh.se/db2004

Studera databladen för LCD på sid 4, 5, 7, 8, 14, 18, 19, 20 och 23. Datablad finns på kurshemsidan.

Grundläggande C-programmering del 2 Pekare och Arrayer. Ulf Assarsson

Ulf Assarsson. Grundläggande C-programmering del 3. Läromoment: Grundläggande C-programmering del 3

Grundläggande C-programmering del 2 Pekare och Arrayer. Ulf Assarsson

Digitala Projekt(EITF40) - Larm

Grundläggande C-programmering del 4 Mer programstruktur samt Dynamisk minnesallokering Ulf Assarsson

EDA480/EDA485 - Maskinorienterad programmering, tentamen 2006-xx-xx 1(7)

SP:PROG3 HT12 Tenta

Realtidsprogrammering. En introduktion Implementering (med exempel från PIC)

SgLib Simple Graphics Library

Modbus Seriell Kommunikation

Grafiska pipelinen. Edvin Fischer

ATtiny 85. Krympa projekt från Arduino Uno

Raspberry Pi och Tellstick, ett program i C.

En grund i bildbearbetning för webben i Photoshop CS5

Rapport i Digitala Projekt (EDI021)

String [] argv. Dagens Agenda. Mer om arrayer. Mer om arrayer forts. String [] argv. argv är variabelnamnet. Arrayer och Strängar fortsättning

Grafik. För enklare datorsystem

Digitala Projekt (EITF11) Hemlarm

Grafik i DrRacket AV TOMMY KARLSSON

Demonstration och konsultation Arbetsbokens avsnitt 7 Händelsestyrt processbyte Förberedande inför laboration 4

Johan Karlsson Datavetenskap för teknisk kemi, 10p, moment 1 Datavetenskap Umeå Universitet. Tentamen

Laboration 3 GUI-programmering

Tentamen med lösningsförslag

Programmering med Java. Grunderna. Programspråket Java. Programmering med Java. Källkodsexempel. Java API-exempel In- och utmatning.

GPIO - General Purpose Input Output

Instruktioner för Articulate Storyline 2

Assemblerprogrammering för ARM del 3

lex källkod lex.l lexkompilator lex.yy.c C- kompilator lex.yy.c a.out sekvens av tokens a.out input specifikation av tokens mha reguljära uttryck

Rapport. Fyra i rad-spel. Rapport Digitala Projekt EITF11 Grupp 9 Emma Rasmusson & Louise Ragnarsson Handledare: Bertil Lindvall

Lab5 för prgmedcl04 Grafik

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

Hantering av textsträngar och talsträngar. William Sandqvist

Tentamen med lösningsförslag

Systemnära programmering Tentamen. Systemnära programmering, 7.5hp 5 november 2012

Övning från förra gången: readword

TDIU01 - Programmering i C++, grundkurs

Simulering med ModelSim En kort introduktion

Programmeringsteknik I

Scripthantering i AutoCAD

Dagens föreläsning. Repetition. Repetition - Programmering i C. Repetition - Vad C består av. Repetition Ett första C-program

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

Seriekommunikation. Ur innehållet: Nätverkstopologier Nätverksprotokoll Asynkron/synkron seriell överföring Programmering av USART-krets

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

3.5 Visuell programmering

Programmera i C Varför programmera i C när det finns språk som Simula och Pascal??

Mikael Bondestam Johan Isaksson. Spelprogrammering. med CDX och OpenGL

Digitala Projekt. Chip Quiz. Projektmedlemmar: Olov Nordenstam och Linus Hägerbrand. Grupp 9

LARMANLÄGGNING. Digitala Projekt, EITF11. Oskar von Knorring Emin Karimov Henrik Akej Handledare: Bertil Lindvall

Fortsä'ning Pekare. Ulf Assarsson. Originalslides av Viktor Kämpe

Instruktioner för Articulate Studio 13

4 grundregler. Minneshantering. Problemet. Windows minkrav

printenv sort pager printenv grep args sort pager

Per Holm Inlämningsuppgift 2, PTDC 2014/15 2 / 19. Med c = i konvergerar inte talföljden:

Beskrivning av porthantering i mikroprocessorn SAM3U som används på vårt labkort SAM3U- EK.

Datorteknik 2 (AVR 2)

Att använda pekare i. C-kod

Grafik. För enklare datorsystem

Exempel på användning av arv: Geometriska figurer

Fortsä'ning Pekare. Ulf Assarsson. Originalslides av Viktor Kämpe

Simulering med ModelSim En kort introduktion

The Phenomenal Doorbell Bilaga 2. Källkod

Tentamen FYTA11 Javaprogrammering

Växtviskaren EITF11 Digitala projekt VT15, I12

OOP Objekt-orienterad programmering

TDIU01 - Programmering i C++, grundkurs

729G04 Programmering och diskret matematik. Föreläsning 7

Dataminne I/O Stack 0x005D 0x3D SP low byte 0x005E 0x3E SP high byte

Objektorientering i liten skala

Pulsmätare Digitala Projekt EITF11

Innehållsförteckning. Figur- och tabellförteckning. Figure 1 Blockschema över hårdvaran...4 Figure 2 Blockschema över programet...

Objektorienterad programmering i Java. Föreläsning 5 Kort om Java-Applets

Dessa komponenter plus några motstånd, klockkrets, kondensatorer och annat smått och gott har åstadkommit ett fungerande POV-hjul.

Manual GISportalen (MapGuide) På Internet

Programräknaren visar alltid på nästa instruktion som skall utföras. Så fort en instruktion har hämtats så visar programräknaren på nästa instruktion.

Lathund. C för inbyggda system

Paneler - VCPXX.2. Programmeringsmanual för VCP-paneler. Revision 2

Transkript:

Programmering av grafisk display Arbetsboken avsnitt 5 - Drivrutrin för grafisk display, s. 86-96. Datablad LCD Grafisk under resurser på kurshemsidan, s.14-23. Lab 3 - Drivrutiner - Enkel grafik Lab 5 - Spel Programmering av grafisk display 1

Översikt Egenskaper Implementation av drivrutiner Skriva till display Prestanda Design av grafik Programmering av grafisk display 2

Egenskaper Upplösning på 128 x 64 pixlar. 128 pixel 64 Programmering av grafisk display 3

Egenskaper Inga färger eller ens gråskala. Varje pixel är antingen transparent eller fylld. Med andra ord: 1 bit / pixel. Programmering av grafisk display 4

Egenskaper Displayen består av två separata enheter. CS = Chip Select. 64 64 64 CS1 CS2 Programmering av grafisk display 5

Egenskaper Fysiska koordinater för displayen anges i page och address. I databladet kallas page X och address Y. page (X) address (Y) CS1 CS2 Programmering av grafisk display 6

Egenskaper Address anger vilken pixel inom varje halva i horisontalled. Från 0-63 för varje halva. Page anger 0-7 i vertikalled. 0 address (Y) 0 63 0 63 page (X) 7 CS1 CS2 Programmering av grafisk display 7

Egenskaper Vi kan bara läsa och skriva i hela alignade bytes i vertikalled! Exempel: address (Y) 0 63 0 63 0 page (X) 7 CS1 CS2 Programmering av grafisk display 8

Egenskaper Vi kan bara läsa och skriva i hela alignade bytes i vertikalled! Exempel: CS1 = 1, CS2 = 0, page = 0, address = 20. 1px address (Y) 0 63 0 63 8px 0 page (X) 7 CS1 CS2 Programmering av grafisk display 9

Egenskaper Vi kan bara läsa och skriva i hela alignade bytes i vertikalled! Exempel: CS1 = 0, CS2 = 1, page = 0, address = 20. address (Y) 0 63 0 63 0 page (X) 7 CS1 CS2 Programmering av grafisk display 10

Egenskaper Vi kan bara läsa och skriva i hela alignade bytes i vertikalled! Exempel: CS1 = 0, CS2 = 1, page = 1, address = 20. address (Y) 0 63 0 63 0 page (X) 7 CS1 CS2 Programmering av grafisk display 11

Egenskaper Vi kan bara läsa och skriva i hela alignade bytes i vertikalled! Exempel: CS1 = 0, CS2 = 1, page = 1, address = 21. address (Y) 0 63 0 63 0 page (X) 7 CS1 CS2 Programmering av grafisk display 12

Implementation av drivrutiner Vi behöver implementera en samling funktioner så att vi kan ge kommandon, skriva till och läsa från displayen. Mycket vad gällande synkronisering och annat är likt det vi gjorde för ASCII-displayen. Programmering av grafisk display 13

Implementation av drivrutiner Port E Låga bitar (0-7) = styrregister Höga bitar (8-15) = dataregister Programmering av grafisk display 14

Implementation av drivrutiner Definition av portar #define PORT_DISPLAY_BASE 0x40021000 // MD407 port E #define portmoder ((volatile unsigned int *) (PORT_DISPLAY_BASE)) #define portotyper ((volatile unsigned short *) (PORT_DISPLAY_BASE+0x4)) #define portospeedr ((volatile unsigned int *) (PORT_DISPLAY_BASE+0x8)) #define portpupdr ((volatile unsigned int *) (PORT_DISPLAY_BASE+0xC)) #define portidr ((volatile unsigned short *) (PORT_DISPLAY_BASE+0x10)) #define portidrhigh ((volatile unsigned char *) (PORT_DISPLAY_BASE+0x11)) #define portodrlow ((volatile unsigned char *) (PORT_DISPLAY_BASE+0x14)) #define portodrhigh ((volatile unsigned char *) (PORT_DISPLAY_BASE+0x14+1)) Programmering av grafisk display 15

Implementation av drivrutiner Definition av kommandon till styrregister. Hantera synkronisering. #define B_E 0x40 // Enable #define B_RST 0x20 // Reset #define B_CS2 0x10 // Controller Select 2 #define B_CS1 8 // Controller Select 1 #define B_SELECT 4 // 0 Graphics, 1 ASCII #define B_RW 2 // 0 Write, 1 Read #define B_RS 1 // 0 Command, 1 Data Programmering av grafisk display 16

Implementation av drivrutiner Definition av kommandon till display, sänds via dataregister. #define LCD_ON 0x3F // Display on #define LCD_OFF 0x3E // Display off #define LCD_SET_ADD 0x40 // Set horizontal coordinate #define LCD_SET_PAGE 0xB8 // Set vertical coordinate #define LCD_DISP_START 0xC0 // Start address #define LCD_BUSY 0x80 // Read busy status Se databladet sida 21. Programmering av grafisk display 17

Implementation av drivrutiner Från datablad. Programmering av grafisk display 18

Implementation av drivrutiner static void graphic_ctrl_bit_set(uint8_t x); static void graphic_ctrl_bit_clear(uint8_t x); static void select_controller(uint8_t controller); Programmering av grafisk display 19

Implementation av drivrutiner static void graphic_ctrl_bit_set(uint8_t x) { uint8_t c; c = *portodrlow; c &= ~B_SELECT; c = (~B_SELECT & x); *portodrlow = c; static void graphic_ctrl_bit_clear(uint8_t x) { uint8_t c; c = *portodrlow; c &= ~B_SELECT; c &= ~x; *portodrlow = c; Programmering av grafisk display 20

Implementation av drivrutiner static void select_controller(uint8_t controller){ switch(controller){ case 0: graphic_ctrl_bit_clear(b_cs1 B_CS2); break; case B_CS1 : graphic_ctrl_bit_set(b_cs1); graphic_ctrl_bit_clear(b_cs2); break; case B_CS2 : graphic_ctrl_bit_set(b_cs2); graphic_ctrl_bit_clear(b_cs1); break; case B_CS1 B_CS2 : graphic_ctrl_bit_set(b_cs1 B_CS2); break; Programmering av grafisk display 21

Implementation av drivrutiner void graphic_initialize(void); static void graphic_wait_ready(void); Programmering av grafisk display 22

Implementation av drivrutiner void graphic_initialize(void) { graphic_ctrl_bit_set(b_e); delay_micro(10); graphic_ctrl_bit_clear(b_cs1 B_CS2 B_RST B_E); delay_milli(30); graphic_ctrl_bit_set(b_rst); delay_milli(100); graphic_write_command(lcd_off, B_CS1 B_CS2); graphic_write_command(lcd_on, B_CS1 B_CS2); graphic_write_command(lcd_disp_start, B_CS1 B_CS2); graphic_write_command(lcd_set_add, B_CS1 B_CS2); graphic_write_command(lcd_set_page, B_CS1 B_CS2); select_controller(0); Programmering av grafisk display 23

Implementation av drivrutiner static void graphic_wait_ready(void) { uint8_t c; graphic_ctrl_bit_clear(b_e); *portmoder = 0x00005555; // 15-8 inputs, 7-0 outputs graphic_ctrl_bit_clear(b_rs); graphic_ctrl_bit_set(b_rw); delay_500ns(); while(1) { graphic_ctrl_bit_set(b_e); delay_500ns(); c = *portidrhigh & LCD_BUSY; graphic_ctrl_bit_clear(b_e); delay_500ns(); if( c == 0 ) break; *portmoder = 0x55555555; // 15-0 outputs Programmering av grafisk display 24

När Busy flag är låg så kan displayen acceptera kommandon och data. Se databladet sida 19. Programmering av grafisk display 25

Implementation av drivrutiner static uint8_t graphic_read(uint8_t controller); static uint8_t graphic_read_data(uint8_t controller); Programmering av grafisk display 26

Implementation av drivrutiner static uint8_t graphic_read(uint8_t controller) { uint8_t c; graphic_ctrl_bit_clear(b_e); *portmoder = 0x00005555; graphic_ctrl_bit_set(b_rs B_RW); select_controller(controller); delay_500ns(); graphic_ctrl_bit_set(b_e); delay_500ns(); c = *portidrhigh; graphic_ctrl_bit_clear(b_e); *portmoder = 0x55555555; // 15-8 inputs, 7-0 outputs // 15-0 outputs if( controller & B_CS1 ) { select_controller(b_cs1); graphic_wait_ready(); if( controller & B_CS2 ) { select_controller(b_cs2); graphic_wait_ready(); return c; Programmering av grafisk display 27

Implementation av drivrutiner static uint8_t graphic_read_data(uint8_t controller) { graphic_read(controller); return graphic_read(controller); Enligt databladet måste vi läsa ut värdet två gånger för att det ska få effekt, se s. 19. Programmering av grafisk display 28

Implementation av drivrutiner static void graphic_write(uint8_t value, uint8_t controller); static void graphic_write_command(uint8_t command, uint8_t controller); static void graphic_write_data(uint8_t data, uint8_t controller); Programmering av grafisk display 29

Implementation av drivrutiner static void graphic_write(uint8_t value, uint8_t controller) { *portodrhigh = value; select_controller(controller); delay_500ns(); graphic_ctrl_bit_set(b_e); delay_500ns(); graphic_ctrl_bit_clear( B_E ); if(controller & B_CS1) { select_controller( B_CS1); graphic_wait_ready(); if(controller & B_CS2) { select_controller( B_CS2); graphic_wait_ready(); Programmering av grafisk display 30

Implementation av drivrutiner static void graphic_write_command(uint8_t command, uint8_t controller) { graphic_ctrl_bit_clear(b_e); select_controller(controller); graphic_ctrl_bit_clear(b_rs B_RW); graphic_write(command, controller); static void graphic_write_data(uint8_t data, uint8_t controller) { graphic_ctrl_bit_clear(b_e); select_controller(controller); graphic_ctrl_bit_set(b_rs); graphic_ctrl_bit_clear(b_rw); graphic_write(data, controller); Programmering av grafisk display 31

Skriva till display void graphic_clear_screen(void) { uint8_t i, j; for(j = 0; j < 8; j++) { graphic_write_command(lcd_set_page j, B_CS1 B_CS2); graphic_write_command(lcd_set_add 0, B_CS1 B_CS2); for(i = 0; i <= 63; i++){ graphic_write_data(0, B_CS1 B_CS2); Programmering av grafisk display 32

Skriva till display Funkar ok om vi vill rensa hela displayen, men inte så smidigt annars. Vi vill kunna skriva till displayen varje pixel för sig. (x, y) Programmering av grafisk display 33

Skriva till display Vi vill ha en funktion void pixel(int x, int y, int set) Inför logiska koordinater med x i [1..128] och y i [1..64] 1 1 x 128 y (x, y) 64 Programmering av grafisk display 34

Skriva till display Hur skriver vi en sådan funktion när vi bara kan läsa/skriva i hela bytes? Exempel: Vi vill skriva till logiska koordinater (86, 12). 1 1 x 128 y (86, 12) 64 Programmering av grafisk display 35

Egenskaper Vår address blir då 86 65 = 21. Page blir (12-1) / 8 = 1. Vår bit i vår vertikala byte blir (12-1) % 8 = 3. address (Y) 0 63 0 63 0 page (X) 7 CS1 CS2 Programmering av grafisk display 36

Egenskaper Vi läser då en byte med fysiska koordinater (CS2, 21, 1). Vi vill skriva till bit 3 i denna byte. = mask läst resultat Programmering av grafisk display 37

Egenskaper Skriv denna resulterande byte tillbaka till displayen. address (Y) 0 63 0 63 0 page (X) 7 CS1 CS2 Programmering av grafisk display 38

Skriva till display void pixel(int x, int y, int set) { uint8_t mask, c, controller; int index; if((x < 1) (y < 1) (x > 128) (y > 64)) return; index = (y-1)/8; switch( (y-1)%8 ) { case 0: mask = 1; break; case 1: mask = 2; break; case 2: mask = 4; break; case 3: mask = 8; break; case 4: mask = 0x10; break; case 5: mask = 0x20; break; case 6: mask = 0x40; break; case 7: mask = 0x80; break; mask = 1 << ((y-1)%8); Forts. Programmering av grafisk display 39

Skriva till display if(set == 0) mask = ~mask; if(x > 64){ controller = B_CS2; x = x - 65; else { controller = B_CS1; x = x-1; graphic_write_command(lcd_set_add x, controller ); graphic_write_command(lcd_set_page index, controller ); c = graphic_read_data(controller); graphic_write_command(lcd_set_add x, controller); if(set) mask = mask c; else mask = mask & c; Notera: på grund av autoinkrementering av address graphic_write_data(mask, controller); Programmering av grafisk display 40

Skriva till display int main(int argc, char **argv) { POBJECT p = &ball; init_app(); graphic_initialize(); graphic_clear_screen(); draw(pos.x, pos.y) p->set_speed(p, 4, 1); while(1) { p->move(p); Lista av logiska koordinater beskriver geometrin. Skicka till pixel() med offset för nuvarande position av objektet. Programmering av grafisk display 41

Prestanda Upplevd bildkvalité - Flimmer. - Hackar. - Kan vi se enskilda bildrutor? Uppdateringsfrekvens (eng. frame rate) - Vad är en lämplig uppdateringsfrekvens för spel? - Hur kan vi specificera en uppdateringsfrekvens för vårt spel? Programmering av grafisk display 42

Prestanda #define TARGET_FPS 30 int main(int argc, char **argv) { POBJECT p = &ball; init_app(); graphic_initialize(); graphic_clear_screen(); p->set_speed(p, 4, 1); while(1) { p->move(p); Programmering av grafisk display 43

Prestanda #define TARGET_FPS 30 int main(int argc, char **argv) { POBJECT p = &ball; init_app(); graphic_initialize(); graphic_clear_screen(); p->set_speed(p, 4, 1); while(1) { p->move(p); delay_milli(1000 / TARGET_FPS); Programmering av grafisk display 44

Prestanda Programmering av grafisk display 45

Prestanda Varför flimrar det så? På grund av att vi ritar direkt till skärmen. Lösning: använd dubbelbuffering. draw() draw() draw() draw() draw() draw() frontbuffer (display) Programmering av grafisk display 46

Prestanda Rita till en backbuffer alltså till en buffer i RAM-minnet. backbuffer Rita sedan hela backbuffern i ett svep när vi är klara med vår nuvarande frame. draw() draw() draw() draw() draw() draw() frontbuffer (display) finished drawing copy_buffer() Programmering av grafisk display 47

Prestanda En enkel implementation. uint8_t backbuffer[1024]; // 128 * 64 / 8 void clear_backbuffer() { int i; for (i = 0; i < 1024; i++) backbuffer[i] = 0; Programmering av grafisk display 48

Prestanda Skriv till backbuffern istället för till skärmen. void pixel(int x, int y) { uint8_t mask; int index = 0; if( (x > 128 ) (x < 1) (y > 64) (y < 1) ) return; mask = 1 << ((y-1)%8); if(x > 64) { x -= 65; index = 512; index += x + ((y-1)/8)*64; backbuffer[index] = mask; Programmering av grafisk display 49

Prestanda Kopiering av backbuffer till frontbuffer. Jämför med graphic_clear_screen(). void graphic_draw_screen(void) { uint8_t i, j, controller, c; unsigned int k = 0; for(c = 0; c < 2; c++) { controller = (c == 0)? B_CS1 : B_CS2; for(j = 0; j < 8; j++) { graphic_writecommand(lcd_set_page j, controller); graphic_writecommand(lcd_set_add 0, controller); for(i = 0; i <= 63; i++, k++) { graphic_write_data(backbuffer[k], controller); Programmering av grafisk display 50

Prestanda int main(int argc, char **argv) { POBJECT p = &ball; init_app(); graphic_initialize(); graphic_clear_screen(); p->set_speed(p, 4, 1); while(1) { p->move(p); delay_milli(40); int main(int argc, char **argv) { init_app(); graphic_initialize(); graphic_clear_screen(); while(1) { clear_backbuffer(); // DO STUFF. graphic_draw_screen(); delay_milli(40); Programmering av grafisk display 51

Design av grafik Arbetsbok: lista av logiska koordinater. - Svårt att rita mer avancerad grafik. - Inte heller minneseffektivt: två unsigned char per pixel. Vill designa sprites i externt bildredigeringsprogram. - Problem 1: vilket format stödjer 1 bit per pixel? Vill ladda dessa bildfiler i vårt program. - Problem 2: vi har inget standardbibliotek med fil-i/o i vårt inbyggda system. Programmering av grafisk display 52

Design av grafik Förslag till lösning - Använd filformat X Bitmap (.xbm). - Formatet specificeras av bredd, höjd och ett antal bytes, allt direkt i c-kod! - Kan därför användas direkt i källkoden med #include "image.xbm Programmering av grafisk display 53

Design av grafik Filformatet är standard och stödjs av många bildbehandlingsprogram. Tänkte visa två exempel som använder programmet GIMP (https://www.gimp.org/), som är gratis och finns till många plattformar. Programmering av grafisk display 54

Design av grafik Designa egen sprite Gå till File->New Sätt bredd och höjd i pixlar Välj Color space: Grayscale Programmering av grafisk display 55

Design av grafik Bilden är extremt liten på vanlig bildskärm. Zooma in. Programmering av grafisk display 56

Design av grafik 1x1 pixels rutnät hjälper till vid ritning. Välj Image->Configure Grid Välj Width = Height = 1 px Programmering av grafisk display 57

Design av grafik Toggla View->Show Grid Programmering av grafisk display 58

Design av grafik Använd Pencil Tool Sätt Size = 1 px Programmering av grafisk display 59

Design av grafik Rita! Programmering av grafisk display 60

Design av grafik Spara sedan som X Bitmap-fil. Välj File->Export as Spara med ändelsen.xbm Klicka på Export i dialogruten Programmering av grafisk display 61

Design av grafik Resultat: Programmering av grafisk display 62

Design av grafik Vill designa en större eller mer komplicerad sprite. Hitta en bild du gillar på internet och sampla ner färgrymd och upplösning! Exempel: Yoshi. Programmering av grafisk display 63

Design av grafik Välj Image->Scale Image Skala om till önskad storlek. Programmering av grafisk display 64

Design av grafik Resultat (efter rejäl inzoomning) Programmering av grafisk display 65

Design av grafik Trunkera till 1-bits färg. Välj Colors->Threshold Dra i slidern tills det ser bra ut. Programmering av grafisk display 66

Design av grafik Nu är sprite:n färdig att använda i programmet. Notera: utgick från en svartvit bild. Kan även ta färgbild och konvertera till svartvit, men kan vara svårt att få bra resultat. Programmering av grafisk display 67

Design av grafik Ni vill vi designa en funktion för att rita ut sprites på X Bitmap-format. Givet struct och hjälpfunktion nedan. typedef struct { unsigned char width; unsigned char height; unsigned char* data; sprite; static void load_sprite(sprite* s, unsigned char* data, int width, int height) { s->width = width; s->height = height; s->data = data; Programmering av grafisk display 68

Design av grafik bit 1 2 3 4 5 6 7 8 Programmering av grafisk display 69

Design av grafik void draw_sprite(sprite* s, int x, int y, int set) { int i,j,k, width_in_bytes; if (s->width % 8 == 0) width_in_bytes = s->width / 8; else width_in_bytes = s->width / 8 + 1; for (i = 0; i < s->height; i++) for (j = 0; j < width_in_bytes; j++) { unsigned char byte = s->data[i * width_in_bytes + j]; for (k =0; k < 8; k++) { if (byte & (1 << k)) pixel(8 * j + k + x + 1, i + y + 1, set); Programmering av grafisk display 70