Advertisement
billysback

Shooter for PyGame

Jan 16th, 2014
97
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Python 7.42 KB | None | 0 0
  1. import sys, pygame, math, random
  2. pygame.init()
  3.  
  4. width, height = 320, 240
  5. screen = pygame.display.set_mode((width, height))
  6.  
  7. tick = pygame.time.get_ticks()
  8.  
  9. class Hitbox:
  10.     'Hitbox used to detect collisions'
  11.  
  12.     def __init__(self, x, y, width, height):
  13.         self.x = x
  14.         self.y = y
  15.         self.width = width
  16.         self.height = height
  17.  
  18.     def checkPoint(self, x, y):
  19.         return (x > self.x and x < self.x+self.width and y > self.y and y < self.y+self.height);
  20.  
  21.     def draw(self, col):
  22.         screen.fill(col, pygame.Rect(self.x, self.y, self.width, self.height))
  23.  
  24.     def check(self, hitbox, n):
  25.         tl = hitbox.checkPoint(self.x, self.y)
  26.         tr = hitbox.checkPoint(self.x+self.width, self.y)
  27.         bl = hitbox.checkPoint(self.x, self.y+self.height)
  28.         br = hitbox.checkPoint(self.x+width, self.y+self.height)
  29.         other = False
  30.         if n != 1:
  31.             other = hitbox.check(self, 1)
  32.         return (tl or tr or bl or br or other)
  33.  
  34. bullets = []
  35. ents = []
  36. screenBox = Hitbox(0, 0, width, height)
  37.  
  38. def checkCollision(es):
  39.     collision = False
  40.     for i in range(0, len(bullets)):
  41.         blt = bullets[i]
  42.         col = 0
  43.         for j in range(0, len(es)):
  44.             e = es[j]
  45.             if e != blt and blt != None:
  46.                 if e.getHitbox().check(blt.getHitbox(), 0):
  47.                     col = col + 1
  48.         if col == len(es):
  49.             collision = True
  50.  
  51.     if not collision:
  52.         for i in range(0, len(ents)):
  53.             ent = ents[i]
  54.             col = 0
  55.             for j in range(0, len(es)):
  56.                 e = es[j]
  57.                 if ent != e and ent != None:
  58.                     if e.getHitbox().check(ent.getHitbox(), 0):
  59.                         col = col + 1
  60.             if col == len(es):
  61.                 collision = True
  62.  
  63.     if not collision:
  64.         if not e.getHitbox().check(screenBox, 1):
  65.             collision = True
  66.        
  67.     return collision
  68.  
  69. class Entity:
  70.     'Game-Entity class, used for players'
  71.  
  72.     def __init__(self, x, y, size, health, col):
  73.         self.x = x
  74.         self.y = y
  75.         self.size = size
  76.         self.dir = [0, 0]
  77.         self.health = health
  78.         self.index = 0
  79.         self.col = col
  80.         self.slow = 1
  81.         self.cticks = pygame.time.get_ticks()
  82.         if col == None:
  83.             self.col = (255, 255, 255)
  84.  
  85.     def move(self, x, y, cols):
  86.         if pygame.time.get_ticks() - self.cticks > self.slow:
  87.             self.x = self.x+x
  88.             self.y = self.y+y
  89.             collider = [self]
  90.             if cols != None:
  91.                 collider = cols
  92.             if checkCollision(collider):
  93.                 #print("COLLIDED")
  94.                 self.x = self.x-x
  95.                 self.y = self.y-y
  96.                 return False
  97.             else:
  98.                 self.cticks = pygame.time.get_ticks()
  99.         return True
  100.  
  101.     def update(self, args):
  102.        
  103.         return;
  104.  
  105.     def draw(self, col):
  106.         self.getHitbox().draw(col)
  107.         return;
  108.  
  109.     def getHitbox(self):
  110.         return Hitbox(self.x-(self.size/2), self.y-(self.size/2), self.size/2, self.size/2)
  111.  
  112. def getPoint(x, y, r, angle):
  113.     px = x + math.sin(angle)*r
  114.     py = y + math.cos(angle)*r
  115.     return px, py;
  116.  
  117. def getDirection(x1, y1, x2, y2):
  118.     #difx = max(x1, x2) - min(x1, x2)
  119.     #dify = max(y1, y2) - min(y1, y2)
  120.     difx = x1 - x2
  121.     dify = y1 - y2
  122.     angle = math.atan(difx/dify)
  123.     #print("DIR: " + str(difx) + "," + str(dify) + "; " + str(180 * angle / math.pi))
  124.     if dify < 0:
  125.         angle = angle - math.pi
  126.     #if difx >= 0 and dify <= 0:
  127.     #    angle = angle + (math.pi/2)
  128.     #if difx <= 0 and dify <= 0:
  129.     #    angle = angle + (math.pi)
  130.     #if difx <= 0 and dify >= 0:
  131.     #    angle = angle + ((3*math.pi)/2)
  132.     #print("ADIR: " + str(difx) + "," + str(dify) + "; " + str(180 * angle / math.pi))
  133.     angle = angle + math.pi
  134.     return angle
  135.  
  136. class Bullet(Entity):
  137.     'Game-Bullet class, fired by player'
  138.  
  139.     def startUp(self, x, y, parent, slow):
  140.         self.dir = [x, y]
  141.         self.slow = slow
  142.         self.index = len(bullets)
  143.         self.parent = parent
  144.         bullets.append(self)
  145.  
  146.     def update(self, args):
  147.         if not self.move(self.dir[0], self.dir[1], [self, self.parent]):
  148.             #print("BULLET DESTROYED @ " + str(self.x) + "," + str(self.y))
  149.             bullets[self.index] = None
  150.         if not screenBox.checkPoint(self.x, self.y):
  151.             bullets[self.index] = None
  152.         for i in range(0, len(ents)):
  153.             ent = ents[i]
  154.             if ent != self.parent and ent != None:
  155.                 if ent.getHitbox().checkPoint(self.x, self.y):
  156.                     ent.health = ent.health - 1
  157.                     bullets[self.index] = None
  158.        
  159.  
  160. class Player(Entity):
  161.     'Game-Player class, the player'
  162.  
  163.     def startUp(self, slow):
  164.         ents.append(self)
  165.         self.index = 0
  166.         self.slow = slow
  167.         self.shootDelay = 500
  168.         self.sticks = pygame.time.get_ticks()
  169.  
  170.     def shoot(self, x, y):
  171.         if pygame.time.get_ticks()-self.sticks > self.shootDelay:
  172.             self.sticks = pygame.time.get_ticks()
  173.             angle = getDirection(self.x, self.y, x, y)
  174.             dx, dy = getPoint(0, 0, 1, angle)
  175.             #print("DIRECTION:" + str(dx) + "," + str(dy))
  176.             #print("ANGLE:" + str(angle) + "," + str(180 * angle / math.pi))
  177.             blt = Bullet(self.x, self.y, 10, 1, (255, 0, 0))
  178.             blt.startUp(dx, dy, self, 1)
  179.        
  180.     def update(self, args):
  181.         if self.health <= 0:
  182.             ents[self.index] = None
  183.         self.move(self.dir[0], self.dir[1], None)
  184.         self.dir = [0,0]
  185.         return;
  186.        
  187. class Enemy(Entity):
  188.     'Game-Enemy class, the enemies)'
  189.  
  190.     def startUp(self,  slow):
  191.         self.index = len(ents)
  192.         self.slow = slow
  193.         ents.append(self)
  194.  
  195.     def update(self, args):
  196.         if self.health <= 0:
  197.             ents[self.index] = None
  198.         return;
  199.  
  200.  
  201. player = Player(5, 5, 30, 10, (0, 255, 0))
  202. player.startUp(5)
  203. enemy = Enemy(100, 100, 25, 5, (0, 0, 255))
  204. enemy.startUp(25)
  205.  
  206. def update():
  207.     screen.fill((0, 0, 0))
  208.     for i in range(0, len(bullets)):
  209.         blt = bullets[i]
  210.         if blt != None:
  211.             blt.update([player])
  212.             blt.draw(blt.col)
  213.        
  214.     for i in range(0, len(ents)):
  215.         ent = ents[i]
  216.         if ent != None:
  217.             ent.update([player])
  218.             ent.draw(ent.col)
  219.     pygame.display.flip()
  220.  
  221.  
  222. while 1:
  223.     for event in pygame.event.get():
  224.         if event.type == pygame.QUIT: sys.exit()
  225.    
  226.     if pygame.time.get_ticks()-tick > 10:
  227.        
  228.         prsd = pygame.key.get_pressed()
  229.         if prsd[pygame.K_UP] or prsd[pygame.K_w]:
  230.             player.dir[1] = -1
  231.         if prsd[pygame.K_DOWN] or prsd[pygame.K_s]:
  232.             player.dir[1] = 1
  233.         if prsd[pygame.K_LEFT] or prsd[pygame.K_a]:
  234.             player.dir[0] = -1
  235.         if prsd[pygame.K_RIGHT] or prsd[pygame.K_d]:
  236.             player.dir[0] = 1
  237.  
  238.  
  239.         mprsd = pygame.mouse.get_pressed()
  240.         if mprsd[0]:
  241.             xy = pygame.mouse.get_pos()
  242.             #print(str(xy[0]) + ' ' + str(xy[1]))
  243.             player.shoot(xy[0], xy[1])
  244.         if mprsd[1]:
  245.             xy = pygame.mouse.get_pos()
  246.             enemy = Enemy(xy[0], xy[1], 25, 5, (0, 0, 255))
  247.             enemy.startUp(25)
  248.  
  249.        
  250.         update()
  251.         tick = pygame.time.get_ticks()
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement