Advertisement
boris-vlasenko

Платформер2

Jan 26th, 2018
191
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Python 9.26 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
  5. import time
  6.  
  7. root = Tk()
  8. width = 900
  9. hight = 600
  10. padding = 50
  11. m = 40
  12. root.geometry(str(width)+'x'+str(hight)+'+600+100')
  13. canv = Canvas(bg='white')
  14. canv.pack(fill=BOTH,expand=1)
  15.  
  16. class Player():
  17.     def __init__(self):
  18.         self.starty = 0
  19.         self.bullets = []
  20.         self.rotate = 'right'
  21.         self.x = 300
  22.         self.y = 300
  23.         self.r = m*0.3
  24.         self.vx = 0
  25.         self.vy = 0    
  26.         self.points = 0
  27.         self.score = 0
  28.         self.g = 1
  29.         self.can_shot = True
  30.         self.can_jump = True
  31.         self.id = canv.create_text(850,100,text= self.score,font = "Arial 50")
  32.         self.id = canv.create_oval(self.x-self.r,self.y-self.r,self.x+self.r,self.y+self.r,fill='orange')
  33.         self.keys = set()
  34.         self.move()
  35.    
  36.     def pickup_coin(self,coin):
  37.         player.score += coin.cost
  38.    
  39.     def hittest_enemy(self):
  40.         for enemy in enemies:
  41.             if self.x-enemy.r <= enemy.x <= self.x+self.r+enemy.r and self.y-enemy.r <= enemy.y <= self.y + self.r + enemy.r:          
  42.                 prevx = self.x - self.vx
  43.                 prevy = self.y - self.vy
  44.                 if prevy+self.r < enemy.y:
  45.                     self.vy = 0
  46.                     self.y = enemy.y-self.r-1
  47.                     self.can_jump = True
  48.                     enemy.kill()
  49.                     self.vy = -10
  50.                 elif prevy + self.r > enemy.y + enemy.r:
  51.                     player.hit(enemy)
  52.                 elif prevx+self.r < enemy.x:
  53.                     player.hit(enemy)
  54.                 elif prevx+self.r > enemy.x + enemy.r:
  55.                     player.hit(enemy)
  56.                    
  57.     def hit(self,enemy):
  58.         #print('hit!')
  59.         pass
  60.        
  61.     def shot_pause(self):
  62.         self.can_shot = True
  63.    
  64.     def shot(self):
  65.         if self.can_shot:
  66.             self.can_shot = False
  67.             bullet = Bullet(self.x,self.y,self.rotate)
  68.             world.append(bullet)
  69.             self.bullets.append(bullet)
  70.             root.after(500,self.shot_pause)
  71.    
  72.     def move(self):
  73.         self.vx = 0
  74.         if 'shot' in self.keys:
  75.             self.shot()
  76.         if 'left' in self.keys:
  77.             self.vx = -5
  78.             self.rotate = 'left'
  79.         if 'right' in self.keys:
  80.             self.rotate = 'right'
  81.             self.vx = +5
  82.         if 'jump' in self.keys:
  83.             if self.can_jump:
  84.                 self.can_jump = False
  85.                 self.vy = -20
  86.         self.vy += self.g
  87.         self.x += self.vx
  88.         self.y += self.vy
  89.         if self.y > 550:
  90.             self.y = 550
  91.             self.can_jump = True
  92.         if self.y < 200:
  93.             dy = 200 - self.y
  94.             self.y = 200
  95.             for item in world:
  96.                 item.y += dy
  97.                 item.paint()
  98.         if self.y > 400:
  99.             dy = 400 - self.y
  100.             self.y = 400
  101.             for item in world:
  102.                 item.y += dy
  103.                 item.paint()
  104.         if self.x > 600:
  105.             dx = 600 - self.x
  106.             self.x = 600
  107.             for item in world:
  108.                 item.x += dx
  109.                 item.paint()
  110.         if self.x < 300:
  111.             dx = 300 - self.x
  112.             self.x = 300
  113.             for item in world:
  114.                 item.x += dx
  115.                 item.paint()
  116.         self.hittest_enemy()
  117.         canv.coords(self.id,self.x-self.r,self.y-self.r,self.x+self.r,self.y+self.r)
  118.         root.after(30,self.move)
  119.  
  120.  
  121. class Bullet():
  122.     def __init__(self,x,y,r):
  123.         self.damage = 50
  124.         self.x = x
  125.         self.y = y
  126.         self.r = m/4
  127.         self.vx = 5
  128.         self.active = True
  129.         self.rotate = r
  130.         self.image = ImageTk.PhotoImage(Image.open('bullet.png'))
  131.         self.id = canv.create_image(x,y,image = self.image)
  132.         self.update()
  133.        
  134.     def paint(self):
  135.         canv.coords(self.id,self.x,self.y)
  136.        
  137.     def kill(self):
  138.         canv.delete(self.id)
  139.         root.after_cancel(self.updater)
  140.         self.active = False
  141.         player.bullets.remove(self)
  142.         world.remove(self)
  143.        
  144.    
  145.     def update(self):
  146.         if self.active:
  147.             if self.rotate == 'right':
  148.                 self.x += self.vx
  149.             else:
  150.                 self.x -= self.vx
  151.             self.paint()
  152.             for enemy in enemies:
  153.                 if self.x-enemy.r <= enemy.x <= self.x+self.r+enemy.r and self.y-enemy.r <= enemy.y <= self.y + self.r + enemy.r:          
  154.                     enemy.hit(self)
  155.                     self.kill()
  156.             self.updater = root.after(30,self.update)
  157.        
  158.  
  159.  
  160. class DefulfBlock():
  161.     def __init__(self,x,y,k):
  162.         self.x = x
  163.         self.y = y
  164.         self.w = m
  165.         self.h = m
  166.         self.k = k
  167.         #self.id = canv.create_rectangle(self.x,self.y,self.x+self.w,self.y+self.h,fill='orange')
  168.         #self.label = canv.create_text(self.x+self.w//2,self.y+self.h//2,text= self.k)
  169.         self.image = ImageTk.PhotoImage(Image.open('block.png'))
  170.         self.id = canv.create_image(x+m/2,y+m/2,image = self.image)
  171.         self.update()
  172.    
  173.     def paint(self):
  174.         #canv.coords(self.id,self.x,self.y,self.x+self.w,self.y+self.h)
  175.         #canv.coords(self.label,self.x+self.w//2,self.y+self.h//2)
  176.         canv.coords(self.id,self.x+m/2,self.y+m/2)
  177.        
  178.     def update(self):
  179.         if self.x-player.r <= player.x <= self.x+self.w+player.r and self.y-player.r <= player.y <= self.y + self.h + player.r:        
  180.             #print(self.k)
  181.             prevx = player.x - player.vx
  182.             prevy = player.y - player.vy
  183.             if prevy+player.r < self.y:
  184.                 player.vy = 0
  185.                 ##print('up')
  186.                 player.can_jump = True
  187.                 player.y = self.y-player.r-1
  188.             elif prevy + player.r > self.y + self.h:
  189.                 player.vy = 0
  190.                 player.y = self.y + self.h + player.r+1
  191.                 #print('down')
  192.             elif prevx+player.r < self.x:
  193.                 player.vx = 0
  194.                 player.x = self.x - player.r-1
  195.                 ##print('left')
  196.             elif prevx+player.r > self.x + self.w:
  197.                 player.vx = 0
  198.                 player.x = self.x + self.w + player.r+1
  199.                 #print('right')
  200.        
  201.         for bullet in player.bullets:
  202.             if self.x-bullet.r <= bullet.x <= self.x+self.w+bullet.r and self.y-bullet.r <= bullet.y <= self.y + self.h + bullet.r:
  203.                 bullet.kill()
  204.                
  205.         for enemy in enemies:
  206.             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:          
  207.                 #print(self.k)
  208.                 prevx = enemy.x - enemy.vx
  209.                 prevy = enemy.y - enemy.vy
  210.                 if prevy+enemy.r < self.y:
  211.                     enemy.vy = 0
  212.                     ##print('up')
  213.                     enemy.y = self.y-enemy.r-1
  214.                     enemy.can_jump = True
  215.                 elif prevy + enemy.r > self.y + self.h:
  216.                     enemy.vy = 0
  217.                     enemy.y = self.y + self.h + enemy.r+1
  218.                     #print('down')
  219.                 elif prevx+enemy.r < self.x:
  220.                     enemy.vx = -enemy.vx
  221.                     enemy.x = self.x - enemy.r-1
  222.                     ##print('left')
  223.                 elif prevx+enemy.r > self.x + self.w:
  224.                     enemy.vx = -enemy.vx
  225.                     enemy.x = self.x + self.w + enemy.r+1
  226.                     #print('right')
  227.  
  228.            
  229.         root.after(30,self.update)
  230.        
  231. class Money():
  232.     def __init__(self,x,y,c):
  233.         self.x = x+m/2
  234.         self.y = y+m/2
  235.         self.cost = c
  236.         self.r = 0.2*m
  237.         self.color = '#002EFF'
  238.         if self.cost == 5:
  239.             self.color = '#02FF00'
  240.         if self.cost == 10:
  241.             self.color = '#FFFB00'
  242.        
  243.         #self.id = canv.create_oval(self.x+self.r,self.y+self.r,self.x-self.r,self.y-self.r,fill=self.color)
  244.         #self.label = canv.create_text(self.x,self.y,text=self.cost)
  245.         self.images = []
  246.         for i in range(4):
  247.             self.images.append(ImageTk.PhotoImage(Image.open(str(self.cost) + 'coin' + str(i)+ '.png')))
  248.         self.frame = 0
  249.         self.id = canv.create_image(self.x,self.y,image = self.images[0])
  250.         self.anim()
  251.         self.update()
  252.        
  253.     def anim(self):
  254.         self.frame += 1
  255.         if self.frame >= len(self.images):
  256.             self.frame= 0
  257.         canv.itemconfig(self.id, image = self.images[self.frame])
  258.         root.after(150,self.anim)
  259.        
  260.     def paint(self):
  261.         #canv.coords(self.id,self.x+self.r,self.y+self.r,self.x-self.r,self.y-self.r)
  262.         #canv.coords(self.label,self.x,self.y)
  263.         canv.coords(self.id,self.x,self.y)
  264.        
  265.     def update(self):
  266.         if (player.x - self.x)**2 + (player.y - self.y)**2 < (self.r+player.r)**2:
  267.             player.pickup_coin(self)
  268.             self.kill()
  269.         else:
  270.             root.after(30,self.update)
  271.        
  272.     def kill(self):
  273.         world.remove(self)
  274.         canv.delete(self.id)
  275.         #canv.delete(self.label)
  276.              
  277. class Enemy():
  278.     def __init__(self,x,y):
  279.         self.hp = 100
  280.         self.x = x+m/2
  281.         self.y = y+m/2
  282.         self.r = 15
  283.         self.vx = 3
  284.         self.vy = 0
  285.         self.g= 1
  286.         self.id = canv.create_oval(self.x+self.r,self.y+self.r,self.x-self.r,self.y-self.r,fill='#000000')
  287.         self.update()
  288.        
  289.     def hit(self,bullet):
  290.         #bullet.kill()
  291.         self.hp -= bullet.damage
  292.         if self.hp <= 0 :
  293.             self.kill()
  294.    
  295.     def paint(self):
  296.         canv.coords(self.id,self.x+self.r,self.y+self.r,self.x-self.r,self.y-self.r)
  297.    
  298.     def update(self):
  299.         self.vy += self.g
  300.         self.x += self.vx
  301.         self.y += self.vy
  302.        
  303.         self.paint()
  304.         root.after(30,self.update)
  305.        
  306.     def kill(self):
  307.         world.remove(self)
  308.         enemies.remove(self)
  309.         canv.delete(self.id)
  310.        
  311.        
  312. r = 0
  313. x0 = 10
  314. y0 = 10
  315. m = 40
  316. k = 1
  317. world = []
  318. enemies = []
  319.  
  320.        
  321. player = Player()
  322. f = open('map1.txt','r')
  323. for line in f.readlines():
  324.     c = 0
  325.     for block in line.strip():
  326.         if block == '1':
  327.             x = x0 + c*m
  328.             y = y0 + r*m
  329.             world.append(DefulfBlock(x,y,k))
  330.             k += 1
  331.         if block == '$':
  332.             x = x0 + c*m
  333.             y = y0 + r*m
  334.             world.append(Money(x,y,1))
  335.         if block == '%':
  336.             x = x0 + c*m
  337.             y = y0 + r*m
  338.             world.append(Money(x,y,5))
  339.         if block == '&':
  340.             x = x0 + c*m
  341.             y = y0 + r*m
  342.             world.append(Money(x,y,10))
  343.         if block == '@':
  344.             x = x0 + c*m
  345.             y = y0 + r*m
  346.             en = Enemy(x,y)
  347.             world.append(en)
  348.             enemies.append(en)
  349.             k += 1
  350.         c += 1
  351.     r += 1
  352.  
  353. f.close()
  354.  
  355. def keyDown(event):
  356.     if event.keycode == 32:
  357.         player.keys.add('shot')
  358.     if event.keycode == 37:
  359.         player.keys.add('left')
  360.     if event.keycode == 39:
  361.         player.keys.add('right')
  362.     if event.keycode == 38:
  363.         player.keys.add('jump')
  364.  
  365. def keyUp(event):
  366.     if event.keycode == 32:
  367.         if 'shot' in player.keys:
  368.             player.keys.remove('shot')
  369.     if event.keycode == 37:
  370.         if 'left' in player.keys:
  371.             player.keys.remove('left')
  372.     if event.keycode == 39:
  373.         if 'right' in player.keys:
  374.             player.keys.remove('right')
  375.     if event.keycode == 38:
  376.         if 'jump' in player.keys:
  377.             player.keys.remove('jump')
  378.  
  379.  
  380. root.bind('<Key>',keyDown)
  381. root.bind('<KeyRelease>',keyUp)
  382.  
  383. mainloop()
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement