Tweak blocks game to use higher update rates and slightly larger window.

This commit is contained in:
Michael R Sweet 2022-01-01 10:01:18 -05:00
parent 14ae784f7f
commit ea34edc1ea
No known key found for this signature in database
GPG Key ID: 999559A027815955

View File

@ -1,7 +1,7 @@
//
// "Block Attack!" scrolling blocks game using the Fast Light Tool Kit (FLTK).
//
// Copyright 2006-2018 by Michael Sweet.
// Copyright © 2006-2021 by Michael Sweet.
//
// This library is free software. Distribution and use rights are outlined in
// the file "COPYING" which should have been included with this file. If this
@ -48,8 +48,8 @@
# include <mmsystem.h>
#endif // _WIN32
#define BLOCK_COLS 20
#define BLOCK_ROWS 10
#define BLOCK_COLS 25
#define BLOCK_ROWS 15
#define BLOCK_SIZE 32
#define BLOCK_BLAST 100
@ -440,17 +440,22 @@ class BlockWindow : public Fl_Double_Window {
struct Block {
int color;
bool bomb;
int y;
float y;
};
struct Column {
int num_blocks;
Block blocks[BLOCK_ROWS];
int x;
float x;
};
private:
int frames_,
frames_per_second_;
time_t frame_time_;
bool show_fps_;
Fl_Button *help_button_,
*play_button_;
@ -546,7 +551,7 @@ void BlockWindow::_BlockWindow() {
prefs_.get("high_score", high_score_, 0);
Fl::add_timeout(0.1, (Fl_Timeout_Handler)timeout_cb, (void *)this);
Fl::add_timeout(0.01666666, (Fl_Timeout_Handler)timeout_cb, (void *)this);
}
@ -629,8 +634,8 @@ void BlockWindow::draw() {
// Draw the blocks...
for (j = num_columns_, c = columns_; j > 0; j --, c ++)
for (k = c->num_blocks, b = c->blocks; k > 0; k --, b ++) {
xx = w() - c->x;
yy = h() - BLOCK_SIZE - b->y;
xx = w() - (int)c->x;
yy = h() - BLOCK_SIZE - (int)b->y;
if (b->color >= BLOCK_BLAST) {
b->color ++;
@ -704,6 +709,14 @@ void BlockWindow::draw() {
}
}
time_t curtime = time(NULL);
frames_ ++;
if (curtime > frame_time_) {
frames_per_second_ = (frames_per_second_ + 3 * frames_ / (curtime - frame_time_)) / 4;
frames_ = 0;
frame_time_ = curtime;
}
// Draw the scores and level...
char s[255];
@ -720,6 +733,11 @@ void BlockWindow::draw() {
fl_draw(s, 0, 0, w(), 20, FL_ALIGN_CENTER);
}
if (show_fps_) {
sprintf(s, "FPS: %d ", frames_per_second_);
fl_draw(s, 0, h() - 20, w(), 20, FL_ALIGN_LEFT);
}
if (title_y_ > 0 && interval_ > 0.0) {
int sz = 14 + title_y_ * 86 / h();
@ -760,6 +778,10 @@ int BlockWindow::handle(int event) {
prefs_.set("high_score", high_score_);
return (1);
}
// 'f': toggle showing frames-per-second
if (Fl::event_text() && !strcmp(Fl::event_text(), "f")) {
show_fps_ = !show_fps_;
}
break;
case FL_PUSH:
@ -825,16 +847,20 @@ void BlockWindow::help_cb(Fl_Widget *, BlockWindow *bw) {
// Initialize the block window...
void BlockWindow::init() {
count_ = 0;
help_ = false;
interval_ = -1.0;
level_ = 1;
num_colors_ = 3;
num_columns_ = 0;
paused_ = false;
score_ = 0;
title_[0] = '\0';
title_y_ = 0;
frames_ = 0;
frames_per_second_ = 0;
frame_time_ = time(NULL);
show_fps_ = false;
count_ = 0;
help_ = false;
interval_ = -1.0;
level_ = 1;
num_colors_ = 3;
num_columns_ = 0;
paused_ = false;
score_ = 0;
title_[0] = '\0';
title_y_ = 0;
}
@ -845,7 +871,7 @@ void BlockWindow::new_game() {
init();
interval_ = 0.1f;
interval_ = 0.01666666666f;
opened_columns_ = 0;
strcpy(title_, "Level: 1");
@ -881,7 +907,7 @@ void BlockWindow::timeout_cb(BlockWindow *bw) {
int i, j;
Block *b;
Column *c;
int lastx, lasty;
float lastx, lasty;
#if DEBUG_TIMER
static double lasttime;
@ -941,7 +967,7 @@ void BlockWindow::timeout_cb(BlockWindow *bw) {
// Update blocks that have been destroyed...
for (i = 0, c = bw->columns_; i < bw->num_columns_; i ++, c ++)
for (j = 0, b = c->blocks; j < c->num_blocks; j ++, b ++)
if (b->color > (BLOCK_BLAST + 1)) {
if (b->color > (BLOCK_BLAST + 5)) {
bw->redraw();
c->num_blocks --;
@ -977,13 +1003,13 @@ void BlockWindow::timeout_cb(BlockWindow *bw) {
if (!bw->paused_ && bw->interval_ > 0.0) {
bw->redraw();
c->x ++;
c->x += 0.25;
}
for (j = c->num_blocks, b = c->blocks, lasty = 0; j > 0; j --, b ++) {
if (b->y > lasty) {
bw->redraw();
b->y -= 8;
b->y -= 4;
}
lasty = b->y + BLOCK_SIZE;
@ -993,7 +1019,7 @@ void BlockWindow::timeout_cb(BlockWindow *bw) {
// Slide the title text as needed...
if (bw->title_y_ > 0) {
bw->redraw();
bw->title_y_ -= 5;
bw->title_y_ -= 2;
}
// Play the game...
@ -1002,7 +1028,7 @@ void BlockWindow::timeout_cb(BlockWindow *bw) {
if (bw->count_ <= 0) {
bw->redraw();
bw->count_ = BLOCK_SIZE;
bw->count_ = 4 * BLOCK_SIZE;
if (bw->num_columns_ == BLOCK_COLS) {
bw->interval_ = -1.0;
@ -1044,14 +1070,14 @@ void BlockWindow::timeout_cb(BlockWindow *bw) {
// Update the play/pause button as needed...
if ((bw->paused_ || bw->interval_< 0.0) &&
bw->play_button_->w() < 80) {
int s = bw->play_button_->w() + 10;
int s = bw->play_button_->w() + 5;
bw->play_button_->resize(s, (s - 20) * (bw->h() - s) / 120, s, s);
bw->play_button_->labelsize(s / 2 + 4);
bw->redraw();
} else if ((!bw->paused_ && bw->interval_ > 0.0) &&
bw->play_button_->w() > 20) {
int s = bw->play_button_->w() - 5;
int s = bw->play_button_->w() - 2;
bw->play_button_->resize(s, (s - 20) * (bw->h() - s) / 120, s, s);
bw->play_button_->labelsize(s / 2 + 4);