2017-12-04 15 views
0

私はpygameを使ってタワー防衛ゲームを作成しています。そして敵の仕事をうまく動かして動かす機能。しかし、次の敵は、最初の敵が動いたときにのみ動きます。私はこれがforまたはwhileループと関係があると仮定します。オブジェクトが同時に動くように誰が自分のコードを修正できるのでしょうか。Pygame:オブジェクトが1つずつ移動する

この機能は、ゲームのメインループの中で呼び出されます。

# creates and places all of the enemys 
def begin_wave(self): 
    # mark next waves as started 
    self.wave += 1 
    print("Wave number: ", self.wave) 

    ### Draw Enemy ### 
    for enemy in self.enemies: 
     while enemy.waypoints_reached < len(config.WAYPOINTS): 

      # Move enemy 
      enemy.move() 

      # Paint game + new enemy location 
      self.paint(self.screen) 

      # Update Screen 
      pygame.display.update() 

    # if done -> set state to BA_CLEAR 
    print("Wave Completed!") 
    self.waves_comp += 1 
    self.state = config.BA_CLEAR 

必要とされている最初の関数はこの1つである移動敵の関数である:最後に

def move(self): 

    speed = config.DEFAULT_SPEED 

    # Update enemy's location 
    if self.get_position()[0] < self.trackNextWaypoint()[1]: 
     if self.trackNextWaypoint()[1] - self.get_position()[0] >= speed: 
      self.set_position((self.get_position()[0] + speed, self.get_position()[1])) 
     else: 
      self.set_position((self.get_position()[0] + (self.trackNextWaypoint()[1] - self.get_position()[0]), 
         self.get_position()[1])) 

    if self.get_position()[0] > self.trackNextWaypoint()[1]: 
     if self.get_position()[0] - self.trackNextWaypoint()[1] >= speed: 
      self.set_position((self.get_position()[0] - speed, self.get_position()[1])) 
     else: 
      self.set_position((self.get_position()[0] - (self.get_position()[0] - self.trackNextWaypoint()[1]), 
         self.get_position()[1])) 

    if self.get_position()[1] < self.trackNextWaypoint()[2]: 
     if self.trackNextWaypoint()[2] - self.get_position()[1] >= speed: 
      self.set_position((self.get_position()[0], self.get_position()[1] + speed)) 
     else: 
      self.set_position((self.get_position()[0], 
         self.get_position()[1] + (self.trackNextWaypoint()[2] - self.get_position()[1]))) 

    if self.get_position()[1] > self.trackNextWaypoint()[2]: 
     if self.get_position()[1] - self.trackNextWaypoint()[2] >= speed: 
      self.set_position((self.get_position()[0], self.get_position()[1] - speed)) 
     else: 
      self.set_position((self.get_position()[0], self.get_position()[1] - (self.get_position()[1] - self.trackNextWaypoint()[2]))) 

    # If enemy position is on waypoint 
    if self.get_position()[0] == self.trackNextWaypoint()[1] and self.get_position()[1] == self.trackNextWaypoint()[2]: 
     self.setWaypointsReached(1) 

、これらの関数

def trackNextWaypoint(self): 
    for waypoint in config.WAYPOINTS: 
     if waypoint[0] == self.waypoints_reached+1: 
      return waypoint 
      break 

def setWaypointsReached(self, number): 
    self.waypoints_reached += number 

def get_position(self): 
    return self.position 

def set_position(self, position): 
    self.position = position 

更新


そして、私はまた、あなたがforwhileを使用しているため

+0

のようなものかもしれないが、簡単に見てから、私はこの問題は、あなたがすべてのために、forループ内でdisplay.update()を呼び出すこともできると思います敵の動き。 –

+0

@kluttの外に移動してみてください。敵が1つずつ移動するので、実際には動作しないと思います。どのように一緒に動かすことができるのですか? –

+0

@JonasGiuro試してみます –

答えて

1

問題がある、あなたの可視化のためのscreenshotを持っています。

内部オブジェクトforは小さなステップのみを行い、外部whileforを何度も実行する必要があります。

すべてのオブジェクトが宛先に移動されているかどうかを確認し、再度ループを繰り返す必要があります。forループ。
how_many_movedを使用して、すべての敵が目的地にいるかどうかを確認します。

は、それは私がpygameのユーザーではないよ、この

# value bigger than 0 to start `while` loop 
how_many_moved = 1 

while how_many_moved > 0: 

    how_many_moved = 0 

    ### every enemy makes only small step ### 
    for enemy in self.enemies: 
     if enemy.waypoints_reached < len(config.WAYPOINTS): 
      # count how many was moved 
      how_many_moved += 1 

      # Move enemy 
      enemy.move() 

      # Paint game + new enemy location 
      self.paint(self.screen) 

    # Update Screen afer every enemy made small step 
    pygame.display.update() 
+0

それは仕事をした!ありがとう –

関連する問題