2016-12-15 16 views
0

これで一日中働いていて、私はそのロジックを見つけられませんでした。Pygame - 宇宙船を回転させて動かす(ポリゴン)

私は古典的なスタイルの小惑星ゲームを作りたいと思っています。私は宇宙船から始まります。

enter image description here

知っている今、重要な事柄:

import pygame 
import colors 
from helpers import * 

class Ship : 
    def __init__(self, display, x, y) : 
     self.x = x 
     self.y = y 
     self.width = 24 
     self.height = 32 
     self.color = colors.green 
     self.rotation = 0 
     self.points = [ 
      #A TOP POINT 
      (self.x, self.y - (self.height/2)), 
      #B BOTTOM LEFT POINT 
      (self.x - (self.width/2), self.y + (self.height /2)), 
      #C CENTER POINT 
      (self.x, self.y + (self.height/4)), 
      #D BOTTOM RIGHT POINT 
      (self.x + (self.width/2), self.y + (self.height/2)), 
      #A TOP AGAIN 
      (self.x, self.y - (self.height/2)), 
      #C A NICE LINE IN THE MIDDLE 
      (self.x, self.y + (self.height/4)), 
     ] 

    def move(self, strdir) : 
     dir = 0 
     if strdir == 'left' : 
      dir = -3 
     elif strdir == 'right' : 
      dir = 3 

     self.points = rotate_polygon((self.x, self.y), self.points, dir) 

    def draw(self, display) : 
     stroke = 2 
     pygame.draw.lines(display, self.color, False, self.points, stroke) 

船は次のようになります。私は宇宙船の形でいくつかの線を描画してやった

タプル(self.x、self.y)は、宇宙船の真ん中です。どのように私はそれが前方または後方に移動することができます:それは問題があり、キーAとD

def rotate_polygon(origin, points, angle) : 
    angle = math.radians(angle) 
    rotated_polygon = [] 

    for point in points : 
     temp_point = point[0] - origin[0] , point[1] - origin[1] 
     temp_point = (temp_point[0] * math.cos(angle) - temp_point[1] * math.sin(angle), 
         temp_point[0] * math.sin(angle) + temp_point[1] * math.cos(angle)) 
     temp_point = temp_point[0] + origin[0], temp_point[1] + origin[1] 
     rotated_polygon.append(temp_point) 

    return rotated_polygon 

enter image description here

を使用して、コマンドに私が回転するために管理し、この機能(スピン)を使用して

宇宙船が向いている方向に?

OR

どのように私はself.xとself.y値を更新し、self.pointsリスト内でそれらを更新して回転を維持することができますか?

+0

最も単純で効率の低いオプションは、self.xまたはself.yへの更新後にこれらの頂点を単純にすべて再計算することです。 – AndrewGrant

答えて

0

あなたは単に次のことを行うことができるはずです。

2

動きや回転を扱う最も簡単で最も一般的な方法は、ベクトル計算(3Dグラフィックスにも適用可能)を使用することです。船の進行方向を表す2Dベクトルを維持することができます。たとえば、船が上向きになり、(0,0)座標が左上にある場合です。あなたはすることができます。

self.forward = Vector2D(0, -1) # Vector2D(x, y) 

このベクターを回転する必要があります。以下の方法で回転させることができます。

self.forward.x = self.forward.x * cos(angle) - self.forward.y * sin(angle) 
self.forward.y = self.forward.x * sin(angle) + self.forward.y * cos(angle) 

船を移動したいときは、船のポイントをこのベクトルに対して相対的に変換することができます。例えば。

self.x += forward.x * velocity.x 
self.y += forward.y * velocity.y 

いくつかの基本的な操作を行うことができるVector2Dクラスを作成することをお勧めします。

行列に慣れている場合は、線形方程式の代わりに行列を使用してこれらの演算を実装する方が簡単になります。

関連する問題