我正在尝试创建一个旋转炮塔。炮塔正确旋转问题是当我用空格键进行炮塔射击时,子弹在每个角度都没有相同的大小或形状。我尝试使用炮塔所面对的角度进行一些三角形计算,并找到创建子弹所需的两个角点(这是一个圆圈)。我尝试过的任何东西都不会起作用。这是代码:
Barrel = [260,210,270,210,270,170,260,170]
def RotateBarrel():
global angle
angleChange = 2
mountCenterX = 265
mountCenterY = 215
#Rotate Barrel
cycle = 1
while cycle < len(Barrel):
x = Barrel[cycle-1]-mountCenterX
y = Barrel[cycle]-mountCenterY
Barrel[cycle-1] = (x*math.cos(angleChange*math.pi/180)-y*math.sin(angleChange*math.pi/180))+mountCenterX
Barrel[cycle] = (x*math.sin(angleChange*math.pi/180)+y*math.cos(angleChange*math.pi/180))+mountCenterY
cycle += 2
angle += angleChange
if angle == 360: angle = 0
canvas.coords(barrel,Barrel)
self.after(1,RotateBarrel)
def SpinningShoot(event):
global angle
speed = 10
shotXpos = Barrel[6]+10*(math.cos(angle*math.pi/180))
shotYpos = Barrel[7]-10*(math.sin(angle*math.pi/180))
cornerX = Barrel[6]+10*(math.cos((90-angle)*math.pi/180))
cornerY = Barrel[7]-10*(math.sin((90-angle)*math.pi/180))
shot = canvas.create_oval(shotXpos,shotYpos,cornerX,cornerY,fill="white")
Xmotion = speed*math.cos(angle*math.pi/180)
Ymotion = speed*math.sin(angle*math.pi/180)
Shots.append(shot)
ShotsPos.append(shotXpos)
ShotsPos.append(shotYpos)
ShotsMotion.append(Xmotion)
ShotsMotion.append(Ymotion)
答案 0 :(得分:0)
在我看来你的镜头不会以“镜筒”为中心,但使用(90度角)的计算将为你提供一个角度宽度
角度 - (90°角)
是2 *角度 - 90
(即根据角度的大小拍摄会更宽)。
我会想到使用(角度 - 45)和(角度+ 45),所以你的镜头始终是相同的角度宽度,并以枪管为中心。
您还需要增加第二个角落的“半径”。我对+10和-10感到困惑,不太确定他们会做什么。
可能更好的方法是计算子弹的“中心”,然后从中心绘制圆心。我确定会有一个以中心和半径为中心的功能。
radius=10
centrex= radius * cos ( angle * math.pi /180 )
centrey= radius * sin ( angle * math. pi / 180 )
然后将这两个和一个半径传递给一个圆圈的函数
另一件小事,我建议改变这条线
if angle == 360: angle = 0
到
if angle >= 360: angle = angle-360
好像角度被初始化为除了偶数之外的其他任何东西,或者你改变了角度步长,你可以“错过”360,然后再也不会回绕。