[pypy-svn] r62402 - pypy/trunk/pypy/lang/gameboy

cami at codespeak.net cami at codespeak.net
Mon Mar 2 16:31:07 CET 2009


Author: cami
Date: Mon Mar  2 16:31:07 2009
New Revision: 62402

Modified:
   pypy/trunk/pypy/lang/gameboy/video.py
   pypy/trunk/pypy/lang/gameboy/video_sprite.py
Log:
compacting draw_pixels_line and conquerred the array bounds ;)


Modified: pypy/trunk/pypy/lang/gameboy/video.py
==============================================================================
--- pypy/trunk/pypy/lang/gameboy/video.py	(original)
+++ pypy/trunk/pypy/lang/gameboy/video.py	Mon Mar  2 16:31:07 2009
@@ -503,38 +503,24 @@
         count = self.scan_sprites()
         lastx = SPRITE_SIZE + GAMEBOY_SCREEN_WIDTH + SPRITE_SIZE
         for index in range(count):
-            data    = self.objects[index]
-            x       = (data >> 24) & 0xFF
-            flags   = (data >> 12) & 0xFF
-            address = data & 0xFFF
-            if (x + SPRITE_SIZE <= lastx):
-                self.draw_object_tile(x, address, flags)
+            sprite = self.objects[index]
+            if (sprite.x + SPRITE_SIZE <= lastx):
+                self.draw_object_tile(sprite.x, \
+                                      sprite.get_tile_address(self), \
+                                      sprite.get_attributes_and_flags())
             else:
-                self.draw_overlapped_object_tile(x, address, flags)
-            lastx = x
+                self.draw_overlapped_object_tile(sprite.x, \
+                                                 sprite.get_tile_address(self), \
+                                                 sprite.get_attributes_and_flags())
+            lastx = sprite.x
             
     def scan_sprites(self):
         count = 0
         # search active objects
         for sprite in self.sprites:
-            x = sprite.x
-            y = sprite.y
             if sprite.hidden: continue
             if not sprite.intersects_current_line(self): continue
-            tile = sprite.tile_number
-            y    = sprite.current_line_y(self)
-            if self.control.big_sprite_size_selected:
-                # 8x16 tile size
-                tile_size = 15
-                tile &= 0xFE
-            else:
-                # 8x8 tile size
-                tile_size = 7
-            if sprite.y_flipped:
-                y = tile_size - y
-            # TODO: build an object abstraction?
-            self.objects[count] = (x << 24) + (count << 20) + (sprite.get_attributes_and_flags() << 12) + \
-                                  (tile << 4) + (y << 1)
+            self.objects[count] = sprite #.get_stupid_intermediate_data(count, self)
             count += 1
             if count >= constants.OBJECTS_PER_LINE:
                 break
@@ -547,8 +533,8 @@
         for index in range(count):
             highest = index
             for right in range(index+1, count):
-                if (self.objects[right] >> 20) > \
-                   (self.objects[highest] >> 20):
+                if (self.objects[right].get_tile_address(self)) > \
+                   (self.objects[highest].get_tile_address(self)):
                     highest = right
             self.objects[index], self.objects[highest] = \
                     self.objects[highest], self.objects[index]

Modified: pypy/trunk/pypy/lang/gameboy/video_sprite.py
==============================================================================
--- pypy/trunk/pypy/lang/gameboy/video_sprite.py	(original)
+++ pypy/trunk/pypy/lang/gameboy/video_sprite.py	Mon Mar  2 16:31:07 2009
@@ -118,7 +118,8 @@
         return self.hidden
         
     def get_tile_number(self):
-        return self.tile.id
+        #return self.tile.id
+        return self.tile_number
     
     def get_width(self):
         return SPRITE_SIZE
@@ -144,7 +145,26 @@
     
     def current_line_y(self, video):
         return video.line_y - self.y + 2 * SPRITE_SIZE
+    
+    def get_tile(self, video):
+        if video.control.big_sprite_size_selected:
+             return self.get_tile_number() & 0xFE
+        else:
+            return self.get_tile_number()
+            
+    def get_tile_address(self, video):
+        return (self.get_tile(video) << 4) +  (self.get_draw_y(video) << 1)
         
+    def get_draw_y(self, video):
+        y = self.current_line_y(video)
+        if self.y_flipped:
+            y = self.get_tile_size(video) - y
+        return y
+
+    def get_stupid_intermediate_data(self, count, video):
+        return (self.x << 24) + (count << 20) + \
+               (self.get_attributes_and_flags() << 12) + \
+                (self.get_tile_address(video))
     def draw(self):
         pass
     



More information about the Pypy-commit mailing list