2016-04-19 15 views
0

回転するタレットを作成しようとしています。タレットが正しく回転するという問題は、私がスペースバーを使ってタレットを撮影するときに、弾丸があらゆる角度で同じサイズまたは形状ではないということです。私は、砲台が向き合っている角度を使っていくつかの三角計算を行い、弾丸(円である)を作るために必要な2つの角の点を見つけました。私が試したことはありません。ここでは、コードは次のようになります。角を任意の角度で作成する

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度)を使うと思っていたでしょう。

また、2番目のコーナーの「半径」を大きくする必要があります。私は+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ステップを「見逃す」ステップを実行してから、周りを折り返すことはありません。

関連する問題