Pythonクラッシュコース、第2版。横向きのシューティングゲーム。エイリアンは、一番上の行が一番下に当たるまで下に移動し続けます

ベジ

こんにちは私は横向きのシューティングゲームをスピードアップするために取り組んでいます。しかし、エイリアンの艦隊を左下に移動しようとすると、問題が発生しました。を設定しましたself.rect.bottom >= screen_rect.bottomしかし、このコードは私の一番上の列のエイリアンにのみ反応します。代わりに数値を設定してみましたが、期待した結果が得られませんでした。どんな助けでも大歓迎です。

これはエイリアンのための私のコードです:

alien.py

def check_edges(self):
    """Return True if alien is at edge of screen."""
    screen_rect = self.screen.get_rect()
    if self.rect.bottom >= screen_rect.bottom or self.rect.top <= 0:
        return True

def update(self):
    """Move the alien up or down."""
    self.y += (self.settings.alien_speed *
                    self.settings.fleet_direction)

    self.rect.y = self.y

とalien_invasion.pyで

def _update_aliens(self):
    """
    Check if the fleet is at an edge,
      then update the positions of all aliens in the fleet.
    """
    self._check_fleet_edges()
    self.aliens.update()


def _create_fleet(self):
    """Create the fleet of aliens."""
    # Create an alien and find the number of aliens in a row.
    # Spacing between each alien is equal to one alien height.
    alien = Alien(self)
    alien_width = alien.rect.width
    
    alien_height = alien.rect.height
    
    # Determine the number of  rows of aliens that fit on the screen.
    ship_width = self.ship.rect.width 
    available_space_x = (self.settings.screen_width - 
        (2 * alien_width) + ship_width)
    number_rows = available_space_x // (3 * alien_width)

    
    available_space_y = self.settings.screen_height + (2 * alien_height)
    number_aliens_y = available_space_y // (2 * alien_height)

    # Create full fleet of aliens.
    for alien_number in range(number_aliens_y):
        for row_number in range(number_rows):
            self._create_alien(alien_number, row_number)
        
def _create_alien(self, alien_number, row_number):
    """Create an alien and place it in the row."""
    alien = Alien(self)
    alien_width = alien.rect.width
    alien_height = alien.rect.height

    alien.rect.x = 1200 - (2 * alien_width) - (2 * alien.rect.width) * row_number
    
    alien.y = alien_height + 2 * alien_height * alien_number
    alien.rect.y = alien.y
    self.aliens.add(alien)

def _check_fleet_edges(self):
    """Respond appropriately if any aliens have reached an edge."""
    for alien in self.aliens.sprites():
        if alien.check_edges():
            self._change_fleet_direction()
            break

def _change_fleet_direction(self):
    """Drop the entire fleet and change the fleet's direction"""
    for alien in self.aliens.sprites():
        alien.rect.x -= self.settings.fleet_left_speed
    self.settings.fleet_direction *= -1
Rabbid76

あなたのforループは最初のエイリアンの直後に壊れます。

for alien in self.aliens.sprites():
   if alien.check_edges():
       self._change_fleet_direction()
   break

breakステートメントは、-ステートメントのコードブロック内にある必要がありますifインデントの問題です

for alien in self.aliens.sprites():
    if alien.check_edges():
        self._change_fleet_direction()
        break

コードをより堅牢にすることをお勧めします。エイリアンが頂点に達した場合、新しい艦隊の方向は下向きになります。エイリアンが底に達した場合、新しい艦隊の方向は上向きになります。

_set_fleet_direction代わりにメソッドを記述し_change_fleet_directionます。このメソッドにはdirection、新しい方向を示すパラメーターがあります。引数は、下向きの場合は1、上向きの場合は-1でなければなりません。newfleet_directionは、現在の絶対値(abs(x))に新しい方向を掛けて計算できます

def _set_fleet_direction(self, direction):
    self.settings.fleet_direction = abs(self.settings.fleet_direction) * direction

範囲チェックに応じて方向を設定します。

def _check_fleet_edges(self):
    """Respond appropriately if any aliens have reached an edge."""

    screen_rect = self.screen.get_rect()
    for alien in self.aliens.sprites():

        if alien.top <= screen_rect.top:
            self._set_fleet_direction(1)  # new direction is down
            break

        elif alien.bottom >= screen_rect.bottom
            self._set_fleet_direction(-1) # new direction is up
            break

この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。

侵害の場合は、連絡してください[email protected]

編集
0

コメントを追加

0

関連記事

Related 関連記事

ホットタグ

アーカイブ