2012-12-12 79 views
2

我試圖創建這個遊戲,在啓動時將50個精靈添加到屏幕上。如果有任何重疊的精靈試圖創建不重疊的精靈

if self.overlapping_sprites: 
    for sprite in self.overlapping_sprites: 
     self.game.make_obstacles(1, 1400, self.game.speed) 
     self.die() 

這幾乎檢測,併爲每個精靈,它會創建一個新的精靈,並刪除有問題的精靈:這個精靈的__init__功能我有以下。實現這個代碼確實有奇效,但它仍然不完美。加載時肯定還有一些重疊的精靈。哦,我應該提到我正在根據給定的長度隨機創建這些精靈。

以供參考,這是make_obstacles()功能是什麼:

def make_obstacles(self, num, length, dx): 
    for i in range(num): 
     x = random.randrange(700, length) 
     y = random.randrange(10, games.screen.height - 10) 
     size = random.choice([Obstacle.obstacle_1,Obstacle.obstacle_3]) 
     new_obstacle = Obstacle(game = self, x = x, y = y, size = size, dx = dx) 
     games.screen.add(new_obstacle) 

有另一種方式,我應該嘗試在這裏完成我的目標是什麼?我還想弄清楚爲什麼這會在概念層面上發生,以進一步加深我的理解,所以任何幫助都將不勝感激。

回答

1

明顯的解決方案?

我不是pygame的專家;但我想我已經找出了問題所在。儘管如此,我可能完全沒有辦法,因爲我不確定代碼的其餘部分。

您正在第一塊代碼中製造障礙,然後不檢查這些障礙物的精靈是否與其他精靈發生碰撞!你只是檢查它們是否在第一個代碼塊中碰撞;並且此代碼塊不會在第二次創建的障礙物上運行。

要測試我是否正確,請嘗試在第一個代碼塊中刪除self.game.make_obstacles調用,以便只刪除衝突精靈而不是重新創建。現在,檢查是否有任何精靈碰撞。

現在我們已經建立了一個沒有,設置重寫您的代碼。對於我來說,構建這個的方式似乎有點做作 - 我曾經爲GameMaker編寫這樣的代碼。我覺得編寫這段代碼的更好的方法是重寫你的方法,以便在放置障礙之前檢查碰撞。有一個while循環這樣說

def make_obstacles(self, num, length, dx): 
    for i in range(num): 
     while True: 
      x = random.randrange(700, length) 
      y = random.randrange(10, games.screen.height - 10) 
      size = random.choice([Obstacle.obstacle_1,Obstacle.obstacle_3]) 
      if is_empty(x, y, size): 
       break 
     new_obstacle = Obstacle(game = self, x = x, y = y, size = size, dx = dx) 
     games.screen.add(new_obstacle) 

is_empty基本上是一個布爾表達式的值爲true時Xÿ爲空障礙大小(即,沒有衝突會導致將一個物體)並且在x,會與已經存在的障礙物碰撞時評估爲假。用一個布爾表達式替換is_empty,它執行它應該做的事情。

請注意,這可能會導致一個永不停止運行的循環!如果遊戲畫面充滿障礙,解釋者將繼續評估的內容,而True:循環直到expected end of the universe。這意味着你需要確保屏幕上沒有太多障礙物,或者在放棄之前只需要嘗試一定次數。(:與在範圍X(10000):在後一種選擇的情況下,而真正的替代或其他一些適當的數字)

我希望這解決了這個問題;如果您需要任何幫助,請在下面評論!

+0

哦,我可以看到我的邏輯失敗了。它看起來像is_empty聽起來正是我所需要的。 但是,似乎我無法讓它起作用,搜索後幾乎找不到它的文檔。這是否會在1.7以後的版本中引入? – user161592

+0

好吧,我想我現在意識到這是一個我需要寫的函數。希望我能弄清楚這一點。我們將看到!謝謝! – user161592