2012-08-11 38 views
0

今天我在pygame上做了一個小平臺遊戲。我從一個非常漂亮和有用的教程中使用了很多代碼,因爲我不知道如何去做。拍一張新地圖

到目前爲止,基於地圖文本部分中的字符,通過處理屏幕的32x32部分併爲其分配塊類型來製作地圖。到目前爲止,我有一個平臺塊,一個邊界塊和一個退出塊,我想最終使遊戲加載一個新的水平。

我的問題是:如果我「擊敗關卡」並想讓遊戲加載新地圖,我該如何去做呢?我嘗試從組中刪除精靈,但我沒有任何運氣。我一直在嘗試一段時間,我有點沮喪。

下面的代碼:

import pygame 
import math 
from pygame import * 

DISPLAY = (800, 640) 
DEPTH = 32 
FLAGS = 0 

def main(): 
    pygame.init() 
    screen = display.set_mode(DISPLAY, FLAGS, DEPTH) 
    display.set_caption("Square2") 
    timer = time.Clock() 

    up = down = left = right = False 
    bg = Surface((32,32)) 
    bg.convert() 
    bg.fill(Color("#000000")) 
    entities = pygame.sprite.Group() 
    player = Player(32,32) 
    platforms = [] 

    x = y = 0 
    level = [ 
    "PPPPPPPPPPPPPPPPPPPPPPPPP", 
    "P      P", 
    "P      P", 
    "P      P", 
    "P      P", 
    "P      P", 
    "P      P", 
    "P      P", 
    "P      P", 
    "P      P", 
    "P      P", 
    "P      P", 
    "P     pp P", 
    "P      P", 
    "P      P", 
    "P   pppppp  P", 
    "P      P", 
    "P pppppp    P", 
    "P      P", 
    "PPPPPPPPPPPPPPPPPPPPPPPPP", 
      ] 

    #builds the level 
    for row in level: 
     for col in row: 
      if col =="p": 
       p = Platform(x, y) 
       platforms.append(p) 
       entities.add(p) 
      if col == "E": 
       e = ExitBlock(x, y) 
       platforms.append(e) 
       entities.add(e) 
      if col == "P": 
       P = Border(x, y) 
       platforms.append(P) 
       entities.add(P) 
      x += 32 
     y += 32 
     x = 0 
    entities.add(player) 

    while 1: 
     timer.tick(60) 
     for e in pygame.event.get(): 
      if e.type == QUIT: 
       pygame.quit() 
       sys.exit() 
       #raise SystemExit, "ESCAPE" 
      if e.type == KEYDOWN and e.key == K_ESCAPE: 
       pygame.quit() 
       sys.exit() 
       #raise SystemExit, "ESCAPE" 
      if e.type == KEYDOWN and e.key == K_UP: 
       up = True 
      if e.type == KEYDOWN and e.key == K_DOWN: 
       down = True 
      if e.type == KEYDOWN and e.key == K_RIGHT: 
       right = True 
      if e.type == KEYDOWN and e.key == K_LEFT: 
       left = True 


      if e.type == KEYUP and e.key == K_UP: 
       up = False 
      if e.type == KEYUP and e.key == K_DOWN: 
       down = False 
      if e.type == KEYUP and e.key == K_RIGHT: 
       right = False 
      if e.type == KEYUP and e.key == K_LEFT: 
       left = False 

     #draw bg 
     for y in range(20): 
      for x in range(25): 
       screen.blit(bg, (x * 32, y * 32)) 

     #update player, draw everything else 
     player.update(up, down, left, right, platforms) 
     entities.draw(screen) 

     pygame.display.flip() 

class Entity(pygame.sprite.Sprite): 
    def __init__(self): 
     pygame.sprite.Sprite.__init__(self) 

class Player(Entity): 
    def __init__(self, x, y): 
     Entity.__init__(self) 
     self.xvel = 0 
     self.yvel = 0 
     self.onGround = False 
     self.image = Surface((32, 32)) 
     self.image.convert() 
     self.image.fill(Color("#FF0000")) 
     self.rect = Rect(x, y, 32, 32) 

     self.reset(150, 400) 

    def reset(self,x,y): 
     self.x = x 
     self.y = y 

     self.rect.center = (self.x, self.y) 

    def update(self, up, down, left, right, platforms): 
     if up: 
      #only jump if on the ground 
      if self.onGround: 
       self.yvel = -8 
     if down: 
      pass 
     if left: 
      self.xvel = -5 
     if right: 
      self.xvel = 5 
     if not self.onGround: 
      #only accelerate wit gravity if in the air 
      self.yvel +=0.3 
      #max falling sapeed 
      if self.yvel > 30: 
       self.yvel = 30 
     if not (left or right): 
      self.xvel = 0 

     # increment in x direction 
     self.rect.left+= self.xvel 
     # x-axis collisions 
     self.collide(self.xvel, 0 , platforms) 
     # increment in y direction 
     self.rect.top +=self.yvel 
     # assuming we're in the air 
     self.onGround = False; 
     # y-axis collisions 
     self.collide(0, self.yvel, platforms) 

    def collide(self, xvel, yvel, platforms): 
     for p in platforms: 
      if sprite.collide_rect(self, p): 
       if isinstance(p, ExitBlock): 
        event.post(event.Event(QUIT)) 
       if xvel > 0: 
        self.rect.right = p.rect.left 
       if xvel < 0: 
         self.rect.left = p.rect.right 
       if yvel > 0: 
        self.rect.bottom = p.rect.top 
        self.onGround = True 
        self.yvel = 0 
       if yvel < 0: 
        self.rect.top = p.rect.bottom 
        self.yvel = 0 
        # Player.rect.top = Player.rect.top 


class Platform(Entity): 
    def __init__(self, x, y): 
     Entity.__init__(self) 
     self.image = Surface((32, 32)) 
     self.image.convert() 
     self.image.fill(Color("#DDDDDD")) 
     self.rect = Rect(x, y, 32, 32) 

     def update(self): 
      pass 

class Border(Entity): 
    def __init__(self, x, y): 
     Entity.__init__(self) 
     self.image = Surface((32, 32)) 
     self.image.convert() 
     self.image.fill((0,0,0)) 
     self.rect = Rect(x, y, 32, 32) 

     def update(self): 
      pass 

class ExitBlock(Platform): 
    def __init__(self, x, y): 
     Platform.__init__(self, x, y) 
     self.image.fill(Color("#0033FF")) 



main() 

在此先感謝您的幫助!

+1

你正在討論你的遊戲設計錯誤。太多的遊戲是硬編碼的。添加一個'loadLevel'方法。 – 2012-08-12 00:21:31

+0

好的,我會嘗試使loadLevel方法更加「軟編碼」。謝謝! – user1592807 2012-08-12 01:04:27

+0

另外我注意到,在你的主循環中,你有一個if語句的_ton_評估幾乎完全一樣的東西。你可以非常容易地創建一個字典'key_dict = {K_UP:False,K_DOWN:False,K_RIGHT:False,K_LEFT:False}',而不是檢查每個值do if e.type == KEYDOWN和key_dict中的e.key :key_dict [e.key] = True'。使用這些模式將會1)減少你編寫的代碼的數量,2)使你的代碼更可讀,更容易修改。 – 2012-08-12 01:14:31

回答

0

創建一個算法來隨機創建一個可行的級別並輸出可讀的級別字符串。自動將它與邊界對齊,製作一些隨機平臺,以及離玩家最遠的平臺上退出。你甚至可以計算出是否有可能從一個平臺跳到另一個平臺,你可能應該這樣做。要加載你的關卡,只需重新調用main()。此外,實體似乎只是一個精靈的包裝,你可能想保留它,但它似乎只是佔用空間。因爲算法可能會是整個程序中最大的一部分,所以我不會寫一個例子,但是如果您尋找一種方法來加載新的級別或開始算法的位置,這應該可以工作。