0

私は自分のキャラクターをpygameで撃とうとしています。弾丸を彼の位置から動かすことができず、画面の端に当たったら止まります。私が望むのは、画面の端に衝突するまで動き続けることです。次のコードを実行すると、クラッシュします。

class BULLET(pygame.sprite.Sprite):
def __init__(self, speed, location):
    self.pos = [0,0]
    pygame.sprite.Sprite.__init__(self)
    self.image = SHOWBULLET
    self.rect = self.image.get_rect()
    self.rect.left, self.rect.top = location
    self.rect.center = location
    self.speed = speed
def move(self):
    if AMMO > 0:
        if event.type == pygame.MOUSEBUTTONDOWN and Gun.image == NOGUN:
            held_down = True
            if held_down == True:
                self.rect.centerx = Player.rect.centerx
                self.rect.centery = Player.rect.centery
                if Player.direction == 0:
                    self.direction = 0
                    while self.rect.top >= screen.get_rect().top:
                        self.rect.top = self.rect.top + 20
                        if self.rect.top <=   screen.get_rect().top:
                            break
4

2 に答える 2

1

このようにゲームを構築したいと思うと思います。これは私が関連性があると思ったものを含む短縮版であり、いくつかの問題がありますが、本質的には

  • 弾丸が発射された後、弾丸はプレーヤーをまったく気にするべきではありません。
  • 弾丸は、HoldMouseButton イベントの時点でプレイヤーが立っていた場所から開始する必要があります。その後、途切れることなくパスを続行する必要があります。
  • マウスを長押しすると、プレイヤーにたくさんの弾丸を発射してもらいたいと思います。あなたの現在のコードはそうではないと思います。実際、弾丸は、画面上を移動するのに役立つ TickEvents 以外のすべてのイベントを気にする必要があります。一方、プレイヤーはマウス ボタンが押されていることに注意し、マウス ボタンが押されている間は弾丸を発射する必要があります。
  • さらに、MVC アーキテクチャについて少し学ぶことも役立つかもしれません。この基本的なチュートリアルをご覧ください

お役に立てれば。

class Bullet:
    def __init__(self, velocity, start_position):
        self.pos = start_position
        self.velocity = velocity
        self.visible = True

    def notify(self, event):
        if isinstance(event, TickEvent):
            self.move(event.time_passed)

    def move(self, time):
        self.pos += velocity * time

class Charactor:
    def __init__(self, position, event_manager, sprite_manager, etc.):
        self.state = 'MOVING'
        self.pos = position
        self.direction = direction

    def notify(self, event):
        if isinstance(event, HoldMouseButtonEvent()):
            self.state = 'SHOOTING'
        elif isinstance(event, ReleaseMouseButtonEvent()):
            self.state = 'MOVING'
        elif isinstance(event, TickEvent()):
            if self.state == 'SHOOTING':
                self.shoot()
            elif self.state == 'MOVING':
                self.move()

    def shoot(self):
        sprite_manager.add(Bullet(BULLET_VELOCITY * self.direction, self.pos))
于 2013-06-26T15:29:56.623 に答える
0

move 関数は、プレーヤーに関係するすべてを無視する必要があります。それをゼロから始めてください。ティックごとに位置を更新し(おそらくmove()すべてのティックを呼び出すことによって)、独自の方向に進み、壁/エッジとの衝突をチェックする必要があります

初期化方法を修正しました

def __init__(self, speed, location, direction):
    self.pos = location
    pygame.sprite.Sprite.__init__(self)
    self.image = SHOWBULLET
    self.rect = self.image.get_rect()
    self.rect.left, self.rect.top = location
    self.rect.center = location
    self.speed = speed
    self.direction = direction

あなたの移動方法は、おそらく最初からやり直す必要があります

move メソッドには 2 つの部分があるはずです。

1) 箇条書きを目的の方向に 1 つずつ移動します。

if (direction == 0) {
    self.pos = newPosition; // replace new position with a calculation for up
} else if (direction == 1) {
    self.pos = newPosition; // this new position should be one increment right
} etc...

2) 弾丸が画面からはみ出していないか確認する

if (self.pos[0] > width || self.pos[0] < 0 || self.pos[1] > height || self.pos[1] < 0) {
    //return false;
}

return true;
于 2013-06-26T14:24:05.523 に答える