Linux game programming An introduction to the use of interval timers and asynchronous input notifications Our prior animation demo We achieved the illusion of smooth and flicker free animation by synchronizing drawing operations with Vertical Retrace But more is needed in a game that s fun Some deficiencies in our animate1 demo Ball movements tied to Vertical Retrace The viewer lacked any real time control How can we overcome these limitations Decoupling move from draw Our program loop had used logic like this do vsync delay until start of the next retrace hide ball erase the ball move ball adjust its location show ball redraw the ball count decrement a counter while count 0 Linux provides interval timers include sys time h struct itimerval itval itold itval it value tv sec 2 itval it value tv usec 0 itval it interval tv sec 0 itval it interval tv usec 10000 setitimer ITIMER REAL itval itold See the man page for additional details SIGALRM When timer expires our application gets notified by being sent a signal from Linux Normally an application gets terminated if the SIGALRM signal is delivered to it But we can alter that default behavior by installing a signal handler that we design We can move the ball when SIGALRM is received regardless of Vertical Retrace Our signal handler void on alarm int signum modify these global variables ball xcoordinate xincrement ball ycoordinate yincrement The signal function installs our handler signal SIGALRM on alarm Main program loop revised We can now omit ball movement in main loop do vsync delay until start of the next retrace hide ball erase the old ball oldx newx oldy newy remember new position show ball redraw the new ball count decrement a counter while count 0 Ball movement is managed by signal handler Giving the user control Linux supports asynchronous terminal i o We can reprogram the terminal console so a SIGIO signal will be sent to our program whenever the user decides to press a key And we can install a signal handler of our own design that executes if SIGIO arrives This will allow a user to control our game Noncanonical terminal i o We already learned how to reprogram the terminal to allow raw keyboard input include termios h struct termios tty tcgetattr 0 tty get tty settings tty c lflag ICANON ECHO ISIG tty c cc VMIN 1 tty c cc VTIME 0 tcsetattr 0 TCSAFLUSH tty install Handling a key press Here s a simple signal handler that lets a user decide to terminate our program by hitting the ESCAPE key instead of the program itself deciding to quit when a counter reaches zero void on input int signum int inch 0 read 0 inch 4 if inch ESCAPE KEY done 1 Enabling asynchronous I O Now we need to install our signal handler specify which program will receive SIGIO then enable the delivery of these signals signal SIGIO on input fcntl 0 F SETOWN getpid int flagval fcntl 0 F GETFL NULL flagval O ASYNC turn on flag bit fcntl 0 F SETFL flagval Program loop revised again done 0 do oldx xloc oldy yloc remember draw ball use current location vsync await next retrace hide ball erase previous ball while done xloc yloc and done get changed by handlers Enhancment more user control In pong game the user moves a paddle The paddle can only be moved left or right Lower wall of the playing court is removed Ball will escape unless it hits the paddle Keyboard has left and right arrow keys Our input signal handler could move the paddle whenever a user hits an arrow key In class exercise 1 Before you remove the game court s lower wall see if you can implement the paddlemovements left or right in response to a user s hitting the left arrow or right arrow You will need to investigate the numerical code sequence that Linux generates when a user hits one of these arrow keys Our rawtty cpp application may be useful In class exercise 2 For brevity our animate2 demo program removed the capability of users controlling the speed of the ball movements with an argument supplied on the command line Can you devise a way for users to exert real time control over the ball s speed by pressing keys while the program is running for example the key and the key
View Full Document