【发布时间】:2021-12-10 02:23:02
【问题描述】:
import time
from tkinter import *
import random
class SpaceField:
def __init__(self):
self.window = Tk()
self.window.title("Asteriods")
self.canvas = self.canvas_display() #creates canvas
self.asteriods = self.asteriod_creation_seperation() #creates asteroids
self.active = True
self.move_active() #Moves asteroids
self.canvas.update()
def asteriod_creation_seperation(self): #creation of multple asteriods
asteriod_spacingx = random.randint(1,800)
asteriod_spacingy = random.randint(1,800)
asteriod_list = list() # could list([])
for i in range(15):
asteriod = self.canvas.create_oval( 30, 50 , 80 , 100 , tags="asteriod", width=2, outline="white")
asteriod_list.append("asteriod")
self.canvas.move(asteriod, asteriod_spacingx, asteriod_spacingy)
asteriod_spacingx = random.randint(1,500)
asteriod_spacingy = random.randint(1,500)
print(asteriod_spacingy)
return asteriod_list
小行星创造。创建小行星并给它们随机位置。
def asteriod_update(self): #asteriods movement method #MAin problem
x12 = 1
self.canvas.move("asteriod", 3, x12)
pos = self.canvas.coords("asteriod")
print(pos)
if (pos)[2] > 500:
x12 *= 5
我认为这是我需要添加碰撞检测的地方。我只是不知道如何组合圆圈和碰撞的列表。
def move_active(self): #Basically a true loop
if self.active:
self.asteriod_update()
self.window.after(40, self.move_active)
def canvas_display(self): #canvas
canvas = Canvas(self.window, width=500, height=400, background='black')
canvas.pack(expand=True, fill="both")
canvas.update()
return canvas
画布显示没什么特别的
def run(self):
self.window.mainloop()
if __name__ == '__main__':
SpaceF = SpaceField()
SpaceF.run()
【问题讨论】:
-
你想用什么来碰撞这些小行星(通常通过测量这些圆的中心之间的距离是否等于或小于它们的半径之和来检测圆碰撞)?
x12 *= 5也什么都不做,因为该变量是本地变量并且会被垃圾收集,或者你没有显示一些代码,顺便说一句,你应该提供一个 minimal reproducible example(这也是一件) -
我想将小行星与画布边界相撞。就像画布是 600 像素宽一样,我希望小行星在达到极限时反弹回来。抱歉,我是堆栈溢出的新手,谢谢,我会尝试的。 @Matiiss
标签: python list tkinter collision-detection tkinter-canvas