0

私は pygame で Android アプリを作成する練習をしていて、古典的なバブル シューターを作ることにしました。プレイヤーが発射した発射体が十分に正確でないという問題に遭遇しました。

def move (self, time_passed):

    x = (math.sin(self.angle) * self.speed) * time_passed
    y = (math.cos(self.angle) * self.speed) * time_passed
    c = self.rect.center
    self.rect.center = (c[0]+x, c[1]+y)

def update(self, screen, time_passed):

    if self.launched:
        if not self.mpos:
            self.mpos = pygame.mouse.get_pos()
            diffx, diffy = (self.mpos[0]-self.rect.center[0],
                            self.mpos[1]-self.rect.center[1])
            self.angle = math.atan2(diffx, diffy)
        self.move(time_passed)

および引数はメイン ループから渡されscreen、明確にするためにtime_passed、Clock クラスの の表示および戻り値です。tick(60)/1000.0

x と y の値を出力すると、move()非常に正確です: x: 1.0017224084 y: -21.9771825359、またはマウスの位置に応じて同様のものになります。ただし、pygame または move_ip は整数でのみ機能するようです。1.00000001 と 1.9999999 の間をクリックすると、ボールは 1 (x 座標を基準) である正確な場所に発射されます。これは私のゲームにとって悪いことです。オブジェクトを非常に正確に動かすことができるように、これに対する解決策はありますか?

編集: 間違ったコードを貼り付けたことに気付きました。self.rect.center = (c[0]+x, c[1]+y)あるself.rect.move_ip(x, y)べき場所です。ただし、どちらの方法でも同じ結果が得られます。

4

1 に答える 1

5

正確な値を使用して自分の位置を追跡し、をフレームからフレームへfloat段階的に移動する代わりに、フレームごとに適切な (整数化された) 位置に配置します。Rectそうすれば、各フレームの丸め誤差の合計に苦しむことはありませんが、その代わりに、常に 1 つの丸めのみが関与します。

于 2013-05-10T05:14:09.440 に答える