Advertisement
Chl_Snt

Window Game

Oct 26th, 2023
38
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 3.40 KB | None | 0 0
  1. import math
  2. import time
  3. import tkinter as tk
  4.  
  5.  
  6. class Hero:
  7. def __init__(self, canvas: tk.Canvas):
  8. self.canvas = canvas
  9. self.id = canvas.create_oval(80, 80, 120, 120, fill="red")
  10.  
  11.  
  12. def shoot(self, event, main):
  13. fireball = Fireball(self.canvas, self.id, event)
  14. main.fireballs.append(fireball)
  15.  
  16.  
  17. class Fireball:
  18. def __init__(self, canvas: tk.Canvas, master, event):
  19. self.speed_x, self.speed_y = 0, 0
  20. self.canvas = canvas
  21. self.size = 34
  22. master_pos = canvas.coords(master)
  23. self.id = canvas.create_oval(master_pos[0], master_pos[1], master_pos[2] - self.size,
  24. master_pos[3] - self.size, fill='yellow')
  25.  
  26. vector = event.x - master_pos[0], event.y - master_pos[1]
  27. len_v = math.sqrt(vector[0] ** 2 + vector[1] ** 2)
  28. vector = vector[0] / len_v, vector[1] / len_v
  29.  
  30. self.speed_x = vector[0] * 5
  31. self.speed_y = vector[1] * 5
  32.  
  33. def update(self):
  34. self.canvas.move(self.id, self.speed_x, self.speed_y)
  35.  
  36.  
  37. class MainWindow:
  38. def __init__(self):
  39. self.x, self.y, self.w, self.h = 100, 100, 200, 200
  40. self.root = tk.Tk()
  41. self.root.resizable(False, False)
  42. self.root.geometry(f'{self.w}x{self.h}+{self.x}+{self.y}')
  43. self.canvas = tk.Canvas(self.root, width=self.w, height=self.h, bg="black")
  44. self.canvas.pack()
  45. self.hero = Hero(self.canvas)
  46. self.fireballs = []
  47. self.speed_x, self.speed_y = 0, 0
  48.  
  49. self.root.bind_all("<Button-1>", lambda event: self.hero.shoot(event, self))
  50. self.root.bind_all("<B3-Motion>", self.move)
  51. self.root.bind_all("<ButtonRelease-3>", self.stop)
  52.  
  53. def update(self):
  54. self.root.geometry(f'{self.w}x{self.h}+{self.x}+{self.y}')
  55. self.canvas.config(width=self.w, height=self.h)
  56. self.x += self.speed_x
  57. self.y += self.speed_y
  58. self.x = int(self.x)
  59. self.y = int(self.y)
  60.  
  61. def draw(self):
  62. """Обрисовывать на холсте игру"""
  63. self.hero = Hero(self.canvas)
  64. for fb in self.fireballs:
  65. fb.update()
  66. result = self.check_contact(fb)
  67. if result == "delete":
  68. self.canvas.delete(fb.id)
  69. self.fireballs.remove(fb)
  70.  
  71.  
  72. def check_contact(self, fb: Fireball):
  73. x, y, w, h = self.canvas.coords(fb.id)
  74. if x >= self.w:
  75. self.w += 10
  76. return "delete"
  77. if x <= 0:
  78. self.x -= 10
  79. self.w += 10
  80. return "delete"
  81. if y >= self.h:
  82. self.h += 10
  83. return "delete"
  84. if y <= 0:
  85. self.y -= 10
  86. self.h += 10
  87. return "delete"
  88.  
  89. def move(self, event: tk.Event):
  90. master_pos = self.canvas.coords(self.hero.id)
  91. vector = event.x - master_pos[0], event.y - master_pos[1]
  92. len_v = math.sqrt(vector[0] ** 2 + vector[1] ** 2)
  93. vector = vector[0] / len_v, vector[1] / len_v
  94.  
  95. self.speed_x = vector[0] * 6
  96. self.speed_y = vector[1] * 6
  97.  
  98. def stop(self, event):
  99. self.speed_x, self.speed_y = 0, 0
  100.  
  101.  
  102. if __name__ == '__main__':
  103. m = MainWindow()
  104. while True:
  105. time.sleep(0.01)
  106. m.update()
  107. m.draw()
  108.  
  109.  
  110.  
  111. m.root.update()
  112. m.root.update_idletasks()
  113.  
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement