[Author Prev][Author Next][Thread Prev][Thread Next][Author Index][Thread Index]
[pygame] Mode 7 Demo
I put together a quick-and-dirty demo of a "Mode 7" pseudo-3D effect. I
have no specific plans for it, but it looks neat. The framerate is bad.
Thoughts?
Screenshot at <http://kschnee.xepher.net/pics/080126_mode7.jpg>.
Example of the effect in "Secret of Mana":
<http://mmxz.zophar.net/rpg/mana2/images/flammie.gif>
Kris
"""
Quick demo of a "Mode 7" pseudo-3D effect,
as seen in some 16-bit-era video games.
"""
import pygame
screen = pygame.display.set_mode((800,600))
ground = pygame.image.load("landscape.bmp") ## 1000x1000 works
sky = pygame.image.load("sky.png") ## At least 800x300
## Fog @ horizon.
fog = pygame.surface.Surface((800,20)).convert_alpha()
for y in range(20):
a = 200 - (10*y)
pygame.draw.rect(fog,(255,255,255,a),(0,y,800,5))
class Mode7:
def __init__(self,**options):
self.sky = options.get("sky")
self.ground = options.get("ground")
self.fog = options.get("fog")
## "Location" of the top-left part we'll draw.
self.ground_x, self.ground_y = options.get("coords",(0,0))
self.movement = options.get("movement",(3,3))
def Draw(self):
stretch_factor = 200.0 ## Try eg. 75.0 also
for y in range(300,600):
## Take a line from the original & stretch it.
img_y = (y+self.ground_y-300) * 2
line = pygame.surface.Surface((800,1))
line.blit(self.ground,(0,0),(self.ground_x,img_y,800,1))
w = 800 * (1.0 + ((y-300)/stretch_factor) )
x = -(w-800)/2 ## Draw wide line left of screen's edge
line = pygame.transform.scale(line,(w,1))
screen.blit(line,(x,y))
screen.blit(self.sky,(0,0),(200,0,800,300))
screen.blit(self.fog,(0,300))
def Go(self):
for n in range(40):
## screen.fill((0,0,0)) ## Not needed; screen is filled
self.Draw()
pygame.display.update()
self.ground_x += self.movement[0]
self.ground_y += self.movement[1]
m7 = Mode7(sky=sky,ground=ground,fog=fog)
m7.Go()