Advertisement
cookertron

ZX Spectrum Chuckie Egg - Python Pygame

Sep 14th, 2019
273
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Python 8.01 KB | None | 0 0
  1. import math, random, sys, time, zlib, base64
  2. import pygame
  3. from pygame.locals import *
  4.  
  5. def unpackSurface(data, color1, color2, colorKey = None):
  6.     size, compressedPixelsString = data.decode('base64').decode('zlib').split(':')
  7.    
  8.     imageWidth, imageHeight = map(int, size.split(','))
  9.     compressedPixels = map(int, compressedPixelsString.split(','))
  10.  
  11.     surface = pygame.Surface((imageWidth, imageHeight))
  12.    
  13.     colors = [color1, color2]
  14.     colorIndex = 0
  15.    
  16.     pixelArray = pygame.PixelArray(surface)
  17.     pixelIndex = 0
  18.  
  19.     for pixelCount in compressedPixels:
  20.         for n in range(pixelCount):
  21.             pixelArray[pixelIndex % imageWidth, pixelIndex / imageWidth] = colors[colorIndex]
  22.             pixelIndex += 1
  23.         colorIndex = 1 - colorIndex
  24.  
  25.     pixelArray.close()
  26.     if colorKey: surface.set_colorkey(colorKey, pygame.RLEACCEL)
  27.     return imageWidth * 4, imageHeight * 4, pygame.transform.scale(surface, (imageWidth * 4, imageHeight * 4))
  28.  
  29. def resetAll(l):
  30.     for o in l: o.reset()
  31.  
  32. # define some colors
  33. FUCHSIA = (255,   0, 255)
  34. PURPLE  = (128,   0, 128)
  35. TEAL    = (  0, 128, 128)
  36. LIME    = (  0, 255,   0)
  37. GREEN   = (  0, 128,   0)
  38. OLIVE   = (128, 128,   0)
  39. YELLOW  = (255, 255,   0)
  40. ORANGE  = (255, 165,   0)
  41. RED     = (255,   0,   0)
  42. MAROON  = (128,   0,   0)
  43. SILVER  = (192, 192, 192)
  44. GRAY    = (128, 128, 128)
  45. BLUE    = (  0,   0, 255)
  46. NAVY    = (  0,   0, 128)
  47. AQUA    = (  0, 255, 255)
  48. WHITE   = (255, 255, 255)
  49. BLACK   = (  0,   0,   0)
  50.  
  51. TITLE_ZIP = "\
  52. eJyVVFsSwyAIvJAfQdFo73+wAoto0jYzHRNdkTdo5iNRe3EaiXIqqctPxwTlRiaec7dZiORzSVnG\
  53. UAFDzdcee51J5Z8YSW0Zp3wtEITU9kLgh6Dab76ufTE07ozVHJmMEkcAahOFUADCULEqumusYz9g\
  54. IQ3V0yeVzkBwmvKOwtn6objfzixE905iOGWi4TwLkGdGSza+alxnlv2mU7lplCRvKWbbtU0PKFmj\
  55. M2mCC2afZZyiHyv9lCZtI0hHRx1yVsxsMz5grfrfKkiM98DC+m8M3XgYrbMns1mZu7E8JVLDh6FT\
  56. 3VqdHtWY7qyD70W+lpHQQLy3IPvtmGRvxHmlqFoj1sstzkr40AFSTdHDDE/xjSXuD4T7hFTmneYB\
  57. huziyfAur4emu/LH1wYK31144s0="
  58.  
  59. FONT_ZIP = "\
  60. eJydVmty7iAI3ZA/qoAm3f/CrshB0drvznQyCfgAlMMjUp70fAs9Kac8PpxKyp2mFy/3V1cq9Y9w\
  61. H1OSZFS/tQvUwRN263rrtAze3oa1MvdEPU51177vpPrIGJtN6ZxJ60ny+JruivN1KT1AVaYMW3of\
  62. woloSFWcvriJOswUHEfNEKjzBLqu+PmV6Z7b1aKbTlcJgChhrnXOH/rgrkjzFwa3DXQ5iPFmIF9k\
  63. NVQYe3O5KB2T4gOGL02EpymBGkJY6PiF+gYF/vzPzwzsXsid6/5woASZdT05QlYmfq3vXHhYMFnQ\
  64. lvDdsfqN0gzZ+zoPy6YvxoSnwBt8Z3eRmXoc0tEheg0R3oK2BsfXi9Pc0F/BaMgwCXMRAL+MBHsy\
  65. asq6cDv4BufHBIlOXEmyz+UUnSwzIArGz0XXCUiFXgmydmYe8m7rDXJR5wgZXXgS8mNVzRMR0+K1\
  66. aUcjlqlPiDCqI9I/uvoGxSqxPHPprzWLf9m75soPmCNMMYx2F651l/A5wZkrypbLLbv1Auu+r7fE\
  67. 1VO88Btv3l8HI/SipdANn4gwmkV2LyusbWSvt6C9IlkBjl3jbLoaQ3vTjU34dlNf3+U88b2ZLu8u\
  68. 73gzldl4XcYdUwPfEn4ZVB8p0Io04/597k30D/NbkeY="
  69. FONT_CHARS = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ1234567890:!?."
  70.  
  71. class font:
  72.     def __init__(s):
  73.         global BLACK, WHITE
  74.         global FONT_ZIP, FONT_CHARS
  75.         s.fontSurfaceWidth, s.fontSurfaceHeight, s.fontSurface = unpackSurface(FONT_ZIP, BLACK, WHITE, BLACK)
  76.         s.charWidth = s.fontSurfaceWidth / len(FONT_CHARS)
  77.  
  78.     def write(s, text, x, y, color = None, returnSurface = False):
  79.         global DS
  80.         global FONT_CHARS
  81.  
  82.         textLength = len(text)
  83.         textSurface = pygame.Surface((s.charWidth * textLength, s.fontSurfaceHeight))
  84.         if color:
  85.             textColorSurface = textSurface.copy()
  86.             textColorSurface.fill(color)
  87.         textSurface.set_colorkey(BLACK, pygame.RLEACCEL)
  88.  
  89.         xOffset = 0
  90.         for char in text:
  91.             if char != ' ':
  92.                 charXPos = FONT_CHARS.find(char) * s.charWidth
  93.                 textSurface.blit(s.fontSurface, (xOffset, 0), (charXPos, 0, s.charWidth, s.fontSurfaceHeight))
  94.             xOffset += s.charWidth
  95.        
  96.         if color:
  97.             textSurface.blit(textColorSurface, (0, 0), None, pygame.BLEND_MULT)
  98.  
  99.         if returnSurface: return textSurface
  100.         DS.blit(textSurface, (x, y))
  101.  
  102. HARRY_ZIP = "\
  103. eJylUtEOwyAI/CEeiiiM/v+HDRDL2qbLksXAnXieRFUG5L0DgVrgluQFCM3iGftf0QG1WXYvd1uI\
  104. 4V/43YVD1bztALc9F2RNKsnFhmFYbXzgeX2k88Kep4wDn/QUTZTeZ2T+1+H6VafQ3jW/6+R2UZjn\
  105. zqfj6KueUjMoLn3WJTkl19hDoePkkt9kaorHuqU30uNxXw=="
  106. HARRY_WALK_JUMP_RIGHT = [0, 1]
  107. HARRY_WALK_JUMP_LEFT = [2, 3]
  108. HARRY_CLIMB_LADDER = [4, 5, 6, 7]
  109. HARRY_TOTAL_ANIM_FRAMES = 8
  110. HARRY_WALKING_SPEED = 4
  111. HARRY_JUMPING_SPEED = 4
  112. HARRY_JUMPING_HEIGHT = 16
  113. HARRY_JUMPING_TABLE = [-1 + (-1 * -(n / HARRY_JUMPING_HEIGHT)) * 2 for n in range(HARRY_JUMPING_HEIGHT * 2)]
  114. HARRY_MOVEMENT = [
  115.     {'dx' : 0, 'fi' : False, 'fi_reset' : True, 'as' : None},
  116.     {'dx' : HARRY_WALKING_SPEED, 'fi' : True, 'fi_reset' : False, 'as' : HARRY_WALK_JUMP_RIGHT},
  117.     {'dx' : -HARRY_WALKING_SPEED, 'fi' : True, 'fi_reset' : False, 'as' : HARRY_WALK_JUMP_LEFT},
  118. ]
  119.  
  120. class harry:
  121.     def __init__(s):
  122.         global YELLOW
  123.         global HARRY_ZIP, HARRY_TOTAL_ANIM_FRAMES
  124.         s.harrySurfaceWidth, s.harrySurfaceHeight, s.harrySurface = unpackSurface(HARRY_ZIP, BLACK, YELLOW, BLACK)
  125.         s.harryWidth = s.harrySurfaceWidth / HARRY_TOTAL_ANIM_FRAMES
  126.         s.reset()
  127.        
  128.     def reset(s):
  129.         global H
  130.         s.frameIndex = 0
  131.         s.currentAnimSet = HARRY_WALK_JUMP_RIGHT
  132.         s.x, s.y = 0, H  - s.harrySurfaceHeight
  133.         s.dx = 0
  134.         s.jumping = False
  135.         s.jumpingDx = 0
  136.  
  137.         s.onLadder = False
  138.  
  139.     def draw(s):
  140.         global DS
  141.         DS.blit(s.harrySurface, (s.x, s.y), (s.currentAnimSet[s.frameIndex] * s.harryWidth, 0, s.harryWidth, s.harrySurfaceHeight))
  142.  
  143.     def move(s):
  144.         global W, H
  145.         global HARRY_MOVEMENT, HARRY_JUMPING_TABLE, HARRY_JUMPING_SPEED, HARRY_JUMPING_HEIGHT
  146.         global keysHandler
  147.  
  148.         # if player requests jump
  149.         if keysHandler.action[1] and not s.jumping:
  150.             s.jumping = 1
  151.             s.jumpingDx = HARRY_MOVEMENT[keysHandler.action[0]]['dx']
  152.  
  153.         if not s.jumping:
  154.             s.x += HARRY_MOVEMENT[keysHandler.action[0]]['dx']
  155.         else:
  156.             s.x += s.jumpingDx
  157.             s.y += HARRY_JUMPING_TABLE[s.jumping] * HARRY_JUMPING_SPEED
  158.             s.jumping += 1
  159.             if s.jumping == HARRY_JUMPING_HEIGHT * 2 - 1: s.jumping = False
  160.                    
  161.         if HARRY_MOVEMENT[keysHandler.action[0]]['fi'] or s.jumping:
  162.             s.frameIndex += 1
  163.         elif HARRY_MOVEMENT[keysHandler.action[0]]['fi_reset'] and not s.jumping:
  164.             s.frameIndex = 0
  165.  
  166.         if HARRY_MOVEMENT[keysHandler.action[0]]['as'] and not s.jumping:
  167.             s.currentAnimSet = HARRY_MOVEMENT[keysHandler.action[0]]['as']  
  168.         if s.frameIndex > len(s.currentAnimSet) - 1: s.frameIndex = 0
  169.  
  170.  
  171.     def do(s):
  172.         s.draw()
  173.         s.move()
  174.  
  175. class keys:
  176.     def reset(s):
  177.         s.exit = False
  178.         s.action = [0] * 2
  179.  
  180.     def do(s):
  181.         k = pygame.key.get_pressed()
  182.        
  183.         if k[pygame.K_ESCAPE]:
  184.             s.exit = True
  185.             return
  186.  
  187.         if k[pygame.K_SPACE]:
  188.             s.action[1] = True
  189.         else:
  190.             s.action[1] = False
  191.  
  192.         if k[pygame.K_LEFT]:
  193.             s.action[0] = 2
  194.         elif k[pygame.K_RIGHT]:
  195.             s.action[0] = 1
  196.         else:
  197.             s.action[0] = 0
  198.  
  199.         """    
  200.        if k[pygame.K_UP]:
  201.            s.action[s.UP] = 1
  202.        elif k[pygame.K_DOWN]:
  203.            s.action[s.DOWN] = 1
  204.        """
  205.  
  206. # define display surface           
  207. W, H = 1024, 768
  208. HW, HH = W / 2, H / 2
  209.  
  210. # initialise display
  211. pygame.init()
  212. DS = pygame.display.set_mode((W, H), pygame.DOUBLEBUF | pygame.HWSURFACE)
  213. pygame.display.set_caption("Chuckie Egg")
  214.  
  215. CLOCK = pygame.time.Clock()
  216. FPS = 60
  217.  
  218. TITLE_WIDTH, TITLE_HEIGHT, TITLE = unpackSurface(TITLE_ZIP, BLACK, YELLOW, BLACK)
  219.  
  220. # Game variables / objects
  221. textHandler = font()
  222. keysHandler = keys()
  223. harryHandler = harry()
  224.  
  225. RESET_LIST = [keysHandler, harryHandler]
  226. resetAll(RESET_LIST)
  227.  
  228. EXIT = textHandler.write("Press ESC to exit!", 0, 0, None, True)
  229.  
  230. # main loop
  231. while not keysHandler.exit:
  232.     pygame.event.get() # purge the events
  233.  
  234.     DS.fill(BLACK)
  235.     DS.blit(EXIT, (0, 0))
  236.    
  237.     keysHandler.do()
  238.     harryHandler.do()
  239.  
  240.     pygame.display.update()
  241.     CLOCK.tick(FPS)
  242. pygame.quit()
  243. sys.exit()
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement