I
förra föreläsningens hemuppgifter övade ni på att skriva ut till konsolen. För mer avancerad output är detta dock begränsande - dels p g a att vi är hänvisade till
ascii-tecken, och dels pga att på t ex MacOS är fonten default satt till en font med varierande teckenvidd för olika bokstäver, vilket gör det krångligare att beräkna var i x-led våra utskrifter hamnar.
Därför skall vi nu istället rita ut till en grafisk display.
På labdatorn MD407 kommer ni att kommunicera direkt med styrenheten för grafikdisplayen via portar på fixa minnesadresser. På operativsystem tillåts detta typiskt inte (t ex Windows, MacOS, Linux). Dessutom vill vi typiskt rita ut till ett fönster som hanteras av operativsystemet. För detta måste man accessa specifika funktioner i operativsystemet. Funktionerna varierar mellan operativsystem. På Mac kan man t ex använda Cocoa och på Windows t ex Win32. I dessa hemuppgifter vill vi ha så operativsystemsoberoende lösningar som möjligt och det är även ett vanligt önskemål i verkligheten. Därför kommunicerar man typiskt hellre med API:er (som abstraherar bort OS-beroendet) som kommunicerar med operativsystemet, som kommunicerar med drivrutiner som kommunicerar med hårdvaran. Man kan använda färdiga libraries som
SDL eller
wxWidgets som båda har C-interface. Vi har valt
SDL som API. SDL stödjer Windows, Mac OS X, Linux, iOS och Android. SDL är populärt och används av ett flertal ledande spelföretag, t ex Valve. (SDL är även för oss ett pedagogiskt bättre val då det inte abstraherar bort realtidsloopen och tillåter ett mycket lättviktigt användande i form av ett fåtal anrop.)
För spel behöver vi även kunna känna av user-input, som mus och tangentbord. På labdatorn MD407 kommunicerar ni direkt med en numerisk keypad via portar. Via standardbiblioteket <stdio.h> så har C inbyggt stöd för att ta emot tecken (getchar()) och även hela strängar (scanf()) som matas in via tangentbordet. Detta bygger på att C-kompilatorn vet vilket operativsystem det skall kompilera mot. Eftersom MD407 saknar operativsystem, och typiskt även tangentbord, så fungerar inte det inbyggda stödet. Med lite pill och tillägg av egna funktioner kan man dock få getchar() och scanf() (och även printf()) att fungera - förutsatt att det finns ett inkopplat tangentbord eller motsvarande.
I spel vill man vanligen kunna känna av vilka tangenter som är nedtryckta vid en viss tidpunkt (ibland är flera nedtryckta samtidigt). C har inget inbyggt stöd via standardbiblioteken för att känna av en tangents status. På Windows kan vi använda GetAsyncKeyState() som inkluderas via Windows.h. På Mac kan man använda Cocoa eller det gamla Carbon men båda är en aning bökigare. SDL har dock operativsystemsoberoende stöd, via funktionen SDL_GetKeyboardState(), vilket vi kommer använda oss av.