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

tverwaes at codespeak.net tverwaes at codespeak.net
Wed Mar 4 15:23:10 CET 2009


Author: tverwaes
Date: Wed Mar  4 15:23:08 2009
New Revision: 62524

Modified:
   pypy/trunk/pypy/lang/gameboy/video.py
   pypy/trunk/pypy/lang/gameboy/video_sprite.py
Log:
removed object writing to tile class, and fixed reversed bug


Modified: pypy/trunk/pypy/lang/gameboy/video.py
==============================================================================
--- pypy/trunk/pypy/lang/gameboy/video.py	(original)
+++ pypy/trunk/pypy/lang/gameboy/video.py	Wed Mar  4 15:23:08 2009
@@ -12,27 +12,6 @@
 from pypy.lang.gameboy.video_mode import Mode0, Mode1, Mode2, Mode3
 
 # -----------------------------------------------------------------------------
-class VideoCallWraper(object):
-    def call(self, pos, color, mask):
-        pass
-    
-
-class set_overlapped_object_line_call_wrapper(VideoCallWraper):
-    def __init__(self, video):
-        self.video = video
-    
-    def call(self, pos, color, mask):
-        self.video.set_overlapped_object_line(pos, color, mask)
-
-
-class set_tile_line_call_wrapper(VideoCallWraper):
-    def __init__(self, video):
-        self.video = video
-    
-    def call(self, pos, color, mask):
-        self.video.set_tile_line(pos, color, mask)
-
-# -----------------------------------------------------------------------------
 
 class Video(iMemory):
 
@@ -77,13 +56,16 @@
         
     def update_tile(self, address, data):
         self.get_tile(address).set_data_at(address, data);
-    
-    def get_tile(self, address):
-        tile_index = (address - TILE_DATA_ADDR) / (SPRITE_SIZE*2)
+
+    def get_tile_at(self, tile_index):
         if tile_index < TILE_DATA_SIZE:
             return self.tile_data_0[tile_index]
         else:
             return self.tile_data_1[tile_index - TILE_DATA_SIZE / 2]
+    
+    def get_tile(self, address):
+        tile_index = (address - TILE_DATA_ADDR) >> 4
+        return self.get_tile_at(tile_index)
 
     def select_tile_group_for(self, address):
         tile_map_index = address - TILE_MAP_ADDR #) >> 1
@@ -482,10 +464,7 @@
         lastx = SPRITE_SIZE + GAMEBOY_SCREEN_WIDTH + SPRITE_SIZE
         for index in range(count):
             sprite = self.shown_sprites[index]
-            if (sprite.x + SPRITE_SIZE <= lastx):
-                sprite.draw(self)
-            else:
-                sprite.draw_overlapped(self)
+            sprite.draw(lastx)
             lastx = sprite.x
             
     def scan_sprites(self):
@@ -523,54 +502,6 @@
             group_index += 1
             x += SPRITE_SIZE
      
-    def get_pattern(self, address):
-        # TODO: remove method!
-        return self.get_vram(VRAM_ADDR + address) + (self.get_vram(VRAM_ADDR + address + 1) << 8)
-
-    def draw_object_tile(self, sprite):
-        self.draw_object(set_tile_line_call_wrapper(self), sprite)
-                      
-    def set_tile_line(self, pos, color, mask):
-        self.line[pos] |= color | mask
-
-    def draw_overlapped_object_tile(self, sprite):
-        self.draw_object(set_overlapped_object_line_call_wrapper(self), sprite)
-        
-    def set_overlapped_object_line(self, pos, color, mask):
-        self.line[pos] = (self.line[pos] & 0x0101) | color | mask
-        
-    def draw_object(self, caller, sprite):
-        pattern = self.get_pattern(sprite.get_tile_address(self))
-        mask    = 0
-        # priority
-        if sprite.object_behind_background:
-            mask |= 0x0008
-        # palette
-        if sprite.palette_number:
-            mask |= 0x0004
-        if sprite.y_flipped:
-            self.draw_object_flipped(sprite.x, pattern, mask, caller)
-        else:
-            self.draw_object_normal(sprite.x, pattern, mask, caller)
-            
-    def draw_object_flipped(self, x, pattern, mask, caller):
-        color = (pattern << 1) & 0x0202
-        if color != 0:
-            caller.call(x, color, mask)
-        for i in range(0, 7):
-            color = (pattern >> i) & 0x0202
-            if color != 0:
-                caller.call(x + i + 1, color, mask)
-                
-    def draw_object_normal(self, x, pattern, mask, caller):
-        for i in range(0, 7):
-            color = (pattern >> (6-i)) & 0x0202
-            if color != 0:
-                caller.call(x + i, color, mask)
-        color = (pattern << 1) & 0x0202
-        if color != 0:
-            caller.call(x+7, color, mask)
-
     def draw_pixels_line(self):
         self.update_palette()
         pixels = self.driver.get_pixels()

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	Wed Mar  4 15:23:08 2009
@@ -89,21 +89,24 @@
         extracts the Attributes/Flags:
         Bit7   OBJ-to-BG Priority (0=OBJ Above BG, 1=OBJ Behind BG color 1-3)
                  (Used for both BG and Window. BG color 0 is always behind OBJ)
-        Bit6   Y flip          (0=Normal, 1=Vertically mirrored)
-        Bit5   X flip          (0=Normal, 1=Horizontally mirrored)
+        Bit6   X flip          (0=Normal, 1=Vertically mirrored)
+        Bit5   Y flip          (0=Normal, 1=Horizontally mirrored)
         Bit4   Palette number  **Non CGB Mode Only** (0=OBP0, 1=OBP1)
         """
-        self.object_behind_background   = bool(data  & (1 << 7))
-        self.x_flipped                  = bool(data  & (1 << 6))
-        self.y_flipped                  = bool(data  & (1 << 5))
-        self.palette_number             = bool(data &  (1 << 4))
-        self.rest_attributes_and_flags  = data & (1+2+4+8)
+        self.object_behind_background   = bool(data & (1 << 7))
+        self.y_flipped                  = bool(data & (1 << 6))
+        self.x_flipped                  = bool(data & (1 << 5))
+        self.palette_number             = bool(data & (1 << 4))
+        self.rest_attributes_and_flags  = data & ((1<<3) +
+                                                  (1<<2) +
+                                                  (1<<1) +
+                                                  (1<<0))
         
     def get_attributes_and_flags(self):
         value = 0
         value += int(self.object_behind_background) << 7
-        value += int(self.x_flipped)                << 6
-        value += int(self.y_flipped)                << 5
+        value += int(self.y_flipped)                << 6
+        value += int(self.x_flipped)                << 5
         value += int(self.palette_number)           << 4
         value += self.rest_attributes_and_flags
         return value
@@ -146,14 +149,11 @@
     def current_line_y(self, video):
         return video.line_y - self.y + 2 * SPRITE_SIZE
     
-    def get_tile(self, video):
-        if video.control.big_sprites:
-             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_tile(self):
+        address = self.get_tile_number()
+        if self.video.control.big_sprites:
+             address &= 0xFE
+        return self.video.get_tile_at(address)
         
     def get_draw_y(self, video):
         y = self.current_line_y(video)
@@ -161,12 +161,9 @@
             y = self.get_tile_size() - y
         return y
                 
-    def draw(self, video):
-        video.draw_object_tile(self)
-    
-    def draw_overlapped(self, video):
-        video.draw_overlapped_object_tile(self)
-        
+    def draw(self, lastx):
+        self.get_tile().draw_for_sprite(self, lastx)
+
 # -----------------------------------------------------------------------------
 
 class Tile(object):
@@ -201,7 +198,27 @@
     def get_pattern_at(self, address):
         return self.get_data_at(address) +\
                (self.get_data_at(address + 1) << 8)
-    
+
+    def draw_for_sprite(self, sprite, lastx):
+        if sprite.x_flipped:
+            convert, offset =  1, 0           # 0-7
+        else:
+            convert, offset = -1, SPRITE_SIZE # 7-0
+
+        y = sprite.get_draw_y(self.video) << 1
+        pattern =  self.get_pattern_at(y) << 1
+        mask = (sprite.palette_number           << 2) +\
+               (sprite.object_behind_background << 3)
+
+        for i in range(SPRITE_SIZE):
+            color = (pattern >> i) & 0x0202
+            x = sprite.x + offset + i*convert
+            if bool(color):
+                if sprite.x + SPRITE_SIZE > lastx:
+                    # Overlapped.
+                    self.video.line[x] &= 0x0101
+                self.video.line[x] |= color | mask
+
 # -----------------------------------------------------------------------------
 
 class Drawable(object):



More information about the Pypy-commit mailing list