boris-vlasenko

Проверка попадания блока в блок 2

Feb 15th, 2018
317
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Python 11.97 KB | None | 0 0
  1. from tkinter import *
  2. from random import randrange as rnd, choice
  3. from PIL import ImageTk, Image
  4. import os, sys
  5. import time
  6.  
  7. root = Tk()
  8. width = 900
  9. hight = 600
  10. padding = 50
  11. root.geometry(str(width)+'x'+str(hight)+'+100+100')
  12. canv = Canvas(bg='lightblue')
  13. canv.pack(fill=BOTH,expand=1)
  14.  
  15. '''
  16. прокручивается с миром или центр камеры
  17. останавливает игрока/врагов/пули
  18. можно разрушать (блоки и врагов)
  19. можно толкать (только блоки)
  20. враг (наносит урон)
  21. предмет (можно взять)
  22.  
  23. выносить свойства в отдельный класс только в том случае, если ими обладают и Блоки и Враги
  24. класс Разрушаемый
  25. класс НаносящийУрон поражает прикосновением любой стороны: шипы или враг
  26. класс Анимированный
  27.  
  28. класс Предмет можно взять
  29. класс Предмет2 (нельзя брать)
  30.  
  31. класс Враг(НаносящийУрон, Разрушаемый, Анимированный)
  32.     класс Черепаха, ЛетающаяЧерепаха, Череп и т.д. (виды врагов)
  33. класс Предмет()
  34. класс Монета(Предмет)
  35. класс Ключ(Предмет)
  36. класс Портал(Предмет2)
  37. класс Дверь(Предмет2) (перегородка)
  38. класс Лампа(Предмет2)
  39.  
  40. класс Блок() ограничивает движение
  41. класс РазрушаемыйБлок(Блок, Разрушаемый)
  42. класс ПадающийБлок(Блок)
  43. класс Платформа(Блок)
  44. класс РазрушаемаяПлатформа(Платформа,Разрушаемый)
  45. класс ТолкаемыйБлок(Блок)
  46. '''
  47.  
  48. '''
  49. 1. Блоки неподвижные
  50. 2. Блоки перемещаемые (могут падать)
  51. 3. Блоки разрушаемые
  52. 4. Блоки падающие
  53. 5. Блоки-платформы
  54. 6. Предметы, которые можно собирать (ключи, монеты)
  55. 7. Предметы, с которыми можно взаимодействовать (двери, кнопки)
  56. 8. Враги стоящие на месте
  57. 9. Враги ходящие туда-сюда
  58. 10. Враги летающие туда-сюда
  59.  
  60.  
  61. Объект:
  62.     1. Перемещается вместе с миром
  63.     2. Отрисовывать себя на экране
  64.     3. Пересечение с другими объектами (список)
  65.    
  66. Анимированный объект
  67.  
  68. '''
  69.  
  70. def pointInSegment(x,x1,x2):
  71.     return x1 <= x <= x2
  72.  
  73. def segmentInSegment(x1,x2,xx1,xx2):
  74.     return pointInSegment(x1,xx1,xx2) or pointInSegment(x2,xx1,xx2) or \
  75.     pointInSegment(xx1,x1,x2) or pointInSegment(xx2,x1,x2)
  76.  
  77. def rectInRect(x1,y1,x2,y2,xx1,yy1,xx2,yy2):
  78.     if segmentInSegment(x1,x2,xx1,xx2) and segmentInSegment(y1,y2,yy1,yy2):
  79.         return True
  80.     if segmentInSegment(xx1,xx2,x1,x2) and segmentInSegment(yy1,yy2,y1,y2):
  81.         return True
  82.     return False
  83.  
  84. class Base(object):
  85.     def __init__(self, *args, **kwargs):
  86.         pass       
  87.  
  88. class Object(Base):
  89.     def __init__(self,x,y,**kwargs):
  90.         print('Object')
  91.         self.centerx = x
  92.         self.centery = y
  93.         imagePil = kwargs['images'][0]
  94.         self.w = imagePil.width()
  95.         self.h = imagePil.height()
  96.         self.x1 = x - self.w/2
  97.         self.y1 = y - self.h/2
  98.         self.x2 = self.x1 + self.w
  99.         self.y2 = self.y1 + self.h
  100.         self.imagePil = imagePil
  101.         self.vx = 0
  102.         self.vy = 0
  103.         self.image = canv.create_image(self.centerx,self.centery,image=self.imagePil)
  104.         super().__init__(**kwargs)
  105.         self.update()
  106.    
  107.     def paint(self):
  108.         canv.coords(self.image,self.centerx,self.centery)
  109.        
  110.     def update(self):
  111.         root.after(30,self.update)
  112.         self.paint()
  113.    
  114.     def hittest(self,objects):
  115.         for item in objects:
  116.             nx1 = item.x1+item.vx
  117.             nx2 = item.x2+item.vx
  118.             ny1 = item.y1+item.vy
  119.             ny2 = item.y2+item.vy
  120.  
  121.             nxx1 = self.x1+self.vx
  122.             nxx2 = self.x2+self.vx
  123.             nyy1 = self.y1+self.vy
  124.             nyy2 = self.y2+self.vy
  125.  
  126.             if rectInRect(nx1,ny1,nx2,ny2,nxx1,nyy1,nxx2,nyy2):
  127.                 dx = item.centerx - self.centerx
  128.                 dy = item.centery - self.centery
  129.                 if abs(dy) >= abs(dx):
  130.                     if dy > 0:
  131.                         return 'down'
  132.                     else:
  133.                         return 'up'
  134.                 else:
  135.                     if dx > 0:
  136.                         return 'right'
  137.                     else:
  138.                         return 'left'
  139.                    
  140.                    
  141.                 #~ if segmentInSegment(item.x1+2,item.x2-2,self.x1+2,self.x2-2):
  142.                     #~ if item.y2 > self.y1+2:
  143.                         #~ return 'down'
  144.                     #~ else:
  145.                         #~ return 'up'
  146.                 #~ else:
  147.                     #~ if item.x2 < self.x1:
  148.                         #~ return 'left'
  149.                     #~ else:
  150.                         #~ return 'right'
  151.         return False
  152.  
  153. class MovableObject(Object):
  154.     def __init__(self,x,y,**kwargs):
  155.         print('MovableObject')
  156.         self.g = 1
  157.         super().__init__(x,y,**kwargs)
  158.        
  159.     def update(self):
  160.         self.vy += self.g
  161.         self.centerx += self.vx
  162.         self.centery += self.vy
  163.         self.x1 = self.centerx - self.w/2
  164.         self.y1 = self.centery - self.h/2
  165.         self.x2 = self.x1 + self.w
  166.         self.y2 = self.y1 + self.h
  167.         super().update()
  168.  
  169.  
  170. class Animation():
  171.     def __init__(self,**kwargs):
  172.         print('Animation')
  173.         super().__init__(**kwargs)
  174.         self.images = kwargs['images']
  175.         self.frame = 0
  176.         self.pause = kwargs['pause']
  177.         self.active_animation = True
  178.         self.update_animation()
  179.    
  180.     def update_animation(self):
  181.         if self.active_animation:
  182.             self.frame += 1
  183.             if self.frame >= len(self.images):
  184.                 self.frame = 0
  185.             canv.itemconfig(self.image,image=self.images[self.frame])
  186.             self.paint()
  187.         root.after(self.pause,self.update_animation)
  188.  
  189.        
  190. class Player(MovableObject,Animation):
  191.     def __init__(self,x,y,**kwargs):
  192.         print('Player')
  193.         self.keys = set()
  194.         super().__init__(x,y,**kwargs)
  195.         self.bullets = []
  196.         self.points = 0
  197.         self.can_jump = True
  198.    
  199.     def pickup_coin(self,coin):
  200.         self.points += self.value
  201.        
  202.     def shot(self,vx,vy):  
  203.         self.bullets.append(Bullet(self.x,self.y,vx,vy))
  204.    
  205.     def update(self):
  206.         self.vx = 0
  207.         #~ self.vy = 0
  208.         if 'left' in self.keys:
  209.             self.vx = -5
  210.         if 'right' in self.keys:
  211.             self.vx = +5
  212.         if 'down' in self.keys:
  213.             self.vy = +5
  214.         #~ if 'jump' in self.keys:
  215.             #~ self.vy = -5
  216.         if 'jump' in self.keys:
  217.             if self.can_jump:
  218.                 self.can_jump = False
  219.                 self.vy = -20
  220.         super().update()
  221.         #~ if self.centerx > 600:
  222.             #~ dx = 600 - self.centerx
  223.             #~ self.centerx = 600
  224.             #~ for item in world:
  225.                 #~ item.centerx += dx
  226.                 #~ item.paint()
  227.         #~ if self.centerx < 300:
  228.             #~ dx = 300 - self.centerx
  229.             #~ self.centerx = 300
  230.             #~ for item in world:
  231.                 #~ item.centerx += dx
  232.                 #~ item.paint()
  233.  
  234. class Bullet():
  235.     def __init__(self,x,y,vx,vy):
  236.         self.x = x
  237.         self.y = y
  238.         self.r = 3
  239.         self.w = self.r
  240.         self.h = self.r
  241.         self.vx = vx
  242.         self.vy = vy   
  243.         self.g = 1
  244.         self.active = True
  245.         self.id = canv.create_oval(self.x-self.r,self.y-self.r,self.x+self.r,self.y+self.r,fill='gray')
  246.         self.update()
  247.    
  248.     def update(self):
  249.         self.vy += 0.8
  250.         self.y += self.vy
  251.         self.x += self.vx
  252.         canv.coords(self.id,self.x-self.r,self.y-self.r,self.x+self.r,self.y+self.r)   
  253.         for enemy in enemies:
  254.             if self.x-enemy.r <= enemy.x <= self.x+self.w+enemy.r and self.y-enemy.r <= enemy.y <= self.y + self.h + enemy.r:  
  255.                 enemy.kill()
  256.                 self.kill()
  257.         if self.active:
  258.             root.after(30,self.update)
  259.        
  260.     def kill(self):
  261.         canv.delete(self.id)
  262.         self.active = False
  263.         if self in player.bullets:
  264.             player.bullets.remove(self)
  265.  
  266. class Enemy():
  267.     def __init__(self,x,y):
  268.         self.starty = 0
  269.         self.x = x+m/2
  270.         self.y = y+m/2
  271.         self.r = 10
  272.         self.vx = -3
  273.         self.vy = 0    
  274.         self.g = 1
  275.         self.active = True
  276.         self.images = []
  277.         self.frame = 0
  278.         for i in range(1,3):
  279.              self.images.append(ImageTk.PhotoImage(Image.open('test' + str(i) + '.png')))
  280.         self.id = canv.create_image(self.x,self.y,image=self.images[0])
  281.         self.anim()
  282.         self.update()
  283.    
  284.     def anim(self):
  285.         print(len(self.images))
  286.         self.frame += 1
  287.         if self.frame == len(self.images):
  288.             self.frame = 0
  289.         canv.itemconfig(self.id,image=self.images[self.frame])
  290.         root.after(150,self.anim)
  291.        
  292.     def paint(self):
  293.         canv.coords(self.id,self.x,self.y-10)  
  294.        
  295.     def update(self):
  296.         self.x += self.vx  
  297.         self.vy += self.g
  298.         self.y += self.vy
  299.         self.paint()
  300.         # ~ if self.x-player.r <= player.x <= self.x+self.r+player.r and self.y-player.r <= player.y <= self.y + self.r + player.r:
  301.             # ~ prevx = player.x - player.vx
  302.             # ~ prevy = player.y - player.vy
  303.             # ~ if prevy+player.r < self.y:
  304.                 # ~ player.vy = 0
  305.                 # ~ player.y = self.y-player.r-1
  306.                 # ~ player.vy = -10
  307.                 # ~ self.kill()
  308.             # ~ else:
  309.                 # ~ pass
  310.         if self.active:
  311.             root.after(30,self.update) 
  312.        
  313.     def kill(self):
  314.        
  315.         canv.delete(self.id)
  316.         world.remove(self)
  317.         enemies.remove(self)
  318.         self.active = False
  319.  
  320. class Block(MovableObject):
  321.     def __init__(self,x,y,**kwargs):
  322.         super().__init__(x,y,**kwargs)
  323.         self.g = 0
  324.         self.vy = 0
  325.         self.vx = 0
  326.        
  327.     def update(self):
  328.         hitside = self.hittest([player])
  329.         dx = 0
  330.         dy = 0
  331.         if hitside:
  332.             print(hitside)
  333.         if hitside == 'up':
  334.             player.vy = 0
  335.             player.centery = self.y1-player.h/2-dy
  336.             player.can_jump = True
  337.         if hitside == 'down':
  338.             player.vy = 0
  339.             player.centery = self.y2 + player.h/2 + dy
  340.             canv.create_rectangle(self.x1,self.y1,self.x2,self.y2)
  341.             canv.create_rectangle(player.x1,player.y1,player.x2,player.y2,outline='orange')
  342.             print(player.vx,player.vy)
  343.            
  344.         if hitside == 'left':
  345.             player.vx = 0
  346.             player.centerx = self.x1 - player.w/2 - dx
  347.         if hitside == 'right':
  348.             player.vx = 0
  349.             player.centerx = self.x2 + player.w/2 + dx
  350.         super().update()
  351.    
  352. class Coin(Object,Animation):
  353.     def __init__(self,x,y,**kwargs):
  354.         super(Coin,self).__init__(x,y,**kwargs)
  355.         self.value = 1
  356.         self.update()
  357.  
  358.     def update(self):
  359.         # ~ if self.hittest([player]):
  360.             # ~ player.pickup_coin(self)
  361.             # ~ self.kill()
  362.         # ~ else:
  363.         root.after(30,self.update)     
  364.            
  365.     def kill(self):
  366.         canv.delete(self.id)
  367.         world.remove(self)
  368.        
  369. blocks = []    
  370. coin_images = []
  371. for i in range(1,4):
  372.     coin_image = Image.open('test'+str(i)+'.png')
  373.     coin_images.append(ImageTk.PhotoImage(image=coin_image))
  374.    
  375. player_images = []
  376. for i in range(1,4):
  377.     player_image = Image.open('test'+str(i)+'.png')
  378.     player_images.append(ImageTk.PhotoImage(image=player_image))
  379.  
  380.  
  381. block_image = Image.open('block.png')
  382. block_image = ImageTk.PhotoImage(image=block_image)
  383.        
  384. player = Player(300,300,images=player_images,pause=150)
  385. f = open('map1.txt','r')
  386. r = 0
  387. x0 = 10
  388. y0 = 10
  389. m = 40
  390.  
  391. world = []
  392. enemies =  []
  393. blocks = []
  394.  
  395. for line in f.readlines():
  396.     c = 0
  397.     for block in line.strip():
  398.         x = x0 + c*m
  399.         y = y0 + r*m
  400.         if block == '1':
  401.             block = Block(x,y,images=[block_image])
  402.             world.append(block)
  403.             blocks.append(block)
  404.         elif block == '2':
  405.             world.append(Coin(x,y,images=coin_images,pause=100))
  406.         elif block == 'x':
  407.             en = Enemy(x,y)
  408.             enemies.append(en)
  409.             world.append(en)
  410.         c += 1
  411.     r += 1
  412.  
  413. f.close()
  414.  
  415. def keyDown(event):
  416.     #~ print(event.keycode)
  417.     if event.keycode == 37  or event.keycode == 113:
  418.         player.keys.add('left')
  419.     if event.keycode == 39  or event.keycode == 114:
  420.         player.keys.add('right')
  421.     if event.keycode == 38  or event.keycode == 111:
  422.         player.keys.add('jump')
  423.     if event.keycode == 40  or event.keycode == 116:
  424.         player.keys.add('down')
  425.  
  426. def keyUp(event):
  427.     if event.keycode == 37 or event.keycode == 113:
  428.         if 'left' in player.keys:
  429.             player.keys.remove('left')
  430.     if event.keycode == 39  or event.keycode == 114:
  431.         if 'right' in player.keys:
  432.             player.keys.remove('right')
  433.     if event.keycode == 38  or event.keycode == 111:
  434.         if 'jump' in player.keys:
  435.             player.keys.remove('jump')
  436.     if event.keycode == 40  or event.keycode == 116:
  437.         if 'down' in player.keys:
  438.             player.keys.remove('down')
  439.            
  440.            
  441. def click(event):  
  442.     vx = (event.x - player.x)/10
  443.     vy = (event.y - player.y)/10
  444.     player.shot(vx,vy)
  445.  
  446.  
  447. canv.bind('<1>',click)
  448. root.bind('<Key>',keyDown)
  449. root.bind('<KeyRelease>',keyUp)
  450.  
  451. mainloop()
Advertisement
Add Comment
Please, Sign In to add comment