PixieLite - mitt abstraktionslager

Allting som har med programmering att göra.

PixieLite - mitt abstraktionslager

Inläggav Mattias Gustavsson » 14 jun 2009, 16:20

Bild
Jag har spenderat en del tid på sistone med att städa upp, refaktorisera och dokumentera min spelmotor Pixie, och bestämde mig för att bryta ut den del som behandlar plattformsabstraktion, så att de som är intresserade kan titta efter hur jag löst saker eller använda det om man har behov. Jag tar givetvis gärna emot synpunkter, kritik och förslag till förbättringar också. Koden är som vanligt public domain, så använd som du vill om du vill 8-) Dokumentation i form av doxygen-kommentarer i header-filerna, så man kan ju generera ut dokumentation som man vill, men jag ska se om jag kan ladda upp en online-version och en windows hjälpfil framöver.

Kan laddas ned hära: PixeLite v 1.0

Systemen använder grundläggande windowsfunktioner för input/time och filhantering, men använder DirectX för ljud och bild. Om inte directx i rätt version finns tillgänglig, faller den tillbaka på standard GDI eller WMM funktionalitet, så det är ett väldigt stabilt system, som hittills verkar funka på allt, från såväl gamla till nya windows-versioner och även under VM's och Wine på linux.

Grundidén är att man initierar systemen i sin Main-funktion såhär:
  1.  
  2. // Win32 Platform Includes
  3. #include "Win32/Platform_Win32_OS.h"
  4. #include "Win32/Platform_Win32_Time.h"
  5. #include "Win32/Platform_Win32_Sound.h"
  6. #include "Win32/Platform_Win32_Input.h"
  7. #include "Win32/Platform_Win32_Screen.h"
  8. #include "Win32/Platform_Win32_FileSystem.h"
  9.  
  10. //*** WinMain ***
  11.  
  12. int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow)
  13.     {
  14.     // Platform abstraction systems - This is where we choose which platform components we want to use
  15.     Platform_Win32_OS* os=new Platform_Win32_OS(hInstance,lpCmdLine);
  16.     Platform::SetPlatform_OS(os);
  17.     Platform::SetPlatform_Time(new Platform_Win32_Time());
  18.     Platform::SetPlatform_Sound(new Platform_Win32_Sound(os));
  19.     Platform::SetPlatform_Input(new Platform_Win32_Input(os));
  20.     Platform::SetPlatform_Screen(new Platform_Win32_Screen(os));
  21.     Platform::SetPlatform_FileSystem(new Platform_Win32_FileSystem());
  22.  
  23.     // Start the game
  24.     RunGame();
  25.  
  26.     return 0;
  27.     }
  28.  

Och sen implementerar resten av sitt spel i RunGame-funktionen. Main-funktionen ser ju lite olika ut beroende på plattform, men för närvarande stöds bara Windows (men så fort jag får råd med en Mac, eller hjälp av en vänlig själ, så blir det stöd för OsX också, och ev. är det en linux-version på väg. eller det var det iallafall, men tror han som höll på med den tröttnade :| ).

Egentligen är det ju tänkt att man ska använda de här systemen som en grund att bygga mer användarvänliga system på, så som jag gjort i min Pixie motor, men det går ju att använda direkt också, och tänkte att det nog är lättare att porta om man har ett mer hanterbar mängd kod i projektet.

Jag har gjort en liten test-demo grej som är med i nedladdningen, och som producerar en massa studsande bollar på ful bakgrund:

Bild

och koden för det ser ut så här:

  1.  
  2. //*** Demo.cpp ***
  3.  
  4. // A simple demo to show how to use the PixieLite platform system.
  5. // In reality, all the platform stuff would be wrapped up in higher
  6. // level functionality, making it easier and more convenient to use.
  7. // The Pixie Game Engine provides excellent high level functionality
  8. // built on top of this platform abstraction system.
  9.  
  10. #include "Platform_OS.h"
  11. #include "Platform_Screen.h"
  12. #include "Platform_Time.h"
  13. #include "Platform_Input.h"
  14. #include "Platform_Input_KeyboardDevice.h"
  15.  
  16. // Simple random number generator
  17. int GetRandomNumber()
  18.     {
  19.     // Seed value
  20.     static long a = (int)(Platform::GetPlatform_Time()->GetTime()*1000);  
  21.     // Update number
  22.     a=(a*32719+3)%32749;        
  23.     return a;
  24.     }
  25.  
  26. void RunDemo()
  27.     {
  28.     // Create our backbuffer, which all drawing will be done to
  29.     unsigned short backbuffer[400*300];
  30.  
  31.     // Create a simple background with ugly gradient
  32.     unsigned short background[400*300];
  33.     for (int i=0; i<400*300; i++)
  34.         {
  35.         background[i]=(unsigned short)(2+i/4000+((i%400)/7)*32);
  36.         }
  37.  
  38.     // Define a simple and ugly "ball" sprite
  39.     unsigned short ball[] =
  40.         {
  41.         0,0,0,1,1,0,0,0,
  42.         0,1,1,1,1,1,1,0,
  43.         0,1,1,1,1,1,1,0,
  44.         1,1,1,1,1,1,1,1,
  45.         1,1,1,1,1,1,1,1,
  46.         0,1,1,1,1,1,1,0,
  47.         0,1,1,1,1,1,1,0,
  48.         0,0,0,1,1,0,0,0,
  49.         };
  50.  
  51.     // Define some variables to track ball position/directions
  52.     const int ballCount=20;
  53.     int posX[ballCount];
  54.     int posY[ballCount];
  55.     int dirX[ballCount];
  56.     int dirY[ballCount];
  57.    
  58.     // Set initial ball values
  59.     for (int i=0; i<ballCount; i++)
  60.         {
  61.         posX[i]=GetRandomNumber()%392;
  62.         posY[i]=GetRandomNumber()%292;
  63.         dirX[i]=GetRandomNumber()%2;
  64.         if (!dirX[i])
  65.             {
  66.             dirX[i]=-1;
  67.             }
  68.         dirY[i]=GetRandomNumber()%2;
  69.         if (!dirY[i])
  70.             {
  71.             dirY[i]=-1;
  72.             }
  73.         }
  74.  
  75.     // Flag to keep track of when to exit
  76.     bool running=true;
  77.  
  78.     // Main loop
  79.     while (running)
  80.         {
  81.         // Copy background to backbuffer
  82.         for (int i=0; i<400*300; i++)
  83.             {
  84.             backbuffer[i]=background[i];
  85.             }
  86.    
  87.         // Display a few bouncing balls
  88.         for (int i=0; i<ballCount; i++)
  89.             {
  90.             // Draw ball
  91.             for (int y=0; y<8; y++)
  92.                 {
  93.                 for (int x=0; x<8; x++)
  94.                     {
  95.                     if (ball[x+y*8])
  96.                         {
  97.                         backbuffer[(posX[i]+x)+(posY[i]+y)*400]=0xffff;
  98.                         }
  99.                     }
  100.                 }
  101.  
  102.             // Update X position, bouncing if necessary
  103.             posX[i]+=dirX[i];
  104.             if (posX[i]<0 )
  105.                 {
  106.                 posX[i]=0;
  107.                 dirX[i]=1;
  108.                 }
  109.             if (posX[i]>391 )
  110.                 {
  111.                 posX[i]=391;
  112.                 dirX[i]=-1;
  113.                 }
  114.  
  115.  
  116.             // Update Y position, bouncing if necessary
  117.             posY[i]+=dirY[i];
  118.             if (posY[i]<0 )
  119.                 {
  120.                 posY[i]=0;
  121.                 dirY[i]=1;
  122.                 }
  123.             if (posY[i]>291 )
  124.                 {
  125.                 posY[i]=291;
  126.                 dirY[i]=-1;
  127.                 }
  128.             }
  129.        
  130.  
  131.         // Show backbuffer on the screen
  132.         Platform::GetPlatform_Screen()->Present(backbuffer,400,300);
  133.  
  134.         // Check if ESCAPE was pressed
  135.         if (Platform::GetPlatform_Input()->GetKeyboardDevice()->IsKeyDown(Platform_Input_KeyboardDevice::KEY_ESCAPE))
  136.             {
  137.             running=false; // Stop running the demo
  138.             }
  139.  
  140.         // Check if the user closed the window
  141.         if (Platform::GetPlatform_OS()->ExitRequested())
  142.             {
  143.             running=false; // Stop running the demo
  144.             }
  145.  
  146.  
  147.         // Allow for OS-specific processing (windows message pump etc)
  148.         Platform::GetPlatform_OS()->OsYield();
  149.         }
  150.     }
  151.  
:P http://www.mattiasgustavsson.com - Min blogg
8-) http://www.tophatarcade.com - Utvecklarsajt och Sim/Strategi/RPG butik
:roll: http://www.retrogamedev.org - Forum för retrospel-utvecklare
:shock: http://www.pixieuniversity.com - Min gratis 2D spelmotor
Användarvisningsbild
Mattias Gustavsson
 
Inlägg: 135
Blev medlem: 11 maj 2009, 22:24
Ort: Royal Leamington Spa, UK

Re: PixieLite - mitt abstraktionslager

Inläggav Mattias Gustavsson » 16 jun 2009, 17:28

Nu har jag fått fixat med dokumentationen också... finns online här:

http://www.tophatarcade.com/pixielitedocs/

Och finns även i en windows hjälp-fil som följer med nedladdningen (PixieLite_1_0.zip ovan)
:P http://www.mattiasgustavsson.com - Min blogg
8-) http://www.tophatarcade.com - Utvecklarsajt och Sim/Strategi/RPG butik
:roll: http://www.retrogamedev.org - Forum för retrospel-utvecklare
:shock: http://www.pixieuniversity.com - Min gratis 2D spelmotor
Användarvisningsbild
Mattias Gustavsson
 
Inlägg: 135
Blev medlem: 11 maj 2009, 22:24
Ort: Royal Leamington Spa, UK

Re: PixieLite - mitt abstraktionslager

Inläggav Hildenborg » 16 jun 2009, 19:10

Själv så har jag litegranna gett upp att själv göra plattformsoberoendet nere på main nivå... När jag skriver något nuförtiden, som skall ha någon form av grafik inblandat, så baserar jag alltid mina rutiner kring någon lib som t.ex. sfml.
Så slipper man själv fundera över de bitarna...
Sun Tzu: "In peace prepare for war, in war prepare for peace."
Användarvisningsbild
Hildenborg
Site Admin
 
Inlägg: 191
Blev medlem: 22 apr 2009, 20:25
Ort: Göteborg

Re: PixieLite - mitt abstraktionslager

Inläggav Mattias Gustavsson » 16 jun 2009, 19:26

Hildenborg skrev:Så slipper man själv fundera över de bitarna...


Jo, men det är ju inte lika kul :P
:P http://www.mattiasgustavsson.com - Min blogg
8-) http://www.tophatarcade.com - Utvecklarsajt och Sim/Strategi/RPG butik
:roll: http://www.retrogamedev.org - Forum för retrospel-utvecklare
:shock: http://www.pixieuniversity.com - Min gratis 2D spelmotor
Användarvisningsbild
Mattias Gustavsson
 
Inlägg: 135
Blev medlem: 11 maj 2009, 22:24
Ort: Royal Leamington Spa, UK

Re: PixieLite - mitt abstraktionslager

Inläggav Hildenborg » 16 jun 2009, 20:13

Mattias Gustavsson skrev:
Hildenborg skrev:Så slipper man själv fundera över de bitarna...


Jo, men det är ju inte lika kul :P

Beror på hur många andra saker man funderar på :)

Som vanligt så har jag även börjat ta med mig jobbet hem...
Fan att man skall ha hobbyn som jobb! Och att man gillar sin hobby så mycket...
Sun Tzu: "In peace prepare for war, in war prepare for peace."
Användarvisningsbild
Hildenborg
Site Admin
 
Inlägg: 191
Blev medlem: 22 apr 2009, 20:25
Ort: Göteborg

Re: PixieLite - mitt abstraktionslager

Inläggav Mattias Gustavsson » 03 aug 2009, 16:52

Finns en ny version nu, att ladda ner här: http://www.tophatarcade.com/dev/pixie/PixieLite.php
ett par småbuggar fixade, och lagt till support för att skapa muspekare från bitmaps...
:P http://www.mattiasgustavsson.com - Min blogg
8-) http://www.tophatarcade.com - Utvecklarsajt och Sim/Strategi/RPG butik
:roll: http://www.retrogamedev.org - Forum för retrospel-utvecklare
:shock: http://www.pixieuniversity.com - Min gratis 2D spelmotor
Användarvisningsbild
Mattias Gustavsson
 
Inlägg: 135
Blev medlem: 11 maj 2009, 22:24
Ort: Royal Leamington Spa, UK


Återgå till Programmering

Vilka är online

Användare som besöker denna kategori: Inga registrerade användare och 0 gäster

cron