2015-01-05 112 views
1

我正在pygame中使用python製作pacman風格的遊戲。目前我正在創造pacman必須避開迷宮的鬼怪/怪物。我創造了這些,並嘗試添加碰撞檢測的隨機移動,以便他們繞過迷宮,而不是遍佈屏幕。這些怪物的代碼是波紋管。我的問題是,Monster似乎略有跳動,幾乎沒有動作,我怎麼能得到,順利通過像pacman鬼迷宮?任何幫助是極大的讚賞。隨機精靈運動和碰撞python

回答

3

我無法在計算機上測試您的代碼,因爲某些原因,python會返回一些錯誤。但讓我分析一下你的代碼。

這個問題似乎是從以下兩行出現:

self.rect.x += random.randint(-1,1) 
self.rect.y += random.randint(-1,1) 

這是你的update(self)功能下面。

由於您將怪物設置爲「更新」每次屏幕刷新,因此每次您致電更新時,怪物會隨機向上,向下,向左或向右移動一個像素。你的「更新」函數每次調用一個從-1到1的隨機數。所以,你的怪物要麼以垂直和水平方向刷新+1或0或-1像素的方式刷新。因此,它們看起來很滑,並且根本不在任何位置移動。

你想要一個平穩的運動是你的「更新」功能移動你的怪物在一個恆定的方向。

我不知道去了解你的遊戲的最佳方式,但這裏是我的建議:(我的代碼只是一個指導性的,可能包含錯誤)

給怪物類變量或屬性稱爲「dir」,代表方向。一旦開始你的類,給予「目錄」從1到4的隨機值(代表上,下,左,右)

self.dir = random.randint(1,4)

然後,在你的「更新(個體經營)」的功能,寫一些if聲明是這樣的:

if self.dir == 1: #Moving up 
    self.rect.y+=1; 

if self.dir == 2: #Moving down 
    self.rect.y-=1; 

if self.dir == 3: #Moving left 
    self.rect.x-=1; 

if self.dir == 4: #Moving right 
    self.rect.x+=1; 

這樣一來,你的怪物只能上下移動,向左或向右一次一個方向。

有了這個,我想你必須修改你的「碰撞檢查」代碼。根據牆上的哪個部分,讓你的代碼改變你的怪物的方向。

希望這會有所幫助! :)

編輯:

你的第二個問題是,你的怪物並沒有與牆壁碰撞正確。這裏是你的代碼:

if self.rect.x > -1: # Moving right; Hit the left side of the wall 
    self.rect.right = wall.rect.left 
if self.rect.x < 0: # Moving left; Hit the right side of the wall 
    self.rect.left = wall.rect.right 
if self.rect.y < -1: # Moving down; Hit the top side of the wall 
    self.rect.bottom = wall.rect.top 
if self.rect.y > 0: # Moving up; Hit the bottom side of the wall 
    self.rect.top = wall.rect.bottom 

我覺得很奇怪,你的支票基於其位置的怪物的方向。以if self.rect.x > -1:爲例。 "self.rect.x"實際上是你的怪物的x座標。所以這並不表示你的怪物的方向。所以我不認爲你可以在你的if陳述中使用self.rect.xself.rect.y進行碰撞。

取而代之,請考慮使用我剛推薦給您的「dir」。 我會改變你的第一行,你可以做它的其餘部分。

if self.dir == 4: # Moving right; Hit the left side of the wall 
self.rect.right = wall.rect.left 

之後,你的怪物將停止,因爲它會嘗試再次朝相同的方向移動,但是這段代碼會停止它。所以,你必須再次隨機地改變方向。只要確保它不再選擇相同的方向。現在我會把它作爲你的一個難題。

編輯2:

你提到你的碰撞不會對頂部和底部的工作。

了一段時間之前,我得到您的錯誤;)

if self.dir == 1: #Moving up 
    self.rect.y+=2; 

if self.dir == 2: #Moving down 
    self.rect.y-=2; 

我想你互換的y+=2y=-2。所以你的上下運動是互換的。

+0

哦,我明白了!是的,精靈現在順利移動謝謝你!由於它有你沒有的圖像,所以它可能不適用於你的圖像,我試圖通過在圖像中添加不同的值來改變碰撞,檢查左側碰撞似乎正常,但沒有其他方向!你能提出任何價值嗎?再次感謝! – alfiej12

+0

爲了方便起見,我已經將整個遊戲添加到了代碼中,如果您將怪物類中的#loadbackground和self.image中的圖像名稱更改爲與代碼具有相同文件的任何圖像,則代碼將起作用好的,再次感謝你! – alfiej12

+0

不,這個錯誤不是關於圖像,因爲我放置了我自己的圖像。錯誤說''super()至少需要1個參數(0給出)「' – Sciffany