From: Shawn Hargreaves Newsgroups: comp.os.msdos.djgpp Subject: Re: allegro - sprites and smudge on screen Date: Tue, 18 Mar 1997 20:34:46 +0000 Organization: None Distribution: world Message-ID: References: <199703181247 DOT NAA10767 AT gilberto DOT physik DOT rwth-aachen DOT de> NNTP-Posting-Host: talula.demon.co.uk MIME-Version: 1.0 Lines: 46 To: djgpp AT delorie DOT com DJ-Gateway: from newsgroup comp.os.msdos.djgpp Christoph Kukulies writes: >While I'm moving a round the sprite smudge gets spattered over >the screen (pieces of the sprite, pixels are set where they not >should be etc etc.). > >When I'm doing a show_mouse(NULL) before I'm doing the drawing the >smudge disappears but this is leading to intolerable flickering >of the sprite. Drawing to the screen while the mouse pointer is being displayed is a bad thing for two reasons: - In order to restore what was under the mouse when it next moves, Allegro stores a copy of what lies underneath it on the screen. If you draw something else over the top of the cursor, this buffer will become invalid. If you then move the mouse, the old, incorrect image will get restored where it used to be, so it will leave some 'mouse droppings' behind... - The mouse pointer is drawn inside a timer interrupt, which means that it may get drawn while the main program is in the middle of some other drawing operation. This wreaks havoc with the SVGA bank switching mechanism, as the mouse drawing code will change bank, and then return from the interrupt to the other drawing function which fails to realise that it now needs to switch back to whatever bank it was previously using. This can result in pixels being written to completely the wrong part of the screen, but is only a problem in banked SVGA modes. The best way to make this work is to integrate the pointer display with however the rest of your drawing code works: if you are using double- buffering or some such algorithm, draw the cursor onto the double buffer so that it gets updated in sync with all the rest of your graphics. If you need to draw everything straight to the screen, you can do a check before you draw whatever you are drawing to see if it overlaps with the current mouse position, and only bother to hide the mouse if they do overlap. To prevent the mouse from moving while you do this test and in the middle of your drawing code, set the "freeze_mouse_flag" (new in Allegro 2.2), to prevent any movement taking place during the critical bits of code... -- Shawn Hargreaves - shawn AT talula DOT demon DOT co DOT uk - http://www.talula.demon.co.uk/ Beauty is a French phonetic corruption of a short cloth neck ornament.