mixster

ManFlardin edited by mixster

Apr 21st, 2010
201
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Python 9.52 KB | None | 0 0
  1. #!/user/bin/env python
  2.  
  3. import sys
  4. import os
  5. import pygame
  6. from pygame.locals import *
  7.  
  8. #--- Init pygame
  9. os.environ["SDL_VIDEO_CENTERED"] = "1"
  10. pygame.init
  11.  
  12. #--- Variables
  13. res = (32, 32)
  14. PLAYER_NUM = 1
  15. TILE_SET_LENGTH = 9
  16. #TILE_SET_LENGTH = 20
  17. clock = pygame.time.Clock()
  18.  
  19. #--- Display
  20. pygame.display.set_caption("Rectangle Man: Story of a Square")
  21. screen = pygame.display.set_mode((20 * res[0], 17 * res[1]))
  22.  
  23.  
  24. class Entity(object):
  25.     def __init__(self, Size):
  26.         self.rect = pygame.Rect(Size[0], Size[1], Size[2], Size[3])
  27.         self.permSize = (self.rect[2], self.rect[3])
  28.  
  29.  
  30. class Player(Entity):
  31.  
  32.     def __init__(self, Size, Speed):
  33.         Entity.__init__(self, Size)
  34.         self.topSpeed = Speed
  35.         self.speed = [0, 0]
  36.         self.uc = 16
  37.         self.currentJump = 0
  38.         self.totJumpNum = 2
  39.         self.jIncrement = 1
  40.         self.jumping = False
  41.         self.controlled = True
  42.         self.tPos = 0
  43.         self.sliding = False
  44.         self.hanging = False
  45.  
  46.     def move(self):
  47.         if self.speed[0] != 0:
  48.             self.move_single_axis(self.speed[0], 0)
  49.         if self.speed[1] != 0:
  50.             if self.sliding:
  51.                 self.move_single_axis(0, self.speed[1] / 4)
  52.             else:
  53.                 self.move_single_axis(0, self.speed[1])
  54.            
  55.     def collide(self, dx, dy, collideBox):
  56.         if self.rect.colliderect(collideBox):
  57.             if dx > 0:
  58.                 self.rect.right = collideBox.left
  59.                 if self.speed[1] >= 0:#self.jumping and
  60.                     self.sliding = True
  61.             if dx < 0:
  62.                 self.rect.left = collideBox.right
  63.                 if self.speed[1] >= 0:#self.jumping and
  64.                     self.sliding = True
  65.             if dy > 0:
  66.                 self.rect.bottom = collideBox.top
  67.                 self.currentJump = 0
  68.                 self.speed[1] = 0
  69.                 if self.rect.height == self.permSize[1] / 2 and self.speed[0] < 0:
  70.                     if self.rect.x + self.permSize[0] / 2 < collideBox.x:
  71.                         self.rect.height = self.permSize[0]
  72.                         self.rect = pygame.Rect(collideBox.x - self.permSize[0] / 2, collideBox.y, self.permSize[0] / 2, self.rect.height)
  73.                         self.hanging = True
  74.                 if self.rect.height == self.permSize[1] / 2 and self.speed[0] > 0:
  75.                     if self.rect.x > collideBox.x + collideBox.width / 2:
  76.                         self.rect.height = self.permSize[0]
  77.                         self.rect = pygame.Rect(collideBox.x + collideBox.width, collideBox.y, self.permSize[0] / 2, self.rect.height)
  78.                         self.hanging = True
  79.             if dy < 0:
  80.                 self.rect.top = collideBox.bottom
  81.                 self.speed[1] = 0
  82.             return
  83.  
  84.     def move_single_axis(self, dx, dy):
  85.         self.rect.x += dx
  86.         self.rect.y += dy
  87.  
  88.         tx, ty = int(self.rect.x / res[0]), int(self.rect.y / res[1])
  89.         rects = [[tx, ty], [tx + 1, ty], [tx, ty + 1], [tx + 1, ty + 1]]
  90.  
  91.         for h in rects:
  92.             if levels.map[int(h[0])][int(h[1])].tNum == 1:
  93.                 wam = levels.map[int(h[0])][int(h[1])].rect
  94.                 self.collide(dx, dy, wam)
  95.         for players in player:
  96.             if self <> players:
  97.                 self.collide(dx, dy, players.rect)
  98.  
  99.     def input(self, type, keys):
  100.         if type == KEYDOWN:
  101.             if keys == K_UP:
  102.                 if self.jumping == False:
  103.                     self.jumping = True
  104.                     self.currentJump += 1
  105.                     self.speed[1] = -self.topSpeed[1]
  106.                     self.increment = 1
  107.                     self.hanging = False
  108.             if keys == K_DOWN:
  109.                 self.rect = pygame.Rect(self.rect.x, self.rect.y + self.permSize[1] / 2, self.permSize[0], self.permSize[1] / 2)
  110.             if keys == K_LEFT:
  111.                 self.speed[0] = -self.topSpeed[0]
  112.             if keys == K_RIGHT:
  113.                 self.speed[0] = self.topSpeed[0]
  114.             #if keys == K_RCTRL:
  115.         if type == KEYUP:
  116.             if keys == K_UP:
  117.                 self.increment = 2
  118.             if keys == K_DOWN and self.speed[1] > 0:
  119.                 if self.rect.height <> self.permSize[0]:
  120.                     q = self.rect.x
  121.                     self.move(0, -res[1]/2)
  122.                     if self.rect.x == q:
  123.                         self.move(0, res[1]/2)
  124.                         self.rect = pygame.Rect(self.rect.x, self.rect.y - self.permSize[1] / 2, self.permSize[0], self.permSize[1])
  125.             if keys == K_LEFT and self.speed[0] < 0:
  126.                 self.speed[0] = 0
  127.             if keys == K_RIGHT and self.speed[0] > 0:
  128.                 self.speed[0] = 0
  129.             #if keys == K_RCTRL:
  130.             #    camera.target = player[0]
  131.                
  132.     def tick(self, inputs):      
  133.         if len(inputs) != 0:
  134.             for inputy in inputs:
  135.                 self.input(inputy[0], inputy[1])
  136.         #if self.sliding:
  137.         #    self.move(self.speed[0], 0)#self.speed[1] / 32)  
  138.         #    self.sliding = False      
  139.         #else:
  140.             #if self.hanging:
  141.             #    self.speed = [0,0]
  142.             #self.move(self.speed[0], self.speed[1])
  143.         #    self.move(self.speed[0], 0)
  144.         #    self.move(0, self.speed[1])
  145.         self.move()
  146.         self.sliding = False
  147.         if self.speed[1] < self.topSpeed[1]:
  148.             if self.speed[1] < 0:
  149.                 self.speed[1] += self.increment * levels.res[1]
  150.             else:
  151.                 self.speed[1] += 1 * levels.res[1]
  152.         if self.jumping:
  153.             if (self.speed[1] >= 0) and (self.currentJump <= self.totJumpNum - 1):
  154.                 self.jumping = False
  155.  
  156.  
  157. class Wall(object):
  158.  
  159.     def __init__(self, pos):
  160.         self.rect = pygame.Rect(pos[0], pos[1], pos[2], pos[3])
  161.         self.tNum = pos[4]
  162.         self.tile = pos[5]
  163.  
  164.  
  165. class Level(object):
  166.  
  167.     def __init__(self, (size, resolution, mapArray, playerStart)):
  168.         self.size = size
  169.         self.res = resolution
  170.         self.map =  mapArray
  171.         self.start = playerStart
  172.  
  173.  
  174. class Camera(Entity):
  175.  
  176.     def __init__(self, Size, Target):
  177.         Entity.__init__(self, Size)
  178.         self.target = Target
  179.  
  180.     def tick(self):
  181.         self.rect.x = self.target.rect.x - (self.rect.width / 2)
  182.         if self.rect.x < 0:
  183.             self.rect.x = 0
  184.         if self.rect.x + self.rect.width > len(levels.map) * res[0]:
  185.             self.rect.x = (len(levels.map) * res[0]) - self.rect.width
  186.  
  187.         self.rect.y = self.target.rect.y - (self.rect.height / 2)
  188.         if self.rect.y < 0:
  189.             self.rect.y = 0
  190.         if self.rect.y + self.rect.height > len(levels.map[0]) * res[1]:
  191.             self.rect.y = (len(levels.map[0]) * res[1]) - self.rect.height
  192.  
  193.  
  194. def translate(rect, Cam):
  195.     return pygame.Rect(rect.x - Cam.rect.x, rect.y - Cam.rect.y, rect.w, rect.h)
  196.  
  197. def getEvents():
  198.     res = []
  199.     for event in pygame.event.get():
  200.         if event.type == KEYDOWN or event.type == KEYUP:
  201.             res.append((event.type, event.key))
  202.         if event.type == pygame.QUIT:
  203.             gameRunning = False
  204.             sys.exit()
  205.     return res
  206.  
  207. def parseLevel(filename):
  208.     COMMA_ITER = 6
  209.     pos, walls, tot = [], [], []
  210.     fileObj = open(filename)
  211.     s = fileObj.read()
  212.     fileObj.close()
  213.     mRes = s.find(".", 0)
  214.     tot = [float(res[0]) / float(s[0: mRes]), float(res[1]) / float(s[0: mRes])]
  215.     mx = s.find(".", mRes + 1)
  216.     my = s.find("(", mx)
  217.     strPart = 0
  218.     for i in range(0, int(s[mRes + 1: mx])):
  219.         walls.append([])
  220.         for e in range(0, int(s[mx + 1: my])):
  221.             strPart = s.find("(", strPart) + 1
  222.             strPart2 = s.find(")", strPart)
  223.             for la in range(0, COMMA_ITER):
  224.                 final = s.find(",", strPart, strPart2)
  225.                 pos.append(int(s[strPart: final]))
  226.                 strPart = final + 1
  227.             if pos[4] == 2:
  228.                 pos[4] = 0
  229.                 star = (pos[0] * tot[0], pos[1] * tot[1])
  230.             walls[i].append(Wall((pos[0] * tot[0], pos[1] * tot[1], pos[2] * tot[0], pos[3] * tot[1], pos[4], pos[5])))
  231.             pos = []
  232.     return ((mx, my), tot, walls, star)
  233.  
  234. #--- Object Creation
  235. levels = Level(parseLevel("level.txt"))
  236. player = []
  237. for h in range(0, PLAYER_NUM):
  238.     player.append(Player((levels.start[0] + h * 16, levels.start[1], res[0] - 1, res[1]), (4 * levels.res[0], 10 * levels.res[1])))
  239. camera = Camera((0,0,screen.get_width(), screen.get_height()), player[0])
  240. tileset = pygame.transform.scale(pygame.image.load("tileset.bmp"), (res[0], res[1] * TILE_SET_LENGTH)).convert()
  241.  
  242. #--- Main Loop
  243. gameRunning = True
  244. while gameRunning:
  245.  
  246.     inputer = getEvents()
  247.     for players in player:
  248.         if players.controlled == True:
  249.             players.tick(inputer)
  250.         else:
  251.             players.tick([])
  252.     inputer = False
  253.     camera.tick()
  254.  
  255.  
  256.     screen.fill((0, 0, 0))
  257.     for i in range(0, len(levels.map)):
  258.         for e in range(0, len(levels.map[i])):
  259.             rect = translate(levels.map[i][e].rect, camera)
  260.             til = pygame.surface.Surface((res[0],res[1]))
  261.             til.set_colorkey((73,154,191))
  262.             #til.set_colorkey((63,13,45))
  263.             til.blit(tileset, (0, -levels.map[i][e].tile * res[1], res[0], res[1]))
  264.             screen.blit(til, rect)
  265.  
  266.     for k in range(0, len(player)):
  267.         rect = translate(player[k].rect, camera)
  268.         pygame.draw.rect(screen, (255, 200, 0), rect)
  269.  
  270.     clock.tick(30)
  271.     pygame.display.flip()
Add Comment
Please, Sign In to add comment