Advertisement
Guest User

Unaligned Bullets

a guest
Jun 6th, 2018
337
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 11.62 KB | None | 0 0
  1. from pygame import *
  2. from pygame.locals import *
  3. from math import *
  4. import sys
  5.  
  6. global vel
  7. vel = 10 #speed of movement
  8. global FPS
  9. global clock
  10. global time_spent
  11.  
  12. def RelRect(char, camera):
  13. return Rect(char.rect.x - camera.rect.x, char.rect.y - camera.rect.y, char.rect.w, char.rect.h)
  14.  
  15. class Camera(object):
  16. '''Class for center screen on the player'''
  17. def __init__(self, screen, player, levelWidth, levelHeight):
  18. self.player = player
  19. self.rect = screen.get_rect()
  20. self.rect.center = self.player.center
  21. self.worldRect = Rect(0, 0, levelWidth, levelHeight)
  22.  
  23. def update(self):
  24. if self.player.centerx > self.rect.centerx:
  25. self.rect.centerx = self.player.centerx
  26.  
  27. if self.player.centerx < self.rect.centerx:
  28. self.rect.centerx = self.player.centerx
  29.  
  30. if self.player.centery > self.rect.centery:
  31. self.rect.centery = self.player.centery
  32.  
  33. if self.player.centery < self.rect.centery:
  34. self.rect.centery = self.player.centery
  35.  
  36.  
  37. def draw_sprites(self, surface, sprites):
  38. for sprite in sprites:
  39. if sprite.rect.colliderect(self.rect):
  40. surface.blit(sprite.image, RelRect(sprite, self))
  41.  
  42.  
  43. class Obstacle(sprite.Sprite):
  44. '''Class for create obstacles'''
  45. def __init__(self, x, y):
  46. self.x = x
  47. self.y = y
  48. sprite.Sprite.__init__(self)
  49. self.image = image.load("world/obstacle.png").convert()
  50. self.rect = self.image.get_rect()
  51. self.rect.topleft = [self.x, self.y]
  52.  
  53. bullets = []
  54. class Bullet():
  55.  
  56. def __init__(self, x, y, targetX, targetY):
  57. self.image = ''
  58. self.origX = x
  59. self.origY = y
  60. self.x = x
  61. self.y = y
  62. self.targetX = targetX
  63. self.targetY = targetY
  64. self.image = image.load('res/attack/attack.png')
  65.  
  66. self.vel = 20
  67. # rnge is the range of the bullet, in frames
  68. self.rnge = 50
  69. # prog is the progress of the bullet, in frames
  70. self.prog = 0
  71. # dmg is the damage that the bullet will do upon impact
  72. self.dmg = 1
  73. self.dmg_mult = 1
  74. # deathtick is the timer for enemy death
  75. self.deathTick = 0
  76. # rect is the hitbox of the bullet
  77. self.w, self.h = self.image.get_width(), self.image.get_height()
  78. self.rect = Rect(self.x, self.y, self.w, self.h)
  79.  
  80. def update(self):
  81. # Increases Progress of the bullet
  82. if not (sqrt((self.targetX - self.origX) ** 2 + (self.targetY - self.origY) ** 2)) == 0:
  83.  
  84. self.x += int((self.vel) * (self.targetX - self.origX) /
  85. (sqrt((self.targetX - self.origX) ** 2 +
  86. (self.targetY - self.origY) ** 2)))
  87. self.y += int((self.vel) * (self.targetY - self.origY) /
  88. (sqrt((self.targetX - self.origX) ** 2 +
  89. (self.targetY - self.origY) ** 2)))
  90.  
  91. self.rect.center = [self.x, self.y]
  92.  
  93. def check(self, enemies):
  94. # Checks if the bullet is out of range, then deletes it, if it is
  95. if self.prog >= self.rnge:
  96. bullets.remove(self)
  97. #checks if bullets are out of bounds
  98. elif not 0 < self.x < WIDTH - self.w or not 0 < self.y < HEIGHT - self.h:
  99. bullets.remove(self)
  100.  
  101. else:
  102. #checks if bullet hits target hitbox, if so, starts a timer that kills the bullet after 1 frame
  103. for e in enemies:
  104. if self.rect.colliderect(e.hitbox):
  105. self.deathTick += 1
  106.  
  107. if self.deathTick > 1:
  108. bullets.remove(self)
  109.  
  110. #draws each bullet
  111. def draw(self):
  112. screen.blit(self.image, self.rect)
  113.  
  114. #draws bullet hitboxes
  115. def debug(self):
  116. draw.rect(screen, (0,0,0), self.rect, 2)
  117. draw.line(screen, (255,255,255), (self.x, self.y), (self.targetX, self.targetY), 4)
  118.  
  119. class Player(sprite.Sprite):
  120. '''class for player and collision'''
  121. def __init__(self, x, y):
  122. sprite.Sprite.__init__(self)
  123. self.moveUnitsY = 0
  124. self.moveUnitsX = 0
  125. self.x = x
  126. self.y = y
  127. self.ground = False
  128. self.jump = False
  129. self.image = image.load("res/move/Ridle.png").convert()
  130. self.rect = self.image.get_rect()
  131.  
  132. self.Lrun = ["res/move/L1.png",
  133. "res/move/L2.png",
  134. "res/move/L3.png",
  135. "res/move/L4.png",
  136. "res/move/L5.png",
  137. "res/move/L6.png"]
  138.  
  139. self.Rrun = ["res/move/R1.png",
  140. "res/move/R2.png",
  141. "res/move/R3.png",
  142. "res/move/R4.png",
  143. "res/move/R5.png",
  144. "res/move/R6.png"]
  145.  
  146. self.direction = "right"
  147. self.rect.topleft = [x, y]
  148. self.frame = 0
  149.  
  150. def update(self, up, down, left, right):
  151. if up:
  152. if self.ground:
  153. if self.direction == "right":
  154. self.image = image.load("res/move/Ridle.png")
  155. self.jump = True
  156. self.moveUnitsY -= 20
  157. if down:
  158. if self.ground and self.direction == "right":
  159. self.image = image.load("res/move/Ridle.png").convert_alpha()
  160. if self.ground and self.direction == "left":
  161. self.image = image.load("res/move/Lidle.png").convert_alpha()
  162.  
  163. if not down and self.direction == "right":
  164. self.image = image.load("res/move/Ridle.png").convert_alpha()
  165.  
  166. if not down and self.direction == "left":
  167. self.image = image.load("res/move/Lidle.png").convert_alpha()
  168.  
  169. if left:
  170. self.direction = "left"
  171. self.moveUnitsX = -vel
  172. if self.ground:
  173. self.frame += 1
  174. self.image = image.load(self.Lrun[self.frame]).convert_alpha()
  175. if self.frame == 4: self.frame = 0
  176. else:
  177. self.image = self.image = image.load("res/move/Lidle.png").convert_alpha()
  178.  
  179. if right:
  180. self.direction = "right"
  181. self.moveUnitsX = +vel
  182. if self.ground:
  183. self.frame += 1
  184. self.image = image.load(self.Rrun[self.frame]).convert_alpha()
  185. if self.frame == 4: self.frame = 0
  186. else:
  187. self.image = self.image = image.load("res/move/Ridle.png").convert_alpha()
  188.  
  189. if not (left or right):
  190. self.moveUnitsX = 0
  191. self.rect.right += self.moveUnitsX
  192.  
  193. self.collide(self.moveUnitsX, 0, world)
  194.  
  195.  
  196. if not self.ground:
  197. self.moveUnitsY += 0.3
  198. if self.moveUnitsY > 10:
  199. self.moveUnitsY = 10
  200. self.rect.top += self.moveUnitsY
  201.  
  202. if self.jump:
  203.  
  204. self.moveUnitsY += 2
  205. self.rect.top += self.moveUnitsY
  206. if self.ground == True:
  207. self.jump = False
  208.  
  209. self.ground = False
  210. self.collide(0, self.moveUnitsY, world)
  211.  
  212.  
  213. def collide(self, moveUnitsX, moveUnitsY, world):
  214. self.ground = False
  215. for pos in world:
  216. if self.rect.colliderect(pos):
  217. if moveUnitsX > 0:
  218. self.rect.right = pos.rect.left
  219. if moveUnitsX < 0:
  220. self.rect.left = pos.rect.right
  221. if moveUnitsY > 0:
  222. self.rect.bottom = pos.rect.top
  223. self.moveUnitsY = 0
  224. self.ground = True
  225. if moveUnitsY < 0:
  226. self.rect.top = pos.rect.bottom
  227. self.moveUnitsY = 0
  228.  
  229. class Level(object):
  230. '''Read a map and create a level'''
  231. def __init__(self, open_level):
  232. self.level1 = []
  233. self.world = []
  234. self.all_sprite = sprite.Group()
  235. self.level = open(open_level, "r")
  236.  
  237. def create_level(self, x, y):
  238. for l in self.level:
  239. self.level1.append(l)
  240.  
  241. for row in self.level1:
  242. for col in row:
  243. if col == "X":
  244. obstacle = Obstacle(x, y)
  245. self.world.append(obstacle)
  246. self.all_sprite.add(self.world)
  247. if col == "P":
  248. self.player = Player(x,y)
  249. self.all_sprite.add(self.player)
  250. x += 25
  251. y += 25
  252. x = 0
  253.  
  254. def get_size(self):
  255. lines = self.level1
  256. #line = lines[0]
  257. line = max(lines, key=len)
  258. self.width = (len(line))*25
  259. self.height = (len(lines))*25
  260. return (self.width, self.height)
  261.  
  262.  
  263.  
  264. def sec(time,fps):
  265. temp = time.tick(fps)
  266. sec = temp / 1000.
  267. return sec
  268.  
  269.  
  270. init()
  271. WIDTH, HEIGHT = 1000, 700
  272. screen = display.set_mode((WIDTH, HEIGHT))
  273.  
  274. screen_rect = screen.get_rect()
  275. background = image.load("world/background.png").convert_alpha()
  276. background_rect = background.get_rect()
  277. level = Level("level/level1")
  278. level.create_level(0,0)
  279. world = level.world
  280. player = level.player
  281.  
  282. camera = Camera(screen, player.rect, level.get_size()[0], level.get_size()[1])
  283. all_sprite = level.all_sprite
  284.  
  285. FPS = 30
  286. clock = time.Clock()
  287. mx, my = 0, 0
  288. button = 0
  289. up = down = left = right = False
  290. x, y = 0, 0
  291. running = True
  292. enemies = []
  293.  
  294. while running:
  295. for evnt in event.get():
  296. if evnt.type == QUIT or evnt.type == KEYDOWN and evnt.key == K_ESCAPE:
  297. running = False
  298.  
  299. if evnt.type == KEYDOWN and evnt.key == K_UP:
  300. up = True
  301. if evnt.type == KEYDOWN and evnt.key == K_DOWN:
  302. down = True
  303. if evnt.type == KEYDOWN and evnt.key == K_LEFT:
  304. left = True
  305. if evnt.type == KEYDOWN and evnt.key == K_RIGHT:
  306. right = True
  307.  
  308. if evnt .type == MOUSEBUTTONDOWN:
  309. # checks if any mouse button is down, if so sets clicking to true
  310. button = evnt.button
  311. #startTicks = time.get_ticks()
  312. if evnt.type == MOUSEBUTTONUP:
  313. # checks if any mouse button is down, if so sets clicking to true
  314. button = 0
  315. if evnt.type == MOUSEMOTION:
  316. # sets mx and my to mouse x backgand y if mouse is moving
  317. mx, my = evnt.pos
  318.  
  319. if evnt.type == KEYUP and evnt.key == K_UP:
  320. up = False
  321. if evnt.type == KEYUP and evnt.key == K_DOWN:
  322. down = False
  323. if evnt.type == KEYUP and evnt.key == K_LEFT:
  324. left = False
  325. if evnt.type == KEYUP and evnt.key == K_RIGHT:
  326. right = False
  327.  
  328. if button == 1:
  329. bullets.append(Bullet(player.rect[0]+ player.rect[2]//2, player.rect[1] + player.rect[3]//2, mx, my))
  330.  
  331.  
  332.  
  333.  
  334. asize = ((screen_rect.w // background_rect.w + 1) * background_rect.w, (screen_rect.h // background_rect.h + 1) * background_rect.h)
  335. bg = Surface(asize)
  336.  
  337. for x in range(0, asize[0], background_rect.w):
  338. for y in range(0, asize[1], background_rect.h):
  339. screen.blit(background, (x, y))
  340.  
  341. for b in bullets:
  342. b.update()
  343. b.draw()
  344. b.check(enemies)
  345.  
  346. time_spent = sec(clock, FPS)
  347. camera.draw_sprites(screen, all_sprite)
  348.  
  349. draw.rect(screen, (255,0,0), player.rect, 4)
  350.  
  351. player.update(up, down, left, right)
  352. camera.update()
  353. display.flip()
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement