Fix for bug 544 and it's duplicates.
authorMiloš Klouček <m.kloucek.m@atlas.cz>
Wed, 13 Jan 2010 18:46:25 +0000 (18:46 +0000)
committerMiloš Klouček <m.kloucek.m@atlas.cz>
Wed, 13 Jan 2010 18:46:25 +0000 (18:46 +0000)
There are some minor chagnes to the patch to make it more readable, but the credit still belongs to octo

SVN-Revision: 6254

src/object/tilemap.cpp

index 1c5466e..d916e05 100644 (file)
@@ -209,6 +209,8 @@ TileMap::draw(DrawingContext& context)
 
   int tsx = int((context.get_translation().x - x_offset) / 32); // tilestartindex x
   int tsy = int((context.get_translation().y - y_offset) / 32); // tilestartindex y
+  tsx = std::max(tsx, 0);
+  tsy = std::max(tsy, 0);
   float start_x = tsx * 32 + x_offset;
   float start_y = tsy * 32 + y_offset;
   float end_x = start_x + SCREEN_WIDTH + 32;
@@ -216,14 +218,19 @@ TileMap::draw(DrawingContext& context)
 
   Vector pos;
   int tx, ty;
+
   for(pos.x = start_x, tx = tsx; (pos.x < end_x) && (tx < width); pos.x += 32, ++tx) {
     for(pos.y = start_y, ty = tsy; (pos.y < end_y) && (ty < height); pos.y += 32, ++ty) {
-      if (tiles[ty*width + tx] == 0) continue;
-      const Tile* tile = tileset->get(tiles[ty*width + tx]);
+      int index = ty*width + tx;
+      assert (index >= 0);
+      assert (index < (width * height));
+
+      if (tiles[index] == 0) continue;
+      const Tile* tile = tileset->get(tiles[index]);
       assert(tile != 0);
       tile->draw(context, pos, z_pos);
-    }
-  }
+    } /* for (pos y) */
+  } /* for (pos x) */
 
   if(draw_target != DrawingContext::NORMAL) {
     context.pop_target();