[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