Added support for gradients :)
authorRicardo Cruz <rick2@aeiou.pt>
Sun, 11 Apr 2004 20:46:31 +0000 (20:46 +0000)
committerRicardo Cruz <rick2@aeiou.pt>
Sun, 11 Apr 2004 20:46:31 +0000 (20:46 +0000)
Changed bkgd_* to bkgd_top_* and bkgd_bottom_*
(being * either r, b or g)
This change includes both code and level files.

SVN-Revision: 492

data/levels/default/level4.stl
src/gameobjs.cpp
src/level.cpp
src/level.h
src/leveleditor.cpp
src/screen.cpp
src/screen.h
src/world.cpp

index 714a172..beb4396 100644 (file)
@@ -6,9 +6,12 @@
   (height 15)
   (background "")
   (music "Mortimers_chipdisko.mod")
-  (bkgd_red    100)
-  (bkgd_green  230)
-  (bkgd_blue   140)
+  (bkgd_top_red    120)
+  (bkgd_top_green  120)
+  (bkgd_top_blue   160)
+  (bkgd_bottom_red    215)
+  (bkgd_bottom_green  215)
+  (bkgd_bottom_blue   250)
   (time  190)
   (gravity  10.0)
   (particle_system "clouds")
index db4b386..8c6bf66 100644 (file)
@@ -139,7 +139,8 @@ BouncyBrick::draw()
         {
           fillrect(base.x - scroll_x, base.y,
                    32,32, 
-                   plevel->bkgd_red, plevel->bkgd_green, plevel->bkgd_blue, 0);
+                   plevel->bkgd_top_red, plevel->bkgd_top_green, plevel->bkgd_top_blue, 0);
+// FIXME: doesn't respect the gradient, futhermore is this necessary at all??
         }
       else
         {
index 6de01f8..1e8e644 100644 (file)
@@ -200,9 +200,12 @@ Level::init_defaults()
   width      = 21;
   time_left  = 100;
   gravity    = 10.;
-  bkgd_red   = 0;
-  bkgd_green = 0;
-  bkgd_blue  = 0;
+  bkgd_top_red   = 0;
+  bkgd_top_green = 0;
+  bkgd_top_blue  = 0;
+  bkgd_bottom_red   = 0;
+  bkgd_bottom_green = 0;
+  bkgd_bottom_blue  = 0;
   endpos     = 0;
 
   for(int i = 0; i < 15; ++i)
@@ -273,9 +276,12 @@ Level::load(const std::string& filename)
       reader.read_int("version",  &version);
       reader.read_int("width",  &width);
       reader.read_int("time",  &time_left);
-      reader.read_int("bkgd_red",  &bkgd_red);
-      reader.read_int("bkgd_green",  &bkgd_green);
-      reader.read_int("bkgd_blue",  &bkgd_blue);
+      reader.read_int("bkgd_top_red",  &bkgd_top_red);
+      reader.read_int("bkgd_top_green",  &bkgd_top_green);
+      reader.read_int("bkgd_top_blue",  &bkgd_top_blue);
+      reader.read_int("bkgd_bottom_red",  &bkgd_bottom_red);
+      reader.read_int("bkgd_bottom_green",  &bkgd_bottom_green);
+      reader.read_int("bkgd_bottom_blue",  &bkgd_bottom_blue);
       reader.read_float("gravity",  &gravity);
       reader.read_string("name",  &name);
       reader.read_string("theme",  &theme);
@@ -467,9 +473,12 @@ Level::save(const  char * subset, int level)
   fprintf(fi,"  (music \"%s\")\n", song_title.c_str());
   fprintf(fi,"  (background \"%s\")\n", bkgd_image.c_str());
   fprintf(fi,"  (particle_system \"%s\")\n", particle_system.c_str());
-  fprintf(fi,"  (bkgd_red %d)\n", bkgd_red);
-  fprintf(fi,"  (bkgd_green %d)\n", bkgd_green);
-  fprintf(fi,"  (bkgd_blue %d)\n", bkgd_blue);
+  fprintf(fi,"  (bkgd_top_red %d)\n", bkgd_top_red);
+  fprintf(fi,"  (bkgd_top_green %d)\n", bkgd_top_green);
+  fprintf(fi,"  (bkgd_top_blue %d)\n", bkgd_top_blue);
+  fprintf(fi,"  (bkgd_bottom_red %d)\n", bkgd_bottom_red);
+  fprintf(fi,"  (bkgd_bottom_green %d)\n", bkgd_bottom_green);
+  fprintf(fi,"  (bkgd_bottom_blue %d)\n", bkgd_bottom_blue);
   fprintf(fi,"  (time %d)\n", time_left);
   fprintf(fi,"  (width %d)\n", width);
   fprintf(fi,"  (gravity %2.1f)\n", gravity);
index 96fcb1f..bdd5b92 100644 (file)
@@ -64,9 +64,12 @@ class Level
   unsigned int* ia_tiles[15]; /* Tiles which can interact in the game (solids for example)*/
   unsigned int* fg_tiles[15]; /* Tiles in the foreground */
   int time_left;
-  int bkgd_red;
-  int bkgd_green;
-  int bkgd_blue;
+  int bkgd_top_red;
+  int bkgd_top_green;
+  int bkgd_top_blue;
+  int bkgd_bottom_red;
+  int bkgd_bottom_green;
+  int bkgd_bottom_blue;
   int width;
   int  endpos;
   float gravity;
index d7dbdb8..c16a27d 100644 (file)
@@ -205,7 +205,7 @@ int leveleditor(int levelnb)
             {
               switch (level_settings_menu->check())
                 {
-                case 13:
+                case 16:
                   apply_level_settings_menu();
                   Menu::set_current(leveleditor_menu);
                   break;
@@ -432,9 +432,12 @@ int le_init()
   level_settings_menu->additem(MN_NUMFIELD,"Length ",0,0);
   level_settings_menu->additem(MN_NUMFIELD,"Time   ",0,0);
   level_settings_menu->additem(MN_NUMFIELD,"Gravity",0,0);
-  level_settings_menu->additem(MN_NUMFIELD,"Red    ",0,0);
-  level_settings_menu->additem(MN_NUMFIELD,"Green  ",0,0);
-  level_settings_menu->additem(MN_NUMFIELD,"Blue   ",0,0);
+  level_settings_menu->additem(MN_NUMFIELD,"Top Red    ",0,0);
+  level_settings_menu->additem(MN_NUMFIELD,"Top Green  ",0,0);
+  level_settings_menu->additem(MN_NUMFIELD,"Top Blue   ",0,0);
+  level_settings_menu->additem(MN_NUMFIELD,"Bottom Red ",0,0);
+  level_settings_menu->additem(MN_NUMFIELD,"Bottom Green",0,0);
+  level_settings_menu->additem(MN_NUMFIELD,"Bottom Blue",0,0);
   level_settings_menu->additem(MN_HL,"",0,0);
   level_settings_menu->additem(MN_ACTION,"Apply Changes",0,0);
 
@@ -482,12 +485,18 @@ void update_level_settings_menu()
   level_settings_menu->item[7].change_input(str);
   sprintf(str,"%2.0f",le_current_level->gravity);
   level_settings_menu->item[8].change_input(str);
-  sprintf(str,"%d",le_current_level->bkgd_red);
+  sprintf(str,"%d",le_current_level->bkgd_top_red);
   level_settings_menu->item[9].change_input(str);
-  sprintf(str,"%d",le_current_level->bkgd_green);
-                         level_settings_menu->item[10].change_input(str);
-  sprintf(str,"%d",le_current_level->bkgd_blue);
-                         level_settings_menu->item[11].change_input(str);
+  sprintf(str,"%d",le_current_level->bkgd_top_green);
+  level_settings_menu->item[10].change_input(str);
+  sprintf(str,"%d",le_current_level->bkgd_top_blue);
+  level_settings_menu->item[11].change_input(str);
+  sprintf(str,"%d",le_current_level->bkgd_bottom_red);
+  level_settings_menu->item[12].change_input(str);
+  sprintf(str,"%d",le_current_level->bkgd_bottom_green);
+  level_settings_menu->item[13].change_input(str);
+  sprintf(str,"%d",le_current_level->bkgd_bottom_blue);
+  level_settings_menu->item[14].change_input(str);
 }
 
 void update_subset_settings_menu()
@@ -526,9 +535,12 @@ void apply_level_settings_menu()
   le_current_level->change_size(atoi(level_settings_menu->item[6].input));
   le_current_level->time_left = atoi(level_settings_menu->item[7].input);
   le_current_level->gravity = atof(level_settings_menu->item[8].input);
-  le_current_level->bkgd_red = atoi(level_settings_menu->item[9].input);
-  le_current_level->bkgd_green = atoi(level_settings_menu->item[10].input);
-  le_current_level->bkgd_blue = atoi(level_settings_menu->item[11].input);
+  le_current_level->bkgd_top_red = atoi(level_settings_menu->item[9].input);
+  le_current_level->bkgd_top_green = atoi(level_settings_menu->item[10].input);
+  le_current_level->bkgd_top_blue = atoi(level_settings_menu->item[11].input);
+  le_current_level->bkgd_bottom_red = atoi(level_settings_menu->item[12].input);
+  le_current_level->bkgd_bottom_green = atoi(level_settings_menu->item[13].input);
+  le_current_level->bkgd_bottom_blue = atoi(level_settings_menu->item[14].input);
 }
 
 void save_subset_settings_menu()
@@ -686,7 +698,8 @@ void le_drawlevel()
     }
   else
     {
-      clearscreen(le_current_level->bkgd_red, le_current_level->bkgd_green, le_current_level->bkgd_blue);
+          drawgradient(le_current_level->bkgd_top_red, le_current_level->bkgd_top_green, le_current_level->bkgd_top_blue, 
+                   le_current_level->bkgd_bottom_red, le_current_level->bkgd_bottom_green, le_current_level->bkgd_bottom_blue);
     }
 
   /*       clearscreen(current_level.bkgd_red, current_level.bkgd_green, current_level.bkgd_blue); */
index 2ac21d0..d757eac 100644 (file)
@@ -54,6 +54,45 @@ void clearscreen(int r, int g, int b)
 #endif
 }
 
+/* --- DRAWS A VERTICAL GRADIENT --- */
+
+void drawgradient(int top_r, int top_g, int top_b, int bot_r, int bot_g, int bot_b)
+{
+#ifndef NOOPENGL
+  if(use_gl)
+    {
+      glBegin(GL_QUADS);
+      glColor3ub(top_r, top_g, top_b);
+      glVertex2f(0, 0);
+      glVertex2f(640, 0);
+      glColor3ub(bot_r, bot_g, bot_b);
+      glVertex2f(640, 480);
+      glVertex2f(0, 480);
+      glEnd();
+    }
+  else
+  {
+#endif
+
+  SDL_Rect r;
+  r.x = 0;
+  r.w = 640;
+  r.h = 2;
+
+    for(float y = 0; y < 480; y += 2)
+      {
+      r.y = (int)y;
+
+      SDL_FillRect(screen, &r, SDL_MapRGB(screen->format, (int)(((float)(top_r-bot_r)/640) * y + top_r), (int)(((float)(top_g-bot_g)/640) * y + top_g), (int)(((float)(top_b-bot_b)/640) * y + top_b)));
+      }
+/* calculates the color for each line, based in the generic equation for functions: y = mx + b */
+
+#ifndef NOOPENGL
+
+    }
+#endif
+}
+
 /* 'Stolen' from the SDL documentation.
  * Set the pixel at (x, y) to the given value
  * NOTE: The surface must be locked before calling this!
index 7ff7a22..f779dc5 100644 (file)
@@ -26,6 +26,7 @@
 
 void drawline(int x1, int y1, int x2, int y2, int r, int g, int b, int a);
 void clearscreen(int r, int g, int b);
+void drawgradient(int top_r, int top_g, int top_b, int bot_r, int bot_g, int bot_b);
 void fillrect(float x, float y, float w, float h, int r, int g, int b, int a);
 void updatescreen(void);
 void flipscreen(void);
index cd187e5..f2a64b5 100644 (file)
@@ -134,7 +134,8 @@ World::draw()
     }
   else
     {
-      clearscreen(level->bkgd_red, level->bkgd_green, level->bkgd_blue);
+      drawgradient(level->bkgd_top_red, level->bkgd_top_green, level->bkgd_top_blue,
+                     level->bkgd_bottom_red, level->bkgd_bottom_green, level->bkgd_bottom_blue);
     }
     
   /* Draw particle systems (background) */