2016-04-19 3 views
0

Я пытаюсь создать вращающуюся башню. Револьвер вращается правильно, проблема заключается в том, что я делаю стрельбу из башни с помощью пробела, пуля не имеет одинакового размера или формы под каждым углом. Я попытался использовать угол, с которым турель сталкивается, чтобы выполнить некоторые триггерные вычисления и найти две угловые точки, необходимые для создания пули (которая представляет собой круг). Ничего, что я пробовал, будет работать. Вот код:Создайте квадрат со сторонами под любым углом

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

Мне кажется, что ваш выстрел не будет сосредоточен на «бочке», но расчет с использованием (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 

как если бы угол был инициализирован как что-либо иное, чем четное число, или вы изменили angl шаг вы могли бы «пропустить» 360, а затем никогда не обернуться.

Смежные вопросы