Port conway to dispd.

This commit is contained in:
Jonas 'Sortie' Termansen 2012-12-16 00:18:28 +01:00
parent 872954b364
commit 6daa7ee8fe
1 changed files with 19 additions and 34 deletions

View File

@ -31,13 +31,14 @@
#include <error.h>
#include <string.h>
#include <dispd.h>
const int width = 80;
const int height = 25;
const int rowstride = width + 2;
const int buffersize = (height+2) * (width+2);
int vgafd;
uint16_t frame[width*height];
bool running;
@ -55,39 +56,8 @@ void Clear()
for ( int i = 0; i < buffersize; i++ ) { framea[i] = 0; frameb[i] = 0; }
}
bool FlushVGA()
{
if ( lseek(vgafd, 0, SEEK_SET) < 0)
return false;
return writeall(vgafd, frame, sizeof(frame)) == sizeof(frame);
}
int Init()
{
bool has_vga_mode_set = true;
FILE* modefp = fopen("/dev/video/mode", "r");
if ( modefp )
{
char* mode = NULL;
size_t modesize;
if ( 0 <= getline(&mode, &modesize, modefp) )
{
if ( strcmp(mode, "driver=none\n") != 0 )
has_vga_mode_set = false;
free(mode);
}
fclose(modefp);
}
if ( !has_vga_mode_set )
{
fprintf(stderr, "Sorry, this game only works in VGA mode.\n");
return 1;
}
vgafd = open("/dev/vga", O_RDWR);
if ( vgafd < 0 ) { error(0, errno, "unable to open vga device /dev/vga"); return 1; }
Clear();
// Initialize variables.
@ -149,8 +119,6 @@ void Render()
}
}
}
FlushVGA();
}
void Update()
@ -200,6 +168,9 @@ int usage(int /*argc*/, char* argv[])
int main(int argc, char* argv[])
{
if ( !dispd_initialize(&argc, &argv) )
error(1, 0, "couldn't initialize dispd library");
int sleepms = 50;
for ( int i = 1; i < argc; i++ )
{
@ -214,11 +185,25 @@ int main(int argc, char* argv[])
int result = Init();
if ( result != 0 ) { return result; }
struct dispd_session* session = dispd_attach_default_session();
if ( !session )
error(1, 0, "couldn't attach to dispd default session");
if ( !dispd_session_setup_game_vga(session) )
error(1, 0, "couldn't setup dispd vga session");
struct dispd_window* window = dispd_create_window_game_vga(session);
if ( !window )
error(1, 0, "couldn't create dispd vga window");
// Update the game every 50th milisecond.
while ( true )
{
usleep(sleepms * 1000);
Update();
struct dispd_framebuffer* fb = dispd_begin_render(window);
if ( !fb )
error(1, 0, "unable to begin rendering dispd window");
memcpy(dispd_get_framebuffer_data(fb), frame, sizeof(frame));
dispd_finish_render(fb);
}
return 0;