Hoppa till innehållet

Programmera spel i C++ för nybörjare/Installation av 1.6

Från Wikibooks


Rubriktext

[redigera]

Installera SFML 1.6 i Windows 7 och VC++ 2010 express.

[redigera]

(Genomgången förutsätter att du har en fungerande installation av Microsoft Visual C++ 2010 Express på din dator. Tidsåtgången är drygt en timme)

Skaffa sfml-filerna

[redigera]

Det första du skall göra är att hämta version 1.6 av SFML. När du surfar in till SFML:s hemsida och tittar på ”download” biblioteken (http://www.sfml-dev.org/download.php) är det lätt att bli förvirrad. Inte blir det bättre av att det faktiskt står på hemsidan att paketet för VC++ 2008 också går att använda till 2010, vilket inte är helt sant. Det du skall göra är att söka upp rubriken: SFML full SDK (headers / libraries / documentation / sources / samples / external libraries) och välj den SDK som är för 2008: Windows - Visual C++ 2008 (23.5 MB) Filen är ett zip-arkiv med nedpackade filer. När du hämtat hem filen bör du ha någon form av uppackningsprogram. Troligen finns det som en del av operativsystemet i Windows, annars kan du t.ex. söka upp 7zip på Internet till 2010 format Skapa en lättillgänglig mapp med kort sökväg. Ett bra exempel är C:\sfml16\ och packa upp innehållet i filen du hämtade från SFML:s hemsida i den mappen. I resten av exemplet antar jag att filerna packats upp till den här platsen.

Kompilera om dem till 2010-format

[redigera]

Efter detta skall du kompilera om filerna du just hämtat så att de passar just din dator. Principiellt går det att använda filerna precis som de är, men i praktiken kommer du antagligen att få grått hår och söndertuggade naglar alldeles i onödan. Det är kanske fel att säga att det blir enkelt, men det är inte heller direkt svårt. Genomgången här följer i stort en genomgång som finns på engelska på Youtube, även om den bara visar hur man gör för debug-mode, men man kör helt enkelt alla alternativ man kan (beskrivs här nedanför) för att kunna skapa egna spel:

http://www.youtube.com/watch?v=-uHGZGgMETg


Hitta solution-fil

[redigera]

Använd utforskaren (explorer.exe) och sök upp en fil med namnet SFLM.sln .sln betyder Solution och visar att det är en fil som tillhör VC++. Filen bör hittas på: C:\sfml16\SFML-1.6\build\vc2008\SFML.sln Om du inte ser .sln på slutet har du inte ställt in Windows att visa filändelser. Det kan du ställa in i kontrollpanelen.

När du dubbelklickat på filen (eller valt högerklick + öppna) bör du öppna den i Visual C++ 2010 Express, om du har gratis versionen, Visual C++ Express 10 om du betalat för utvecklingssystemet. Programmet vill konvertera filerna till 2010. Kryssa inte i rutan om att du vill skapa back-up och konvertera filerna till 2010 format. Du kommer att få ett felmeddelande, men det är normalt.

När allt är klart öppnas C++ med ditt projekt. På vänster sida, i panelen, anges en hel hög med filer som ingår i projektet. Radera alla utom:

 sfml-audio
 sfml-graphics
 sfml-main
 sfml-network
 sfml-system
 sfml-window

Du raderar dem genom att markera dem och trycka på [DEL] tangenten, alternativt högerklicka och välj [Remove].

Längs överkanten finns tre alternativrutor med texten ”Win 32” i mittenrutan.

Ändra den vänstra rutans text till ”Debug DLL” och tryck på F7 tangenten. Låt programmet jobba klart.Du bör få "6 succeeded" som resultat.

Ändra därefter den vänstra rutans text till ”Debug static” och tryck på F7 tangenten. Låt programmet jobba klart. Du bör få "5 succeeded" och "1 up-to-date" som resultat.

Ändra därefter den vänstra rutans text till ”Release DLL” och tryck på F7 tangenten. Låt programmet jobba klart. Du bör få "6 succeeded" som resultat.

Ändra därefter den vänstra rutans text till ”Release static” och tryck på F7 tangenten. Låt programmet jobba klart. Du bör få "5 succeeded" och "1 up-to-date" som resultat. Om du sedan väljer enbart "Debug" och därefter enbart "Release" Skall det komma upp en text om att 6 filer är up to date. Då har allt fungerat.

Filerna har skapats i <installationsbiblioteket>\SFML-1.6\lib\vc2008. Om du tittar där skall du t.ex. ha en sfml-graphics-s.lib, och en sfml-graphics-s-d.lib De filer som har -s är de som kopplas till release med statisk koppling, och de med -s-d är filer som kopplas till statisc debug. Man testkör programmen i debug men väljer release när programmet är klart och redo att släppas. I den här wikibokens kapitel om SFML används konsekvent static för att underlätta om du vill ge bort ditt spel.

Statisk eller dynamisk

[redigera]

Med statisk länkning behöver du inte skicka med en massa extra filer när du skickar iväg ditt program i form av en exe-fil. Med dynamisk länkning måste alla dll-filer som ingår i projektet skickas med.

En exe-fil som skapats med statisk länkning blir därför större än en som skapats med dynamisk länkning, men samtidigt riskerar man inte att glömma att skicka iväg någon extra dll-fil som behöv för att programmet skall fungera.

Radera filer

[redigera]

När du gjort detta är filerna konverterade från VC++ 2008 till VC++ 2010 format. Det var väl inte så krångligt? Nu är det bara litet kvar. I den övre menyn väljer du [File]-[Close Solution] så att projektet stängs.

Använd utforskaren (explorer.exe) och gå till C:\sfml16\SFML-1.6\lib\ Där borde det finnas 32 filer och en mapp som heter vc2008. Radera alla filerna och byt namn på mappen till vc2010 så att du vet var de ”nya” filerna finns. De filer du raderar används ändå inte i 2010 men kan ställa till problem vid programmering om de blir inlästa i projektet av misstag. Du raderar dem genom att markera dem och trycka på ”DEL” tangenten.


Första projektet, ett systemprojekt

[redigera]

Skapa ett nytt projekt i VC++ 2010 express genom att trycka [File]-[New]-[Project…], du får upp ett flertal alternativ, välj ”Win32 Console Application”. Döp projektet till sfml_test. Tryck inte på [Finish] knappen utan ta [Next >] och se till så att rutan ”Empty Project” är ibockad innan du klickar på [Finish] knappen. Nu skall vi skapa en fil med c++ kod. Utan den är den högra panelen stängd och osynlig. Om du tittar på vänstra panelen ser du att nästan längst upp står ditt projekts namn med fet stil. Högerklicka på namnet. välj [Add], sedan [New Item…], och sedan C++ File (.cpp). Döp den till main (INGENTING annat) och klicka sedan på [Add] knappen. Om du sedan tittar på den vänstra panelen ser du att det skapats en fil som heter main.cpp

Om du inte skapar ett tomt projekt som du sedan kopplar main.cpp till, utan är slö och bara trycker "finish" när du påbörjat ett nytt projekt i visual c++ express 2010 kommer du att få stora problem. Projektet kommer inte att söka efter sfml filerna längre utan klaga på att den inte hiter "precompiled headers" osv. Ditt projekt har blivit oanvändbart. Då får du börja om från början och göra rätt.

Inställningar under "All Configurations"

[redigera]

Högerklicka på projektnamnet i vänstra panelen igen. Välj det nedersta alternativet, [Properties]. Då får du upp allting som har att göra med ditt projekt. Överst finns tre alternativrutor. Ändra den längst till vänster från [Active(Debug)] till [All Configurations] Klicka på:

 [C/C++]
 [General]

Längst upp på den högra sidan står det ”Additional Include Directories”. I textrutan bredvid fylller du i sökvägen till din SFML include mapp; C:\sfml16\SFML-1.6\include. Tryck därefter på [Verkställ] knappen. Om du av misstag trycker på [OK] knappen är det ingen katastrof, men du måste öppna properties igen och du måste återigen ändra alternativrutan till [All Configurations] innan du fortsätter. Den återställs nämligen automatiskt när fönstret stängs.

OBS! om du inte hittar den rubriken får du istället gå in under:

 VC++ Directories

Där väljer du

Include Directories

och på höger sida söker du upp C:\sfml16\SFML-1.6\include, det händer av någon okänd anledning på en del av datorerna som man nyinstallerar VC++ på. Efter du gjort detta kommer rubriken med C++ att komma upp, precis som det beskrivits här ovan. Stäng bara ner pop-up fönstret först och öppna det sedan igen.


Sök därefter upp rubriken under C/C++ som heter [Linker]. Klicka på:

 [Linker]
 [General]

I mitten på högra sidan står det: ”Additional Library Directories”. I den tomma textrutan bredvid skriver du in sökvägen till den mapp du alldeles nyss döpte om till vc2010; C:\sfml16\SFML-1.6\lib\vc2010\;%(AdditionalLibraryDirectories). Klicka därefter på [Verkställ].

Inställningar under "Debug"

[redigera]

Nu är du klar med alla inställningar som VC++ 2010 Express behöver i ”All Configurations” läget. Nu är det dags att ställa in allt som behövs i ”Debug mode”, dvs. när du programmerar. Högerklicka på projektnamnet och välj [Properties]. Ändra alternativet i den övre vänstra alternativrutan till Debug. Efter det söker du upp rubriken

 [Linker]
 [Input]

Överst på högra panelen står då: ”Additional Dependencies”. Klicka på rutan till höger som är full av text. Då syns en liten pil-ner ikon. Klicka på den så att markeringen <Edit…> syns och efter det att du klickat på <Edit…> skall redigeringsfönstret öppna sig. I den tomma rutan ändrar du postens namn från sfml-system-s.lib till sfml-system-s-d.lib. Att det där extra –d kom med innebär att just den filen skall läsas i ”Debug mode”. Så är det med samtliga SFML:s filer som har ett –d i sitt filnamn. Efter det att du sparat ändringen lägger programmet automatiskt till %(AdditionalDependencies) efter filnamnet.

Inställningar under "Release"

[redigera]

Högerklicka på projektnamnet och välj [Properties]. Ändra alternativet i den övre vänstra alternativrutan till Release. Efter det söker du upp rubriken:

 [Linker]
    [Input]

Överst på högra panelen står då: ”Additional Dependencies”. Klicka på rutan till höger som är full av text. Då syns en liten pil-ner ikon. Klicka på den så att markeringen <Edit…> syns och efter det att du klickat på <Edit…> skall redigeringsfönstret öppna sig. I den tomma rutan skall det stå sfml-system-s.lib.


(överkurs)

Sök upp rubriken:

 [C/C++]
 [Preprocessor]

På den vänstra panelen på höger sida står det: Preprocessor definitions. Klicka på textraden tillhöger, sedan på den lilla pilen som uppenbarar sig. Du ser en rad med flera direktiv. Längst ner skriver du:

SFML_STATIC

Om du inte gör det här, kommer du att få göra det längst upp i alla källkodsfiler i framtiden.

Klockan - en test

[redigera]

På SFML:s hemsida finns ett litet enkelt program för att testa om installationen har fungerat. Skriv in följande kod i det tomma fönstret som brukar användas för att skriva i C++ kod:

 #include <iostream>
 #include <SFML/System.hpp>
 
 int main (int argc, char **argv)
 {
 
 
 	sf::Clock clock;
 		sf::Sleep(0.1f);
 
 	while (clock.GetElapsedTime() < 5.0f)
 	{
 	std::cout << clock.GetElapsedTime() << std::endl;
 	sf::Sleep(0.5f);
 	}
 	return 0;
 }

Tryck [CTRL]+[SHIFT]+[B] för att bygga projektet. Tryck [CTRL]+[F5] för att köra projektet.

Om allt gått som det är tänkt borde det komma upp ett svart fönster med vit text som räknar uppåt i millisekunder tills 5 nåtts. Pröva programmet både i debug-mode och release-mode genom att ändra alternativrutan uppe till vänster.

Andra projektet, ett enkelt fönster

[redigera]

Det är inte så väldigt kul att se på siffror som räknar upp, ett spel skall ju helst ha en spelplan. För det krävs en yta att rita upp den på, och ett fönster som den innehåller. För att kunna använda grafikbiblioteket använder vi direktivet: #include <SFML/Graphics.hpp> och för att komma åt fönstret använder vi fönsterbiblioteket genom att använda direktivet: #include <SFML/Window>. Radera ut koden du skrev in för att skapa systemklockan och se istället till att följande kod står i kodfönstret i högra panelen, det enda koden gör är att den skapar ett rött fönster, men det här är början till framtida spel:

 #include <iostream>
 #include <SFML/System.hpp>
 #include <SFML/Window.hpp>
 #include <SFML/Graphics.hpp>

int main (int argc, char *argv)
  { //main startar
          sf::RenderWindow App(sf::VideoMode(1024, 768, 32), "Test av fönster", sf::Style::Close);
         //sf:: innebär funktioner ur SFML namespace
        // Du skapar ett fönster som är 1024x768 med 32 bitars färgdjup och titeln Test av fönster.
        // Style Close innebär att det finns en minimera ikon [-] och en stäng ikon [x]
        // Startar spel loopen, om [ESC] används eller om man klickar på [x] ikonen
        // uppe till höger stängs programmet.
	   	//  ändra style till Resize om du inte vill ha ikoner däruppe

          while (App.IsOpened())
            { //while 1 startar
            sf::Event Event; //kolla om mus/tangentbord används

           while (App.GetEvent(Event))
               { //while 2 börjar
               if (Event.Type == sf::Event::Closed)
                  { //if 1  börjar
                  App.Close();//avsluta programmet
                  }//if 1 slutar

               if ((Event.Type == sf::Event::KeyPressed) && (Event.Key.Code == sf::Key::Escape))
               // en tangent har tryckts ner och tangenten är escape-tangenten
                  { //if 2 börjar
                  App.Close();//avsluta programmet
                  } //if 2 slutar
                } //while 2 slutar
         //Slutligen visar vi upp ändringarna om och om igen många gånger i sekunden
         App.Clear(sf::Color(255, 0, 0)); //rensa allt i fönstret och ersätt med rött
         App.Display();
           } //while 1 slutar


       return 0;
  }

Om du kompilerar den här koden nu kommer du att få olika felmeddelanden som samtliga är kopplade till fellänkade filer (se nedan t.ex.). Var inte orolig för du är i gott sällskap. Om man surfar runt på Internet framkommer det att just detta med fellänkningar är något som är så frustrerande och svårt att komma runt att många inte fortsätter att använda SFML, trots att de är relativt lätta att komma runt om man bara får hjälp och råd:

1>------ Build started: Project: sfml_test, Configuration: Debug Win32 ------
1>  main.cpp
1>main.obj : error LNK2001: unresolved external symbol "public: virtual __thiscall sf::Window::~Window(void)" (??1Window@sf@@UAE@XZ)
1>main.obj : error LNK2001: unresolved external symbol "public: void __thiscall sf::Window::Display(void)" (?Display@Window@sf@@QAEXXZ)
1>main.obj : error LNK2001: unresolved external symbol "public: void __thiscall sf::Window::Close(void)" (?Close@Window@sf@@QAEXXZ)
1>main.obj : error LNK2001: unresolved external symbol "public: bool __thiscall sf::Window::GetEvent(class sf::Event &)" (?GetEvent@Window@sf@@QAE_NAAVEvent@2@@Z)
1>main.obj : error LNK2001: unresolved external symbol "public: bool __thiscall sf::Window::IsOpened(void)const " (?IsOpened@Window@sf@@QBE_NXZ)
1>main.obj : error LNK2001: unresolved external symbol "public: __thiscall sf::Window::Window(class sf::VideoMode,class std::basic_string<char,struct  std::char_traits<char>,class std::allocator<char> > const &,unsigned long,struct sf::WindowSettings const &)" (??0Window@sf@@QAE@VVideoMode@1@ABV?$basic_string@DU? $char_traits@D@std@@V?$allocator@D@2@@std@@KABUWindowSettings@1@@Z)
1>main.obj : error LNK2001: unresolved external symbol "public: __thiscall sf::VideoMode::VideoMode(unsigned int,unsigned int,unsigned int)" (??0VideoMode@sf@@QAE@III@Z)
1>c:\users\builder\documents\visual studio 2010\Projects\sfml_test\Debug\sfml_test.exe : fatal error LNK1120: 7 unresolved externals
 ========== Build: 0 succeeded, 1 failed, 0 up-to-date, 0 skipped ==========

Hittar inte sfml PDB...

[redigera]

Ibland fylls fönstret med en massa:

sfml PDB 'vc100.pdb' was not found with... 

De uppstår pga. en minnesläcka i SFML 1.6 och går inte att göra något åt. Den buggen är åtgärdad i SFML 2.0. Minnesläckan har ingen som helst betydelse för dig som programmerare, programmet blir lika bra ändå i slutändan så det är bara att strunta i den typen av felmeddelanden.

Redigera fellänkningar

[redigera]

I det första projektet hade vi en enda include: <SFML\System.hpp>. det var också just filen sfml-system-s.lib som du lade till i "All Configuration" och sfml-system-s-d.lib i "Debug" mode. Nu har du lagt till två extra include, och då måste du se till att VC++ hittar dem också. Gör så här:

Fler inställningar under "Debug"

[redigera]

Högerklicka på namnet på ditt projekt så att du får upp menyn med "Properties" längst ner igen. Ändra alternativrutan uppe till vänster till "Debug" och sök dig fram till:

 [Linker]
 [Input]

Klicka på rutan till höger som är full av text. Då syns en liten pil-ner ikon. Klicka på den så att markeringen <Edit…> syns och efter det att du klickat på <Edit…> skall redigeringsfönstret öppna sig. I den rutan står redan sfml-system-s-d.lib. Nu måste du även fylla i för window och graphics. Skriv en post för varje rad:

 sfml-system-s-d.lib
 sfml-window-s-d.lib
 sfml-graphics-s-d.lib

Klicka därefter på [OK] knappen så det sparas och därefter [Verkställ] knappen längst ner. Observera att även om #include använder stor bokstav i namnet skall du inte göra det här utan här skall namnet vara exakt likadant som nanmet på motsvarande fil.

Inställningar under "Release"

[redigera]

Ändra alternativrutan uppe till vänster till "Release" och sök upp rubrikerna:

 [Linker]
 [Input]

Överst på högra panelen står då: ”Additional Dependencies”. Klicka på rutan till höger som är full av text. Då syns en liten pil-ner ikon. Klicka på den så att markeringen <Edit…> syns och efter det att du klickat på <Edit…> skall redigeringsfönstret öppna sig. I rutan står redan sfml-system-s.lib. Skriv en post för varje rad så att det står:

 sfml-system-s.lib
 sfml-window-s.lib
 sfml-graphics-s.lib 

Klicka därefter på [OK] knappen och sedan [OK] knappen för Properties så att fönstret stängs.

Dags för provkörnig. Klicka [CTRL]+[SHIFT]+[B] för att bygga projektet och därefter [CTRL]+[F5]. Då skall du få upp ett litet fönster med svart bakgrund och ett större svart fönster där spelet skall synas i framtiden. Du skall kunna föra muspekaren över spelfönstret utan att den stannar upp och bägge fönstren skall stängas när du trycker på [ESC] tangenten. Då har du gjort allting rätt.

Framtida projekt

[redigera]

varje gång du startar ett projekt i framtiden kan du bara följa denna enkla lista. Du behöver inte kompilera om några filer utan bara ställa in projektet så att alla filer kan hittas av VC++.

  • Skapa ett nytt win32 konsoll projekt, se till så att det är tomt.
  • Lägg till en c++ fil som heter main.cpp
  • Ändra alternativrutan uppe till vänster till "All configurations".
  • Lägg till sökvägen till SFML under C/C++ "general" fliken till "C:\sfml16\SFML-1.6\include", eller den sökväg du har till dina includefiler och tryck på "verkställ" knappen.
  • Lägg till sökvägen till SFML under linker "general" - "Additional Library Directories". Sök upp C:\sfml16\SFML-1.6\lib\vc2010\ eller var du nu har sparat dina omkompilerade dll-filer. Klicka sedan på "verkställ" knappen.
  • Välj fliken för linker "input". Ändra alternativrutan till "Release". På "Additional dependencies" lägger du till:
 sfml-system-s.lib
 sfml-window-s.lib
 sfml-graphics-s.lib 
 sfml-audio-s.lib

Tryck OK sedan verkställ.

  • Fortfarande i release mode väljer du
 [C/C++]
 [Preprocessor]

På den vänstra panelen på höger sida står det: Preprocessor definitions. Klicka på textraden tillhöger, sedan på den lilla pilen som uppenbarar sig. Du ser en rad med flera direktiv. Längst ner skriver du:

SFML_STATIC 

om det inte redan står i rutan. Tryck OK sedan verkställ.

  • Välj fliken för linker "input". Ändra alternativrutan till "Debug". På "Additional dependencies" lägger du till:
 sfml-system-s-d.lib
 sfml-window-s-d.lib
 sfml-graphics-s-d.lib 
 sfml-audio-s-d.lib

Tryck på OK, sedan verkställ och sist OK igen för att stänga alla flikar.

  • Se till så att filerna för ljud, openal32.dll och libsndfile-1.dll ligger i en mapp som hittas av VC++ eller av Windows innan du försöker att föra in ljud i programmet.
  • Om du har ett nätverksspel måste även de sökvägarna, sfml-network-s.lib och sflml-network-s-d.lib, skrivas in i rätt textrutor.

Komplett skelett för ett SFML spel

[redigera]
  • Fyll i följande överst i main.cpp
#include <iostream>
#include <SFML/System.hpp>
#include <SFML/Window.hpp>
#include <SFML/Graphics.hpp>
// #include <SFML/Audio.hpp> bara om du vill ha ljud
// #include <SFML/Network.hpp> bara om du gör nätverksspel

#define SFML_STATIC //Se till så att det inte behövs extra DLL-filer

// using namespace std;    // utifall att konsollen behövs för felsöknning

/* Fyll i klassdeklarationer */
/* Fyll i globala variabler */
/* Fyll i funktionsdeklarationer */

int main (int argc, char **argv)
{ //Main startar

/* Fyll i variabler inom main */

/* skapa spelfönstret */
sf::RenderWindow App(sf::VideoMode(800, 600, 32), "NAMN PÅ FÖNSTRET"); 

while (App.IsOpened())
   { //while 1 startar, spelloopen körs

	sf::Event Event; //kolla om mus/tangentbord används
	while (App.GetEvent(Event))
	  { //while 2, kontrollerar events
	  if (Event.Type == sf::Event::Closed) //kryssat på [x] symbolen? 
	  App.Close(); // stäng programmet

	  if ((Event.Type == sf::Event::KeyPressed) && (Event.Key.Code == sf::Key::Escape)) //ESC tangent
	  App.Close(); // stäng programmet

	  } //slut while 2, kontrollerar events

       /*Lägg in all kod som sker inuti själva spelet, ca 60 x i sekunden, här */

	/* visa slutligen upp spelet för spelaren */
	App.Clear(sf::Color(0, 255, 0)); //rensa allt i fönstret och ersätt med grönt
	/*rita upp spelar sprites här */
	// App.Draw(Sprite); //Rita upp figuren på den yta spelaren ser
	App.Display(); //visa upp ändringarna för användaren

  } //while 1 slutar, slut på att spelloopen körs
return 0; //Sista raden för slutet
} //Main slutar

/* Fyll i funktionsbeskrivningar */

Nu har du ett färdigt projekt med alla sökvägar korrekt inskrivna.

Klockan

[redigera]

Kan du få klockan i koden här ovanför att räkna uppåt i både release och debug mode är det en bra test på att installationen är korrekt. Prova först i "debug mode" (tryck [CTRL]+[ALT]+[B]) och strunta i alla varningar du får allra första gången om okända PDB filer. Det är bara varningar och de kommer inte att uppstå igen. Ändra rutan i övre kanten till release och pröva sedan att bygga projektet i "release mode" (tryck [CTRL]+[ALT]+[B] igen). Om båda lägena fungerar kommer med allra största säkerhet ditt projekt att fungera.

Nätverk

[redigera]

Nätverksspel är marigt och besvärligt och inte att rekommendera för nybörjare. Är det så att du ändå vill ha med nätverksmodulerna får du fylla i:

sfml-system-s-d.lib
sfml-window-s-d.lib
sfml-graphics-s-d.lib 
sfml-audio-s-d.lib
sfml-network-s-d.lib

Och sedan för release:

sfml-system-s.lib
sfml-window-s.lib
sfml-graphics-s.lib 
sfml-audio-s.lib
sfml-network-s.lib

Då har du fått med samtliga moduler som SFML använder sig av och soim finns till din hjälp vid spelprogrammering.