ClearCode

Collisions

Mar 19th, 2022
3,151
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Python 7.64 KB | None | 0 0
  1. import pygame, sys, time
  2.  
  3. class StaticObstacle(pygame.sprite.Sprite):
  4.     def __init__(self,pos,size,groups):
  5.         super().__init__(groups)
  6.         self.image = pygame.Surface(size)
  7.         self.image.fill('yellow')
  8.         self.rect = self.image.get_rect(topleft = pos)
  9.         self.old_rect = self.rect.copy()
  10.  
  11. class MovingVerticalObstacle(StaticObstacle):
  12.     def __init__(self,pos,size,groups):
  13.         super().__init__(pos, size, groups)
  14.         self.image.fill('green')
  15.         self.pos = pygame.math.Vector2(self.rect.topleft)
  16.         self.direction = pygame.math.Vector2((0,1))
  17.         self.speed = 450
  18.         self.old_rect = self.rect.copy()
  19.  
  20.     def update(self,dt):
  21.         self.old_rect = self.rect.copy() # previous frame
  22.         if self.rect.bottom > 600:
  23.             self.rect.bottom = 600
  24.             self.pos.y = self.rect.y
  25.             self.direction.y *= -1
  26.         if self.rect.bottom < 120:
  27.             self.rect.bottom = 120
  28.             self.pos.y = self.rect.y
  29.             self.direction.y *= -1
  30.  
  31.         self.pos.y += self.direction.y * self.speed * dt
  32.         self.rect.y = round(self.pos.y) # current frame
  33.  
  34. class MovingHorizontalObstacle(StaticObstacle):
  35.     def __init__(self,pos,size,groups):
  36.         super().__init__(pos, size, groups)
  37.         self.image.fill('purple')
  38.         self.pos = pygame.math.Vector2(self.rect.topleft)
  39.         self.direction = pygame.math.Vector2((1,0))
  40.         self.speed = 400
  41.         self.old_rect = self.rect.copy()
  42.  
  43.     def update(self,dt):
  44.         self.old_rect = self.rect.copy()
  45.         if self.rect.right > 1000:
  46.             self.rect.right = 1000
  47.             self.pos.x = self.rect.x
  48.             self.direction.x *= -1
  49.         if self.rect.left < 600:
  50.             self.rect.left = 600
  51.             self.pos.x = self.rect.x
  52.             self.direction.x *= -1
  53.  
  54.         self.pos.x += self.direction.x * self.speed * dt
  55.         self.rect.x = round(self.pos.x)
  56.  
  57. class Player(pygame.sprite.Sprite):
  58.     def __init__(self,groups,obstacles):
  59.         super().__init__(groups)
  60.        
  61.         # image
  62.         self.image = pygame.Surface((30,60))
  63.         self.image.fill('blue')
  64.        
  65.         # position
  66.         self.rect = self.image.get_rect(topleft = (640,360))
  67.         self.old_rect = self.rect.copy()
  68.        
  69.         # movement
  70.         self.pos = pygame.math.Vector2(self.rect.topleft)
  71.         self.direction = pygame.math.Vector2()
  72.         self.speed = 200
  73.         self.obstacles = obstacles
  74.  
  75.     def input(self):
  76.         keys = pygame.key.get_pressed()
  77.  
  78.         # movement input
  79.         if keys[pygame.K_UP]:
  80.             self.direction.y = -1
  81.         elif keys[pygame.K_DOWN]:
  82.             self.direction.y = 1
  83.         else:
  84.             self.direction.y = 0
  85.  
  86.         if keys[pygame.K_RIGHT]:
  87.             self.direction.x = 1
  88.         elif keys[pygame.K_LEFT]:
  89.             self.direction.x = -1
  90.         else:
  91.             self.direction.x = 0
  92.  
  93.     def collision(self,direction):
  94.         collision_sprites = pygame.sprite.spritecollide(self,self.obstacles,False)
  95.         if collision_sprites:
  96.             if direction == 'horizontal':
  97.                 for sprite in collision_sprites:
  98.                     # collision on the right
  99.                     if self.rect.right >= sprite.rect.left and self.old_rect.right <= sprite.old_rect.left:
  100.                         self.rect.right = sprite.rect.left
  101.                         self.pos.x = self.rect.x
  102.  
  103.                     # collision on the left
  104.                     if self.rect.left <= sprite.rect.right and self.old_rect.left >= sprite.old_rect.right:
  105.                         self.rect.left = sprite.rect.right
  106.                         self.pos.x = self.rect.x
  107.        
  108.             if direction == 'vertical':
  109.                 for sprite in collision_sprites:
  110.                     # collision on the bottom
  111.                     if self.rect.bottom >= sprite.rect.top and self.old_rect.bottom <= sprite.old_rect.top:
  112.                         self.rect.bottom = sprite.rect.top
  113.                         self.pos.y = self.rect.y
  114.  
  115.                     # collision on the top
  116.                     if self.rect.top <= sprite.rect.bottom and self.old_rect.top >= sprite.old_rect.bottom:
  117.                         self.rect.top = sprite.rect.bottom
  118.                         self.pos.y = self.rect.y
  119.  
  120.     def update(self,dt):
  121.         self.old_rect = self.rect.copy()
  122.         self.input()
  123.  
  124.         if self.direction.magnitude() != 0:
  125.             self.direction = self.direction.normalize()
  126.  
  127.         self.pos.x += self.direction.x * self.speed * dt
  128.         self.rect.x = round(self.pos.x)
  129.         self.collision('horizontal')
  130.         self.pos.y += self.direction.y * self.speed * dt
  131.         self.rect.y = round(self.pos.y)
  132.         self.collision('vertical')
  133.        
  134. class Ball(pygame.sprite.Sprite):
  135.     def __init__(self,groups,obstacles,player):
  136.         super().__init__(groups)
  137.         self.image = pygame.Surface((40,40))
  138.         self.image.fill('red')
  139.         self.rect = self.image.get_rect(center = (640,360))
  140.  
  141.         self.pos = pygame.math.Vector2(self.rect.topleft)
  142.         self.direction = pygame.math.Vector2(1,1)
  143.         self.speed = 400
  144.         self.old_rect = self.rect.copy()
  145.  
  146.         self.obstacles = obstacles
  147.         self.player = player
  148.  
  149.     def collision(self,direction):
  150.         collision_sprites = pygame.sprite.spritecollide(self,self.obstacles,False)
  151.        
  152.         if self.rect.colliderect(self.player.rect):
  153.             collision_sprites.append(self.player)
  154.  
  155.         if collision_sprites:
  156.             if direction == 'horizontal':
  157.                 for sprite in collision_sprites:
  158.                     # collision on the right
  159.                     if self.rect.right >= sprite.rect.left and self.old_rect.right <= sprite.old_rect.left:
  160.                         self.rect.right = sprite.rect.left
  161.                         self.pos.x = self.rect.x
  162.                         self.direction.x *= -1
  163.  
  164.                     # collision on the left
  165.                     if self.rect.left <= sprite.rect.right and self.old_rect.left >= sprite.old_rect.right:
  166.                         self.rect.left = sprite.rect.right
  167.                         self.pos.x = self.rect.x
  168.                         self.direction.x *= -1
  169.        
  170.             if direction == 'vertical':
  171.                 for sprite in collision_sprites:
  172.                     # collision on the bottom
  173.                     if self.rect.bottom >= sprite.rect.top and self.old_rect.bottom <= sprite.old_rect.top:
  174.                         self.rect.bottom = sprite.rect.top
  175.                         self.pos.y = self.rect.y
  176.                         self.direction.y *= -1
  177.  
  178.                     # collision on the top
  179.                     if self.rect.top <= sprite.rect.bottom and self.old_rect.top >= sprite.old_rect.bottom:
  180.                         self.rect.top = sprite.rect.bottom
  181.                         self.pos.y = self.rect.y
  182.                         self.direction.y *= -1
  183.  
  184.     def window_collision(self,direction):
  185.         if direction == 'horizontal':
  186.             if self.rect.left < 0:
  187.                 self.rect.left = 0
  188.                 self.pos.x = self.rect.x
  189.                 self.direction.x *= -1
  190.             if self.rect.right > 1280:
  191.                 self.rect.right = 1280
  192.                 self.pos.x = self.rect.x
  193.                 self.direction.x *= -1
  194.  
  195.         if direction == 'vertical':
  196.             if self.rect.top < 0:
  197.                 self.rect.top = 0
  198.                 self.pos.y = self.rect.y
  199.                 self.direction.y *= -1
  200.             if self.rect.bottom > 720:
  201.                 self.rect.bottom = 720
  202.                 self.pos.y = self.rect.y
  203.                 self.direction.y *= -1
  204.  
  205.     def update(self,dt):
  206.         self.old_rect = self.rect.copy()
  207.  
  208.         if self.direction.magnitude() != 0:
  209.             self.direction = self.direction.normalize()
  210.  
  211.         self.pos.x += self.direction.x * self.speed * dt
  212.         self.rect.x = round(self.pos.x)
  213.         self.collision('horizontal')
  214.         self.window_collision('horizontal')
  215.         self.pos.y += self.direction.y * self.speed * dt
  216.         self.rect.y = round(self.pos.y)
  217.         self.collision('vertical')
  218.         self.window_collision('vertical')
  219.  
  220. # general setup
  221. pygame.init()
  222. screen = pygame.display.set_mode((1280,720))
  223.  
  224. # group setup
  225. all_sprites = pygame.sprite.Group()
  226. collision_sprites = pygame.sprite.Group()
  227.  
  228. # sprite setup
  229. StaticObstacle((100,300),(100,50),[all_sprites,collision_sprites])
  230. StaticObstacle((800,600),(100,200),[all_sprites,collision_sprites])
  231. StaticObstacle((900,200),(200,10),[all_sprites,collision_sprites])
  232. MovingVerticalObstacle((200,300),(200,60),[all_sprites,collision_sprites])
  233. MovingHorizontalObstacle((850,350),(100,100),[all_sprites,collision_sprites])
  234. player = Player(all_sprites,collision_sprites)
  235. Ball(all_sprites,collision_sprites,player)
  236.  
  237. # loop
  238. last_time = time.time()
  239. while True:
  240.    
  241.     # delta time
  242.     dt = time.time() - last_time
  243.     last_time = time.time()
  244.    
  245.     # event loop
  246.     for event in pygame.event.get():
  247.         if event.type == pygame.QUIT:
  248.             pygame.quit()
  249.             sys.exit()
  250.  
  251.     # drawing and updating the screen
  252.     screen.fill('black')
  253.     all_sprites.update(dt)
  254.     all_sprites.draw(screen)
  255.  
  256.     # display output
  257.     pygame.display.update()
Advertisement
Add Comment
Please, Sign In to add comment