Fix test/blocks "runaway timer" bug.
Bug #1: When entering the next level an _additional_ timeout was started, hence multiple timers would run in parallel and increase the game's speed more than (supposedly) intended. Bug #2: When the game was over, these additional timers were not stopped, hence level 1 was never again as slow as it should be. This is fixed in this commit. Additionally the timer values are defined as preprocessor macros (constants) for easier fine tuning. To compensate for the lower speed in higher levels the LEVEL_FACTOR was reduced from 0.95 to 0.90 so the higher levels are slightly faster than without this fix. Note: the result of this fix (generally less speed increase per level) may result in higher scores. git-svn-id: file:///fltk/svn/fltk/branches/branch-1.4@12353 ea41ed52-d2ee-0310-a9c1-e6b18d33e121
This commit is contained in:
parent
7aea5b50a0
commit
768ba675b0
@ -56,13 +56,25 @@
|
|||||||
# include <mmsystem.h>
|
# include <mmsystem.h>
|
||||||
#endif // WIN32
|
#endif // WIN32
|
||||||
|
|
||||||
#define DEBUG_TIMER 0 // 0 = do not ..., 1 = debug timer callback
|
|
||||||
|
|
||||||
#define BLOCK_COLS 20
|
#define BLOCK_COLS 20
|
||||||
#define BLOCK_ROWS 10
|
#define BLOCK_ROWS 10
|
||||||
#define BLOCK_SIZE 32
|
#define BLOCK_SIZE 32
|
||||||
#define BLOCK_BLAST 100
|
#define BLOCK_BLAST 100
|
||||||
|
|
||||||
|
// These factors are used to fine-tune the game when these events
|
||||||
|
// occur by multiplying the timer interval with the given factor:
|
||||||
|
//
|
||||||
|
// (a) enter the next game level
|
||||||
|
// (b) click on a "normal block", destroy this one and adjacent blocks
|
||||||
|
// (c) click on a "bomb", destroy all blocks of the same color
|
||||||
|
|
||||||
|
#define LEVEL_FACTOR 0.90 // was: 0.95
|
||||||
|
#define NORMAL_FACTOR 0.999
|
||||||
|
#define BOMB_FACTOR 0.995
|
||||||
|
|
||||||
|
// Set this to 1 to debug the timer callback (should be 0)
|
||||||
|
#define DEBUG_TIMER 0
|
||||||
|
|
||||||
#include "pixmaps/blast.xpm"
|
#include "pixmaps/blast.xpm"
|
||||||
Fl_Pixmap blast_pixmap(blast_xpm);
|
Fl_Pixmap blast_pixmap(blast_xpm);
|
||||||
|
|
||||||
@ -770,12 +782,12 @@ int BlockWindow::handle(int event) {
|
|||||||
if (b->bomb) {
|
if (b->bomb) {
|
||||||
sound_->play_explosion(0.19 + 0.005 * count);
|
sound_->play_explosion(0.19 + 0.005 * count);
|
||||||
|
|
||||||
interval_ *= 0.995;
|
interval_ *= BOMB_FACTOR;
|
||||||
score_ += count;
|
score_ += count;
|
||||||
} else {
|
} else {
|
||||||
sound_->play_explosion(0.09 + 0.005 * count);
|
sound_->play_explosion(0.09 + 0.005 * count);
|
||||||
|
|
||||||
interval_ *= 0.999;
|
interval_ *= NORMAL_FACTOR;
|
||||||
score_ += count * count;
|
score_ += count * count;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -851,13 +863,12 @@ void BlockWindow::play_cb(Fl_Widget *wi, BlockWindow *bw) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
void BlockWindow::up_level() {
|
void BlockWindow::up_level() {
|
||||||
interval_ *= 0.95;
|
interval_ *= LEVEL_FACTOR;
|
||||||
opened_columns_ = 0;
|
opened_columns_ = 0;
|
||||||
if (num_colors_ < 7) num_colors_ ++;
|
if (num_colors_ < 7) num_colors_ ++;
|
||||||
level_ ++;
|
level_ ++;
|
||||||
sprintf(title_, "Level: %d", level_);
|
sprintf(title_, "Level: %d", level_);
|
||||||
title_y_ = h();
|
title_y_ = h();
|
||||||
Fl::repeat_timeout(interval_, (Fl_Timeout_Handler)timeout_cb, (void *)this);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
// Animate the game...
|
// Animate the game...
|
||||||
|
Loading…
Reference in New Issue
Block a user