2009-07-06 21 views
4

我目前面臨的一個設計問題,在我的遊戲設計,並不可怕,但它困擾了我足夠的,所以我想問問別人的意見:-)遊戲設計 - 裝卸獎金/鴨子類型 - 蟒蛇

我目前嘗試pygame,我已經開發了一個小空間射手,現在我想處理一些獎金。

現在我有一個抽象類,獎金從中獲得目前實施的所有獎金:「健康紅利」,這還給一些健康的球員,「死亡獎金」,這降低了玩家的健康1.

在我的遊戲循環這裏是我做的(大約):

def testCollisionBonusBolt(): 
    #bolts are sprites fired by the player that allow him to get the bonuses 
    collisions = pygame.sprite.groupcollide(bonusesGroup, boltsGroup, True, True) 
    for col in collisions: 
     player.bonuses.append(col) 

,並在之後我告訴玩家使用獎金

class Player: 
... 
def useBonuses(self): 
    for bonus in self.bonuses: 
     bonus.use(self) 

直到現在everyt但是我想添加一個「炸彈加值」,當玩家射擊時會爆炸並殺死周圍的敵人。

這個「獎勵」實現了抽象類Bonus的「使用(目標)」方法與其他人一樣,但是我覺得在獎金列表中添加這樣一個獎金是不好的,因爲應該沒有關係它們之間!

獎金背後的概念是,這是「對某事做某事的東西」,以前是我的玩家類的目標,但現在它不是那麼清晰...... 當然不是調用player.useBonuses()在檢測到哪些獎金在哪裏拍攝後,我可以測試類型(使用isinstance),例如獎金,但是在所有關於鴨子打字的討論之後,爲什麼這是pythonic方式,我在想如何管理我的獎金問題?

感謝您閱讀這篇文章,希望大家能幫助我!

問候

+0

炸彈在炸彈上爆炸時,炸彈不會圍繞玩家區域爆炸,而可能在屏幕上的任何地方爆炸,並且絕對與當前玩家的位置無關。 對不起,不清楚。 – attwad 2009-07-07 02:44:10

回答

1

如果你不想一定col進去player.bonuses但在其他地方,使抽象類Bonus一個toplayer法的默認實現:

def toplayer(self, player): 
    player.bonuses.append(self) 

,並覆蓋它bomb bonus類。 (正如你所提到的,你不必繼承,但是如果能讓你輕鬆地重用功能就沒有問題了。)

因此,例如玩家可以擁有屬性bomb,通常爲Nonebomb bonus類可以這樣做:

def toplayer(self, player): 
    player.bomb = self 

而且在時機成熟時採取行動獲得的所有獎金,這可能與

if player.bomb is not None: 
    player.bomb.explode(player.position) 

或類似的開始。

1

我不用python編寫,但這裏是我的建議:用他可以獲得的每種武器(甚至通過獎金獲得)加載你的玩家,並將他通過獎金獲得的那些彈藥設置爲0。當你的玩家拿起一個「炸彈獎勵」(或其他)時,向玩家的炸彈武器添加一個彈藥。這應該很好地工作。

0

我認爲你是在正確的軌道 - 我會說「炸彈獎勵」仍然與玩家對象有關,因爲它會影響玩家周圍的敵人。你只需要執行「炸彈紅利」的use()方法是這樣的:

class BombBonus(Bonus): 
    def use(self, player): 
     assert isinstance(player, Player) 
     # TODO: find all enemies that are close to the player - assuming you 
     # have all enemy objects in a list call 'enemies' 
     global enemies 
     for enemy in enemies: 
      if distance(player.position, enemy.position) < 400: 
      # if the distance between player and an enemy is less than 400 
      # (change this value to your liking), destroy that enemy. 
      enemy.explode() 

你需要制定自己的實施distance()

開發沒有一個詳細的計劃,遊戲意味着你經常要具有幾乎適合你現有對象的新思路,你需要選擇是否使用新功能擴展現有的類,以支持新想法,或創建一套新的課程,因爲你認爲新想法太不同了。在這裏沒有對與錯,只要確保你的想法保持組織的方式對你有意義。

+0

當炸彈爆炸時,炸彈爆炸,它不會在玩家區域周圍爆炸,它可以在屏幕上的任何地方,並且絕對與當前玩家的位置無關,這是我的觀點是說沒有關係這個獎金和玩家之間。 但是你的實現可以用於另一種獎勵,比如盾牌,謝謝:) – attwad 2009-07-07 02:43:10