cookertron

Python Pygame Mario Running Demo

Oct 27th, 2021 (edited)
156
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Python 7.01 KB | None | 0 0
  1. import pygame
  2. from pygame import Rect
  3. from pygame import Vector2
  4. import base64
  5. import os.path
  6. import time
  7.  
  8. MARIO_SPRITESHEET = b'iVBORw0KGgoAAAANSUhEUgAAAGAAAABACAMAAADS6oI8AAAAAXNSR0IArs4c6QAAAGBQTFRFAAAAIiA0RSg8Zjkxj\
  9. 1Y733Em2aBm7sOa+/I2meVQar4wN5RuS2kvUkskMjw5Pz90MGCCW27hY5v/X83ky9v8////m623hH6HaWpqWVZSdkKKrDIy2Vdj13u6j5dKim8w\
  10. +2O8zwAAACB0Uk5TAP////////////////////////////////////////+Smq12AAAEbUlEQVRYhY1XQZIkIQj05Ikf8P9/bgskJGj3TsXEdGl\
  11. hJiAorGWPnmf9/XnL773zY/vsE/vPgF/k9xZj2DsoRJp8W9AQB+BDPmZEbLIIhBYwZEecgJe8QsJ8FOBG52vkvMmeCHt/AZzy+CjnWWYJ/kwmRh\
  12. jeiAPwkidx88mWm8Dec0VHnICXfIqbBT5/huqbLljQEAhxAF7ypG4I+vvZB4kFwR6b3hEn4CXfxGHI+W87HQZihVvcECfgLc/isiQEPj8IymsHJ\
  13. mIHXHMHSNz2OIcZ9iGyOmEziRSAFfUOjeVgHFx1k8oEC2FNhjUQZ+J6QJ7VbINBGiGSDgQCAklCk0g6tQ0jC32sfLoFiBPAB5mYIJAyqOyJrzkh\
  14. 4V9R8SDIYeDDaZv0yX8PjyWBEL6bUJsrGi5IAtl1EGhCSHlM4HcQ6E0gie8m1GfxM5sciv+2A2QnCARhBrxQ2bMGm0L82gjqOPQtvgkq7GPFVo9\
  15. Kjx4/ofk7HZUfX6qvcB8pm3CGIJgKaaaVLSeX023jx1LdGBl1RKAg0ACcBHy409Xwi8BklNLKxS7Aj1tqeMZEEBydIHVIjZJPk6C+2/mvbQwP5+\
  16. nDAoOAiwLB2bWpaMg9qwlbgMPjuvO1baLQpS7kVZVOIJNgVRYkfv4mgf1AhPEtp9jRKjIIqvYSqoA6gZQKYECegb2SOCiKYIWH5SuBD0EQcJk3q\
  17. pS0ki5oBBVHQktrtEja30sqLxLKqzUeitNJwKAkTCsH0At/Nf1Jt651P6G/EFzYXcFJcKswbegM3/C72NOLPx6W33xbNwGC3PqbYn4leTQFrHrA\
  18. 0/zuDBfbVIDkNy6vqrKSoJvDVk+DmgJdnk/XkLVLrgNGtSsvvJcCJF+pVoRZDufxmBX9E28o0OXpfpsE3k+tqspwvA6DhgJD/hjAC6xe2Sjhd1H\
  19. 6ArnwLgWGPIo4LPj8CCrHYPCMQm15GTQVGPIyFtj+opYhgpCRG28ATnlpCzwqpOrtsQsvvDXHT3kSUK0JhAk3CBfeAMxgx+EHZ0DjbA6qIu/Vbu\
  20. JVoi26Y7dj5Lh3B/bRRlq119UfROXAJ6uXov5paRWyWZ1TYsJ+ugR7fwCbuEVIG89SFS4D7EOrCxABPiFM8PTZkk6QBuCwQHvjE+eYk07Q+wNro\
  21. ZvPUEJYnbBlECwyAFVENSZXf0DW5S5AHy2F2SVaa7NMKQ0cqeaKoLYZcz4+Nmxm2FEUIfQaw9UfsAEIiyQYF0IQqDcHlVrQWXC2YUHGM8wKvJic\
  22. Nw4A55gviXd/kF4DHjKTik0A0vhcwvsq+P7WHxSjCAPatipNrOza0uK7P2g92IrTC+NSzhXiIFHEXGTyWqsrjCI4GwRkEulDBNm2YjWX1nWWATk\
  23. ZyiOZSVIxVAQSBXp1B1qZpnWjk+b00ut9itFMEeoQtI3Dx+s3QfZNFdd0XeTWl23KE6lOLuHf+yXycfWHm+EimEX6T4LRLVyFdJsCwfcqPd7690\
  24. eD8IWgFOqi/yH4of8DPxTiD/8AmF34y2XCvLIAAAAASUVORK5CYII='
  25.  
  26. # this writes the mario-sheet.png to disk if it doen't exist
  27. if not os.path.exists("mario-sheet.png"):
  28.     f = open("mario-sheet.png", "wb")
  29.     f.write(base64.b64decode(MARIO_SPRITESHEET))
  30.     f.close()
  31.  
  32. class spritesheet:
  33.     def __init__(s, filename, cols, rows=1, scale=False):
  34.         source = pygame.image.load(filename).convert_alpha()
  35.         if scale:
  36.             w, h = source.get_rect().size
  37.             source = pygame.transform.scale(source, (w * scale, h * scale))
  38.         size = source.get_rect().size
  39.         s.w, s.h = size[0] // cols, size[1] // rows
  40.         s.sprites = [source.subsurface(((index % cols * s.w, index // cols * s.h), (s.w, s.h))) for index in range(cols * rows)]
  41.    
  42.     def size(s):
  43.         return (s.w, s.h)
  44.  
  45.     def blit(s, index, xy):
  46.         global PDS
  47.         PDS.blit(s.sprites[int(index)], xy)
  48.  
  49. class mario:
  50.     def __init__(s, spawnPoint):
  51.         global MARIO_SPRITES, MARIO_JUMPING_RIGHT
  52.         s.xy = Vector2(spawnPoint)
  53.         s.Rect = (s.xy, MARIO_SPRITES.size())
  54.         s.frame = MARIO_STANDING_RIGHT
  55.         s.vel = Vector2(0, 0)
  56.         s.status = s.standing
  57.  
  58.     def draw(s):
  59.         global MARIO_SPRITES
  60.         MARIO_SPRITES.blit(s.frame, s.xy)
  61.  
  62.     def standing(s):
  63.         global MARIO_WALKING_RIGHT, MARIO_WALKING_LEFT
  64.         if s.keys[pygame.K_RIGHT]:
  65.             s.frame = MARIO_WALKING_RIGHT[0]
  66.             s.status = s.walking_right
  67.         elif s.keys[pygame.K_LEFT]:
  68.             s.frame = MARIO_WALKING_LEFT[0]
  69.             s.status = s.walking_left
  70.  
  71.     def walking_right(s):
  72.         global MARIO_WALKING_RIGHT, MARIO_SKIDDING_RIGHT, MARIO_MAX_SPEED, MARIO_ACCELERATION
  73.         if s.keys[pygame.K_LEFT] and s.vel.x > 0:
  74.             s.frame = MARIO_SKIDDING_RIGHT
  75.             s.status = s.skidding_right
  76.             return
  77.         if s.keys[pygame.K_RIGHT]:
  78.             s.vel.x += MARIO_ACCELERATION
  79.             if s.vel.x > MARIO_MAX_SPEED:
  80.                 s.vel.x = MARIO_MAX_SPEED
  81.         else:
  82.             s.vel.x -= 0.1
  83.             if s.vel.x < 0:
  84.                 s.vel.x = 0
  85.                 s.frame = MARIO_STANDING_RIGHT
  86.                 s.status = s.standing
  87.                 return
  88.         s.frame += 0.2
  89.         if s.frame > MARIO_WALKING_RIGHT[1]:
  90.             s.frame = MARIO_WALKING_RIGHT[0]
  91.        
  92.     def skidding_right(s):
  93.         global MARIO_WALKING_RIGHT, MARIO_WALKING_LEFT, MARIO_DEACCELERATION
  94.         if s.keys[pygame.K_RIGHT]:
  95.             s.frame = MARIO_WALKING_RIGHT[0]
  96.             s.status = s.walking_right
  97.             return
  98.         s.vel.x -= MARIO_DEACCELERATION
  99.         if s.vel.x < 0:
  100.             s.frame = MARIO_WALKING_LEFT[0]
  101.             s.status = s.walking_left
  102.  
  103.     def walking_left(s):
  104.         global MARIO_WALKING_LEFT, MARIO_SKIDDING_LEFT, MARIO_MAX_SPEED, MARIO_ACCELERATION
  105.         if s.keys[pygame.K_RIGHT] and s.vel.x < 0:
  106.             s.frame = MARIO_SKIDDING_LEFT
  107.             s.status = s.skidding_left
  108.             return
  109.         if s.keys[pygame.K_LEFT]:
  110.             s.vel.x -= MARIO_ACCELERATION
  111.             if s.vel.x < -MARIO_MAX_SPEED:
  112.                 s.vel.x = -MARIO_MAX_SPEED
  113.         else:
  114.             s.vel.x += 0.1
  115.             if s.vel.x > 0:
  116.                 s.vel.x = 0
  117.                 s.frame = MARIO_STANDING_LEFT
  118.                 s.status = s.standing
  119.                 return
  120.         s.frame += 0.2
  121.         if s.frame > MARIO_WALKING_LEFT[1]:
  122.             s.frame = MARIO_WALKING_LEFT[0]
  123.    
  124.     def skidding_left(s):
  125.         global MARIO_WALKING_LEFT, MARIO_WALKING_RIGHT, MARIO_DEACCELERATION
  126.         if s.keys[pygame.K_LEFT]:
  127.             s.frame = MARIO_WALKING_LEFT[0]
  128.             s.status = s.walking_left
  129.             return
  130.         s.vel.x += MARIO_DEACCELERATION
  131.         if s.vel.x > 0:
  132.             s.frame = MARIO_WALKING_RIGHT[0]
  133.             s.status = s.walking_right
  134.        
  135.     def update(s):
  136.         s.keys = pygame.key.get_pressed()
  137.         s.status()
  138.         s.xy += s.vel
  139.  
  140. BLACK = (0, 0, 0)
  141. WHITE = (255, 255, 255)
  142.  
  143. GRAVITY = Vector2(0, 0.1)
  144.  
  145. pygame.init()
  146. PDR = Rect(0, 0, 1280, 720)
  147. PDS = pygame.display.set_mode(PDR.size) #, pygame.FULLSCREEN | pygame.SCALED)
  148.  
  149. MARIO_SPRITES = spritesheet("mario-sheet.png", 6, 2, 3)
  150. MARIO_STANDING_RIGHT = 0
  151. MARIO_WALKING_RIGHT = (1, 4)
  152. MARIO_JUMPING_RIGHT = 4
  153. MARIO_SKIDDING_RIGHT = 5
  154. MARIO_STANDING_LEFT = 6
  155. MARIO_WALKING_LEFT = (7, 10)
  156. MARIO_JUMPING_LEFT = 10
  157. MARIO_SKIDDING_LEFT = 11
  158. MARIO_MAX_SPEED = 4
  159. MARIO_DEACCELERATION = 0.15
  160. MARIO_ACCELERATION = 0.1
  161.  
  162. MARIO = mario(PDR.center)
  163.  
  164. exitDemo = False
  165. pause = False # press p to pause
  166. while not exitDemo:
  167.  
  168.     # handle the events
  169.     events = pygame.event.get()
  170.     for event in events:
  171.         if event.type == pygame.QUIT or (event.type == pygame.KEYDOWN and event.key == pygame.K_ESCAPE):    
  172.             exitDemo = True
  173.         if event.type == pygame.KEYDOWN and event.key == pygame.K_p:
  174.             pause = 1 - pause
  175.    
  176.     if pause: continue
  177.  
  178.     PDS.fill(BLACK)
  179.  
  180.     MARIO.draw()
  181.     MARIO.update()
  182.  
  183.     pygame.display.update()
  184.     pygame.time.Clock().tick(60)
  185.  
  186. pygame.quit()
Add Comment
Please, Sign In to add comment