2010-11-01 52 views
2

我目前正在PyGame中製作2D橫向滾動run'n'jump平臺遊戲。大多數的東西工作正常,事實上 - 我利用快速pyGame Sprite對象組。Pygame:使用滾動級別更新Reces

我想知道的是人們通常如何處理滾動遊戲的Rects。我顯然有一個比可見區域大得多的等級,玩家,敵人,子彈等都有自己的(x,y)座標來描述他們在關卡中的位置。

但是現在,由於我們使用「spriteGroup.draw(surface)」調用,它不會將它們顯示在正確的位置,除非每個對象Rects已經被調整,以便右邊的部分顯示在屏幕上。換句話說,每次玩家/敵人/子彈/其他任何更新時,都需要傳遞相機信息,以便更新其Rect。

這是最好的方法使用?它可以工作,但我並不喜歡在每次更新時將相機信息傳遞給每個對象以抵消Rects。很明顯理想的方法(我認爲)是使用具有「真實」座標的Rects,將所有事物都投射到與水平相同的緩衝區,然後將可見部分投射到屏幕上,但在實踐中會減慢比賽下來很多。

任何意見/見解將不勝感激。

謝謝

+0

我從不超過地圖的極限運動使用Pygame,但我假設你可以使用翻譯矩陣將所有內容保存在「真實」座標中,而無需創建像關卡一樣巨大的緩衝區。 – Doggett 2010-11-01 23:41:58

+0

嗯,不是真的,這是重點。 Pygame可以讓你一次畫出許多精靈,但不會讓你轉換它們的座標。 – RedCap 2010-11-02 02:30:56

+0

[添加滾動到平臺遊戲中的pygame]可能的重複(http://stackoverflow.com/questions/14354171/add-scrolling-to-a-platformer-in-pygame) – sloth 2015-09-11 07:33:16

回答

1

您可以擴展德Sprite.Group,以便它recive相機信息。 然後執行以下其中一個選項: A.覆蓋更新方法,以便更新每個精靈的屏幕座標。 B.重寫繪製方法,以便更新每個精靈的屏幕座標,然後調用其父繪製方法。

我認爲它更簡單,更清潔。

0

我真的不喜歡通過攝像頭信息,以每一個 對象在每一次更新,以抵消Rects。

攝像頭可能是全局的,或者是全局Game()類實例的成員。然後你的精靈類的繪製方法不需要參數。

您可以覆蓋繪製自己,所以它的作用:

dest = game.camera.topleft + self.rect.topleft 
screen.blit(self.surface, dest) 

這樣可以使子彈的RECT在世界座標,但使用的屏幕座標位塊傳輸。

0

我發現的一種方法是跟蹤一個scrollx和一個滾動條。然後,只需添加scrollx並在移動矩形時將y滾動到座標。

0

可以有2個變量level_llevel_d內見你身在何處的水平,然後檢查這些精靈是在可見光區域
level_d+heightlevel_l+width
並繪製在屏幕上。

0

最簡單的方法來做到這一點是這樣的:

創建CameraX和CameraY變量,並在屏幕上使用您的blit對象是:

blit(surface, (x -CameraX, y -CameraY)) 

是被受任何對象相機應該可以得出這樣的,但請記住,有一些你可能要保持uneffected(如健康棒或狀態窗口)

只要記住每次要移動相機的對象,這

#Move Camera Right 
CameraX += 10 
#Move Camera Left 
CameraX -= 10 
#Move Camera Down 
CameraY += 10 
#Move Camera Up 
CameraY -= 10 

請記住,如果他們得到負值,它們可能無法正常工作,還必須定義可能一些限制(你不想你的相機