feat(render): sprite and tile art rendering
This commit is contained in:
1 parent
2016a02e89
commit
38c53fb531
1 file changed
+264
@@ -0,0 +1,264 @@
|
||||
import pygame
|
||||
|
||||
from ..constants import tileSize
|
||||
from .theme import tileFallback
|
||||
|
||||
playerPalette = {
|
||||
"r": (216, 40, 0),
|
||||
"s": (252, 188, 140),
|
||||
"h": (100, 52, 16),
|
||||
"o": (32, 56, 236),
|
||||
"k": (0, 0, 0),
|
||||
"y": (247, 213, 29),
|
||||
}
|
||||
|
||||
playerPattern = [
|
||||
"................",
|
||||
"....rrrrrr......",
|
||||
"...rrrrrrrrr....",
|
||||
"...hhhssskss....",
|
||||
"..hshsssksss....",
|
||||
"..hhhssssksss...",
|
||||
"..hhsssssssss...",
|
||||
"....sssssss.....",
|
||||
"...rrrrrrrr.....",
|
||||
"..rrrrrrrrrr....",
|
||||
".ssrroooorrss...",
|
||||
".ssrooooooorss..",
|
||||
"...ooyooyoo.....",
|
||||
"...oooooooo.....",
|
||||
"...ooo..ooo.....",
|
||||
"..hhh....hhh....",
|
||||
]
|
||||
|
||||
goombaPalette = {
|
||||
"d": (60, 30, 10),
|
||||
"m": (150, 75, 30),
|
||||
"w": (255, 255, 255),
|
||||
"k": (0, 0, 0),
|
||||
"f": (20, 12, 8),
|
||||
}
|
||||
|
||||
goombaPattern = [
|
||||
"................",
|
||||
".....dddddd.....",
|
||||
"...ddmmmmmmdd...",
|
||||
"..dmmmmmmmmmmd..",
|
||||
".dmmmmmmmmmmmmd.",
|
||||
".dmmwwmmmmwwmmd.",
|
||||
".dmmwkmmmmwkmmd.",
|
||||
".dmmwwmmmmwwmmd.",
|
||||
".dmmmmmmmmmmmmd.",
|
||||
".dmmmmmmmmmmmmd.",
|
||||
"..dmmmmmmmmmmd..",
|
||||
"...dmmmmmmmmd...",
|
||||
"....dddddddd....",
|
||||
"...ff....ff.....",
|
||||
"..ffff..ffff....",
|
||||
"................",
|
||||
]
|
||||
|
||||
chaserPalette = {
|
||||
"d": (40, 8, 60),
|
||||
"m": (150, 40, 170),
|
||||
"w": (255, 240, 120),
|
||||
"k": (0, 0, 0),
|
||||
}
|
||||
|
||||
chaserPattern = [
|
||||
"................",
|
||||
"....k......k....",
|
||||
"...kmk....kmk...",
|
||||
"...dmmkkkkmmd...",
|
||||
"..dmmmmmmmmmmd..",
|
||||
".dmmwwmmmmwwmmd.",
|
||||
".dmmwkmmmmwkmmd.",
|
||||
".dmmmmmmmmmmmmd.",
|
||||
".dmmmkkkkkkmmmd.",
|
||||
".dmmmkwwwwkmmmd.",
|
||||
"..dmmmmmmmmmmd..",
|
||||
"...dmmmmmmmmd...",
|
||||
"....dmmmmmmd....",
|
||||
"...dd.dd.dd.d...",
|
||||
"..dd..dd..dd....",
|
||||
"................",
|
||||
]
|
||||
|
||||
|
||||
def patternSurface(pattern, palette):
|
||||
surf = pygame.Surface((tileSize, tileSize), pygame.SRCALPHA)
|
||||
for y, line in enumerate(pattern):
|
||||
for x, code in enumerate(line):
|
||||
if code == ".":
|
||||
continue
|
||||
surf.set_at((x, y), palette[code])
|
||||
return surf
|
||||
|
||||
|
||||
def flyerSurface():
|
||||
surf = pygame.Surface((tileSize, tileSize), pygame.SRCALPHA)
|
||||
pygame.draw.ellipse(surf, (60, 160, 210), (4, 4, 8, 8))
|
||||
pygame.draw.ellipse(surf, (140, 220, 255), (5, 5, 6, 5))
|
||||
pygame.draw.polygon(surf, (200, 240, 255), [(0, 4), (4, 6), (4, 10)])
|
||||
pygame.draw.polygon(surf, (200, 240, 255), [(15, 4), (11, 6), (11, 10)])
|
||||
surf.set_at((6, 7), (0, 0, 0))
|
||||
surf.set_at((9, 7), (0, 0, 0))
|
||||
return surf
|
||||
|
||||
|
||||
def shooterSurface():
|
||||
surf = pygame.Surface((tileSize, tileSize), pygame.SRCALPHA)
|
||||
pygame.draw.rect(surf, (70, 90, 90), (3, 4, 10, 10))
|
||||
pygame.draw.rect(surf, (110, 140, 140), (4, 5, 8, 4))
|
||||
pygame.draw.rect(surf, (200, 60, 40), (6, 9, 4, 3))
|
||||
pygame.draw.rect(surf, (40, 50, 50), (2, 13, 12, 2))
|
||||
return surf
|
||||
|
||||
|
||||
def coinSurface():
|
||||
surf = pygame.Surface((tileSize, tileSize), pygame.SRCALPHA)
|
||||
pygame.draw.ellipse(surf, (200, 160, 20), (3, 1, 10, 14))
|
||||
pygame.draw.ellipse(surf, (247, 213, 29), (4, 2, 8, 12))
|
||||
pygame.draw.rect(surf, (255, 245, 170), (6, 4, 1, 8))
|
||||
return surf
|
||||
|
||||
|
||||
def gemSurface():
|
||||
surf = pygame.Surface((tileSize, tileSize), pygame.SRCALPHA)
|
||||
pygame.draw.polygon(surf, (60, 220, 200), [(8, 1), (14, 6), (8, 15), (2, 6)])
|
||||
pygame.draw.polygon(surf, (160, 255, 240), [(8, 1), (11, 6), (8, 8), (5, 6)])
|
||||
return surf
|
||||
|
||||
|
||||
def keySurface():
|
||||
surf = pygame.Surface((tileSize, tileSize), pygame.SRCALPHA)
|
||||
pygame.draw.circle(surf, (240, 210, 60), (6, 6), 4)
|
||||
pygame.draw.circle(surf, (60, 40, 10), (6, 6), 2)
|
||||
pygame.draw.rect(surf, (240, 210, 60), (6, 8, 2, 6))
|
||||
pygame.draw.rect(surf, (240, 210, 60), (8, 12, 3, 2))
|
||||
return surf
|
||||
|
||||
|
||||
def heartSurface():
|
||||
surf = pygame.Surface((tileSize, tileSize), pygame.SRCALPHA)
|
||||
pygame.draw.circle(surf, (224, 48, 64), (5, 6), 3)
|
||||
pygame.draw.circle(surf, (224, 48, 64), (10, 6), 3)
|
||||
pygame.draw.polygon(surf, (224, 48, 64), [(2, 7), (14, 7), (8, 14)])
|
||||
pygame.draw.circle(surf, (255, 150, 160), (5, 5), 1)
|
||||
return surf
|
||||
|
||||
|
||||
def solidTile(color, topColor):
|
||||
surf = pygame.Surface((tileSize, tileSize))
|
||||
surf.fill(color)
|
||||
pygame.draw.rect(surf, topColor, (0, 0, tileSize, 3))
|
||||
pygame.draw.line(surf, (0, 0, 0), (tileSize - 1, 0), (tileSize - 1, tileSize - 1))
|
||||
return surf
|
||||
|
||||
|
||||
def brickSurface():
|
||||
surf = pygame.Surface((tileSize, tileSize))
|
||||
surf.fill((181, 94, 41))
|
||||
mortar = (74, 38, 18)
|
||||
pygame.draw.line(surf, mortar, (0, 0), (tileSize - 1, 0))
|
||||
pygame.draw.line(surf, mortar, (0, 8), (tileSize - 1, 8))
|
||||
pygame.draw.line(surf, mortar, (8, 1), (8, 7))
|
||||
pygame.draw.line(surf, mortar, (0, 9), (0, tileSize - 1))
|
||||
pygame.draw.line(surf, mortar, (15, 9), (15, tileSize - 1))
|
||||
return surf
|
||||
|
||||
|
||||
def platformSurface():
|
||||
surf = pygame.Surface((tileSize, tileSize), pygame.SRCALPHA)
|
||||
pygame.draw.rect(surf, (217, 164, 65), (0, 0, tileSize, 6))
|
||||
pygame.draw.rect(surf, (247, 213, 29), (1, 0, tileSize - 2, 2))
|
||||
pygame.draw.line(surf, (150, 100, 30), (0, 6), (tileSize - 1, 6))
|
||||
return surf
|
||||
|
||||
|
||||
def spikeSurface():
|
||||
surf = pygame.Surface((tileSize, tileSize), pygame.SRCALPHA)
|
||||
for base in (0, 5, 10):
|
||||
pygame.draw.polygon(surf, (210, 214, 224), [(base, 15), (base + 3, 4), (base + 6, 15)])
|
||||
pygame.draw.polygon(surf, (150, 156, 170), [(base + 3, 15), (base + 4, 8), (base + 5, 15)])
|
||||
return surf
|
||||
|
||||
|
||||
def lavaSurface():
|
||||
surf = pygame.Surface((tileSize, tileSize))
|
||||
surf.fill((200, 60, 20))
|
||||
pygame.draw.rect(surf, (255, 150, 40), (0, 0, tileSize, 4))
|
||||
for spot in ((3, 8), (9, 6), (12, 11)):
|
||||
surf.set_at(spot, (255, 220, 120))
|
||||
return surf
|
||||
|
||||
|
||||
def ladderSurface(top):
|
||||
surf = pygame.Surface((tileSize, tileSize), pygame.SRCALPHA)
|
||||
rail = (150, 100, 50)
|
||||
pygame.draw.rect(surf, rail, (3, 0, 2, tileSize))
|
||||
pygame.draw.rect(surf, rail, (11, 0, 2, tileSize))
|
||||
for y in (2, 7, 12):
|
||||
pygame.draw.rect(surf, (190, 140, 80), (3, y, 10, 2))
|
||||
if top:
|
||||
pygame.draw.rect(surf, (190, 140, 80), (1, 0, 14, 2))
|
||||
return surf
|
||||
|
||||
|
||||
def slopeSurface(ascendRight):
|
||||
surf = pygame.Surface((tileSize, tileSize), pygame.SRCALPHA)
|
||||
if ascendRight:
|
||||
points = [(0, tileSize), (tileSize, 0), (tileSize, tileSize)]
|
||||
else:
|
||||
points = [(0, 0), (tileSize, tileSize), (0, tileSize)]
|
||||
pygame.draw.polygon(surf, (150, 74, 18), points)
|
||||
pygame.draw.polygon(surf, (222, 140, 80), points, 1)
|
||||
return surf
|
||||
|
||||
|
||||
def pipeSurface(top, leftSide):
|
||||
surf = pygame.Surface((tileSize, tileSize))
|
||||
surf.fill((0, 168, 0))
|
||||
if leftSide:
|
||||
pygame.draw.rect(surf, (128, 232, 128), (2, 0, 3, tileSize))
|
||||
pygame.draw.line(surf, (0, 96, 0), (0, 0), (0, tileSize - 1))
|
||||
else:
|
||||
pygame.draw.rect(surf, (72, 200, 72), (8, 0, 3, tileSize))
|
||||
pygame.draw.rect(surf, (0, 96, 0), (13, 0, 3, tileSize))
|
||||
if top:
|
||||
pygame.draw.rect(surf, (0, 200, 0), (0, 0, tileSize, 6))
|
||||
pygame.draw.rect(surf, (0, 96, 0), (0, 0, tileSize, 6), 1)
|
||||
return surf
|
||||
|
||||
|
||||
def buildSprites():
|
||||
sprites = {
|
||||
"player": patternSurface(playerPattern, playerPalette),
|
||||
"goomba": patternSurface(goombaPattern, goombaPalette),
|
||||
"chaser": patternSurface(chaserPattern, chaserPalette),
|
||||
"flyer": flyerSurface(),
|
||||
"shooter": shooterSurface(),
|
||||
"coin": coinSurface(),
|
||||
"gem": gemSurface(),
|
||||
"key": keySurface(),
|
||||
"heart": heartSurface(),
|
||||
"ground": solidTile((198, 100, 29), (222, 140, 80)),
|
||||
"dirt": solidTile((120, 72, 40), (150, 96, 56)),
|
||||
"stone": solidTile((110, 110, 128), (150, 150, 168)),
|
||||
"brick": brickSurface(),
|
||||
"platform": platformSurface(),
|
||||
"woodOneWay": platformSurface(),
|
||||
"spike": spikeSurface(),
|
||||
"lava": lavaSurface(),
|
||||
"ladder": ladderSurface(False),
|
||||
"ladderTop": ladderSurface(True),
|
||||
"slopeRight": slopeSurface(True),
|
||||
"slopeLeft": slopeSurface(False),
|
||||
"pipeTL": pipeSurface(True, True),
|
||||
"pipeTR": pipeSurface(True, False),
|
||||
"pipeBL": pipeSurface(False, True),
|
||||
"pipeBR": pipeSurface(False, False),
|
||||
}
|
||||
for name, color in tileFallback.items():
|
||||
sprites.setdefault(name, solidTile(color, color))
|
||||
return sprites
|
||||
Reference in new issue
Block a user