Refactoring: Project structure, sprite stairs & fog masks rendering fix

This commit is contained in:
2026-06-23 19:43:55 +02:00
parent 0ceae6f98b
commit 7d3003203c
89 changed files with 4576 additions and 1767 deletions
+75
View File
@@ -0,0 +1,75 @@
import cv2
import numpy as np
from pyboy import PyBoy
def main():
# Load PyBoy with the test gameover ROM
pyboy = PyBoy('test_gameover.gb', window='null', cgb=False)
# Tick for 120 frames to let the game boot and sprites render
for _ in range(120):
pyboy.tick()
# Grab screen buffer and convert it to OpenCV format
screen_image = pyboy.screen.image
# screen_image is a PIL Image. Convert to numpy array (RGB)
img_np = np.array(screen_image)
# Convert RGB to BGR for OpenCV
img_bgr = cv2.cvtColor(img_np, cv2.COLOR_RGB2BGR)
# Save the screenshot
cv2.imwrite('gameover_rendering.png', img_bgr)
print("Screenshot saved to gameover_rendering.png")
# Analyze alignment using OpenCV
gray = cv2.cvtColor(img_bgr, cv2.COLOR_BGR2GRAY)
h, w = gray.shape
print(f"Screen size: {w}x{h}")
# The background is white/light (value 255). The text has black/dark pixels.
# We use BINARY_INV to detect dark objects.
_, thresh = cv2.threshold(gray, 200, 255, cv2.THRESH_BINARY_INV)
# Find all contours in the thresholded image
contours, _ = cv2.findContours(thresh, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE)
# Find the bounding box of elements in the lower half of the screen (y > 100) where "GAME OVER" is rendered
gameover_boxes = []
player_boxes = []
for cnt in contours:
x, y, rw, rh = cv2.boundingRect(cnt)
if y > 80:
gameover_boxes.append((x, y, rw, rh))
else:
player_boxes.append((x, y, rw, rh))
# Combine bounding boxes of GAME OVER parts
if len(gameover_boxes) > 0:
min_x = min(box[0] for box in gameover_boxes)
max_x = max(box[0] + box[2] for box in gameover_boxes)
min_y = min(box[1] for box in gameover_boxes)
max_y = max(box[1] + box[3] for box in gameover_boxes)
text_width = max_x - min_x
text_height = max_y - min_y
center_x = min_x + text_width / 2.0
print("\n--- OpenCV Alignment Verification ---")
print(f"GAME OVER text bounding box: x={min_x}, y={min_y}, w={text_width}, h={text_height}")
print(f"GAME OVER text horizontal center: {center_x}")
print(f"Target screen center: {w / 2.0}")
# Verify alignment within 2 pixels tolerance
offset = abs(center_x - (w / 2.0))
print(f"Alignment offset: {offset} pixels")
if offset <= 2.0:
print("SUCCESS: The GAME OVER text is absolutely aligned (perfectly centered)!")
else:
print(f"WARNING: The GAME OVER text is off-center by {offset} pixels.")
else:
print("Error: Could not detect the GAME OVER text in the lower half of the screen.")
pyboy.stop()
if __name__ == '__main__':
main()