Advertisement
mixster

Untitled

Sep 19th, 2010
389
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 10.14 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. #--- Setup
  20. gameName = "Testing 1,2,3"
  21. levelFile = "level.txt"
  22. tilesetFile = "tileset.bmp"
  23. screenSize = (20, 17)
  24. FPS = 30
  25.  
  26. class vector(object):
  27. def __init__(self, list1, list2):
  28. self.diff = (list2[0] - list1[0], list2[1] - list2[1])
  29.  
  30. def distance(self):
  31. self.a = self.diff[0]
  32. self.b = self.diff[1]
  33. return math.sqrt(self.a**2, self.b**2)
  34.  
  35. def unit(self):
  36. dis = self.distance()
  37. self.aunit = self.a / distance
  38. self.bunit = self.b / distance
  39. return self.aunit, self.bunit
  40.  
  41. def add(self, first, second):
  42. self.sum = (first[0] + second[0], first[1] + second[1])
  43. return self.sum
  44.  
  45. def multiply(self, v, num):
  46. self.product = (v[0] * num, v[1] * num)
  47. return self.product
  48.  
  49. class Entity(object):
  50. def __init__(self, Size):
  51. self.rect = pygame.Rect(Size[0], Size[1], Size[2], Size[3])
  52. self.permSize = (self.rect[2], self.rect[3])
  53.  
  54. class Player(Entity):
  55.  
  56. def __init__(self, Size, Speed):
  57. Entity.__init__(self, Size)
  58. self.topSpeed = Speed
  59. self.speed = [0, 0]
  60. self.currentJump = 0
  61. self.totJumpNum = 2
  62. self.vectors = []
  63. self.jumping = False
  64. self.walking = False
  65. self.controlled = True
  66. self.lastValue = [0,0]
  67. self.gravity = 0
  68. self.unjump = False
  69. self.inputt = {"jump": [K_UP], "right": [K_RIGHT], "left": [K_LEFT], "crouch": [K_DOWN]}
  70.  
  71. def move(self, dx, dy):
  72. if self.speed[0] != 0:
  73. self.move_single_axis(self.speed[0], 0)
  74. if self.speed[1] != 0:
  75. self.move_single_axis(0, self.speed[1])
  76.  
  77. def collide(self, dx, dy, collideBox):
  78. if self.rect.colliderect(collideBox):
  79. if dx > 0:
  80. self.rect.right = collideBox.left
  81. if dx < 0:
  82. self.rect.left = collideBox.right
  83. if dy > 0:
  84. self.rect.bottom = collideBox.top
  85. self.jumping = False
  86. self.speed[1] = 0
  87. self.gravity = 0;
  88. if dy < 0:
  89. self.rect.top = collideBox.bottom
  90. self.jumping = False
  91. self.speed[1] = 0
  92. return
  93.  
  94. def move_single_axis(self, dx, dy):
  95. self.rect.x += dx
  96. self.rect.y += dy
  97.  
  98. tx, ty = int(self.rect.x / res[0]), int(self.rect.y / res[1])
  99. rects = [[tx, ty], [tx + 1, ty], [tx, ty + 1], [tx + 1, ty + 1]]
  100.  
  101. for h in rects:
  102. if levels.map[int(h[0])][int(h[1])].tNum == 1:
  103. wam = levels.map[int(h[0])][int(h[1])].rect
  104. self.collide(dx, dy, wam)
  105. for players in player:
  106. if self <> players:
  107. self.collide(dx, dy, players.rect)
  108.  
  109. def jump(self):
  110. if self.jumping == False:
  111. self.jumping = True
  112. self.currentJump += 1
  113. self.jumpVal = -self.topSpeed[1]
  114. self.unjump = False
  115.  
  116. def addVector(self, first, second):
  117. return [first[0] + second[0], first[1] + second[1]]
  118.  
  119. def walk(self, dir):
  120. if self.lastValue[0] < dir * self.topSpeed[0]:
  121. self.lastValue[0] = self.topSpeed[0] * dir#+= dir
  122. self.vectors.append(self.lastValue)
  123.  
  124. def input(self, type, keys):
  125. if type == KEYDOWN:
  126. if keys in self.inputt["jump"]:
  127. self.jump()
  128.  
  129. #if keys in self.inputt["crouch"]:
  130.  
  131. if keys in self.inputt["left"]:
  132. if self.walking == False:
  133. self.walking = True
  134. self.direc = -1
  135.  
  136.  
  137. if keys in self.inputt["right"]:
  138. if self.walking == False:
  139. self.walking = True
  140. self.direc = 1
  141.  
  142.  
  143. if type == KEYUP:
  144. if keys in self.inputt["jump"]:
  145. self.unjump = True
  146.  
  147. #if keys in self.inputt["crouch"] and self.speed[1] > 0:
  148.  
  149. if keys in self.inputt["left"] and self.speed[0] < 0:
  150. self.walking = False
  151.  
  152. if keys in self.inputt["right"] and self.speed[0] > 0:
  153. self.walking = False
  154.  
  155. def tick(self, inputs):
  156. #Get input
  157. self.vectors.append([0,0])
  158. if len(inputs) != 0:
  159. for inputy in inputs:
  160. self.input(inputy[0], inputy[1])
  161. # end get input
  162.  
  163. #moving
  164. if self.walking:
  165. if self.lastValue[0] != self.direc * self.topSpeed[0]:
  166. #self.lastValue[0] += self.direc
  167. self.lastValue[0] = self.topSpeed[0] * self.direc
  168. else:
  169. if self.lastValue[0] <> 0:
  170. #self.lastValue[0] -= self.direc
  171. self.lastValue[0] = 0
  172. self.vectors.append(self.lastValue)
  173. # end moving
  174.  
  175. #jumping
  176. if self.jumping:
  177. self.vectors.append([0,self.jumpVal])
  178. if self.unjump:
  179. self.gravity += 2
  180. else:
  181. self.gravity += 1
  182. self.vectors.append([0,self.gravity])
  183. # end jumping
  184.  
  185. #applying input
  186. if len(self.vectors) > 1:
  187. for i in range(0, len(self.vectors)):
  188. self.vectors[0] = self.addVector(self.vectors[0], self.vectors[i])
  189. self.speed = self.vectors[0]
  190. self.vectors = []
  191. self.move(self.speed[0], self.speed[1])
  192. # end applying input
  193.  
  194. #if self.jumping:
  195. # if (self.speed[1] >= 0) and (self.currentJump <= self.totJumpNum - 1):
  196. # self.jumping = False
  197.  
  198.  
  199. class Wall(object):
  200.  
  201. def __init__(self, pos):
  202. self.rect = pygame.Rect(pos[0], pos[1], pos[2], pos[3])
  203. self.tNum = pos[4]
  204. self.tile = pos[5]
  205.  
  206.  
  207. class Level(object):
  208.  
  209. def __init__(self, (size, resolution, mapArray, playerStart)):
  210. self.size = size
  211. self.res = resolution
  212. self.map = mapArray
  213. self.start = playerStart
  214.  
  215.  
  216. class Camera(Entity):
  217.  
  218. def __init__(self, Size, Target):
  219. Entity.__init__(self, Size)
  220. self.target = Target
  221.  
  222. def tick(self):
  223. self.rect.x = self.target.rect.x - (self.rect.width / 2)
  224. if self.rect.x < 0:
  225. self.rect.x = 0
  226. if self.rect.x + self.rect.width > len(levels.map) * res[0]:
  227. self.rect.x = (len(levels.map) * res[0]) - self.rect.width
  228.  
  229. self.rect.y = self.target.rect.y - (self.rect.height / 2)
  230. if self.rect.y < 0:
  231. self.rect.y = 0
  232. if self.rect.y + self.rect.height > len(levels.map[0]) * res[1]:
  233. self.rect.y = (len(levels.map[0]) * res[1]) - self.rect.height
  234.  
  235.  
  236. def translate(rect, Cam):
  237. return pygame.Rect(rect.x - Cam.rect.x, rect.y - Cam.rect.y, rect.w, rect.h)
  238.  
  239. def getEvents():
  240. res = []
  241. for event in pygame.event.get():
  242. if event.type == KEYDOWN or event.type == KEYUP:
  243. res.append((event.type, event.key))
  244. if event.type == pygame.QUIT:
  245. gameRunning = False
  246. sys.exit()
  247. return res
  248.  
  249. def parseLevel(filename):
  250. COMMA_ITER = 6
  251. pos, walls, tot = [], [], []
  252. fileObj = open(filename)
  253. s = fileObj.read()
  254. fileObj.close()
  255. mRes = s.find(".", 0)
  256. tot = [float(res[0]) / float(s[0: mRes]), float(res[1]) / float(s[0: mRes])]
  257. mx = s.find(".", mRes + 1)
  258. my = s.find("(", mx)
  259. strPart = 0
  260. for i in range(0, int(s[mRes + 1: mx])):
  261. walls.append([])
  262. for e in range(0, int(s[mx + 1: my])):
  263. strPart = s.find("(", strPart) + 1
  264. strPart2 = s.find(")", strPart)
  265. for la in range(0, COMMA_ITER):
  266. final = s.find(",", strPart, strPart2)
  267. pos.append(int(s[strPart: final]))
  268. strPart = final + 1
  269. if pos[4] == 2:
  270. pos[4] = 0
  271. star = (pos[0] * tot[0], pos[1] * tot[1])
  272. walls[i].append(Wall((pos[0] * tot[0], pos[1] * tot[1], pos[2] * tot[0], pos[3] * tot[1], pos[4], pos[5])))
  273. pos = []
  274. return ((mx, my), tot, walls, star)
  275.  
  276. #--- Object Creation
  277. pygame.display.set_caption(gameName)
  278. screen = pygame.display.set_mode((screenSize[0] * res[0], screenSize[1] * res[1]))
  279.  
  280. levels = Level(parseLevel(levelFile))
  281.  
  282. player = []
  283. for h in range(0, PLAYER_NUM):
  284. player.append(Player((levels.start[0] + h * 16, levels.start[1], res[0] - 1, res[1]), (4 * levels.res[0], 8 * levels.res[1])))
  285.  
  286. camera = Camera((0,0,screen.get_width(), screen.get_height()), player[0])
  287. tileset = pygame.transform.scale(pygame.image.load(tilesetFile), (res[0], res[1] * TILE_SET_LENGTH)).convert()
  288.  
  289. #--- Main Loop
  290. gameRunning = True
  291. while gameRunning:
  292.  
  293. inputer = getEvents()
  294. for players in player:
  295. if players.controlled == True:
  296. players.tick(inputer)
  297. else:
  298. players.tick([])
  299. inputer = False
  300. camera.tick()
  301.  
  302.  
  303. screen.fill((0, 0, 0))
  304. for i in range(0, len(levels.map)):
  305. for e in range(0, len(levels.map[i])):
  306. rect = translate(levels.map[i][e].rect, camera)
  307. til = pygame.surface.Surface((res[0],res[1]))
  308. til.set_colorkey((73,154,191))
  309. #til.set_colorkey((63,13,45))
  310. til.blit(tileset, (0, -levels.map[i][e].tile * res[1], res[0], res[1]))
  311. screen.blit(til, rect)
  312.  
  313. for k in range(0, len(player)):
  314. rect = translate(player[k].rect, camera)
  315. pygame.draw.rect(screen, (255, 200, 0), rect)
  316.  
  317. clock.tick(FPS)
  318. pygame.display.flip()
  319. pygame.quit ()
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement