2017-12-04 11 views
0

파이 게임을 사용하여 타워 방어 게임을 만들고 있습니다. 적의 일을 산란시키고 움직이는 기능. 그러나 첫 번째 적의 이동이 끝나면 다음 적만 움직입니다. 나는 이것이 for 또는 while 루프와 관련이 있다고 가정합니다. 객체가 동시에 움직 이도록 코드를 수정할 수있는 사람.파이 게임 : 하나씩 움직이는 물체

이 기능은 게임의 메인 루프에서 호출됩니다, 이러한 기능을 마지막으로

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) 

:

# 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 

필요한 첫 번째 함수는 하나입니다 이동 적 기능입니다

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 

업데이트


는 그리고 또한 for 내부 while을 사용하기 때문에

+0

같은 것을 할 수 있지만, 얼핏에서 나는 문제는 당신이 모든을 위해, 루프의 내부 display.update()를 호출하는 것이 될 수 있다고 생각 적의 움직임. –

+0

@klutt의 외부로 이동 해보십시오. 원수가 하나씩 이동하기 때문에 제대로 작동하지 않는다고 생각합니다. 단계별로 단계별로 이동할 수 있습니다. –

+0

@JonasGiuro 시도해 보겠습니다. –

답변

1

문제가 시각화에 대한 screenshot 있어요.

for 내부 개체는 작은 단계 만 만들어야하고 while 외부는 for을 여러 번 실행해야합니다.

모든 개체가 대상으로 이동했는지 확인하고 다시 for 루프가 반복되는지 확인하는 방법이 필요합니다.
how_many_moved을 사용하여 모든 적들이 목적지에 있는지 확인합니다.

그것은 내가 파이 게임 사용자 아니에요이

# 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

그 일을 했어! 감사 –