2014-02-05 55 views
1

你好我是pygame中的新手。我已經使用這個例子:http://pygame.org/project/1061/ 這個例子展示瞭如何從碰撞中進行切換,從列表和移動中創建一個關卡。一個很好的初學者例子。 我已經修改它,所以它應該能夠改變水平。我試圖刪除一旦繪製的rects,但我無法弄清楚。 我有我不能改變的水平在我的代碼的問題:pygame變更級別 - 級別列表

import os 
import random 
import pygame 

# Class for the orange dude 
    class Player(object): 

    def __init__(self, pos): 
     players.append(self) 
     self.rect = pygame.Rect(pos[0], pos[1], 16, 16) 

    def move(self, dx, dy): 

     # Move each axis separately. Note that this checks for collisions both times. 
     if dx != 0: 
      self.move_single_axis(dx, 0) 
     if dy != 0: 
      self.move_single_axis(0, dy) 

    def move_single_axis(self, dx, dy): 

    # Move the rect 
     self.rect.x += dx 
     self.rect.y += dy 

    # If you collide with a wall, move out based on velocity 
     for wall in walls: 
      if self.rect.colliderect(wall.rect): 
       if dx > 0: # Moving right; Hit the left side of the wall 
        self.rect.right = wall.rect.left 
       if dx < 0: # Moving left; Hit the right side of the wall 
        self.rect.left = wall.rect.right 
       if dy > 0: # Moving down; Hit the top side of the wall 
        self.rect.bottom = wall.rect.top 
       if dy < 0: # Moving up; Hit the bottom side of the wall 
        self.rect.top = wall.rect.bottom 

# Nice class to hold a wall rect 
class Wall(object): 

    def __init__(self, pos): 
     walls.append(self) 
     self.rect = pygame.Rect(pos[0], pos[1], 16, 16) 

class Finish(object): 

    def __init__(self, pos): 
     finishes.append(self) 
     self.rect = pygame.Rect(pos[0], pos[1], 16, 16) 

# Variables 
currentLevel = 1 

# Initialise pygame 
pygame.init() 

# Set up the display 
pygame.display.set_caption("Change level") 
screen = pygame.display.set_mode((320, 240)) 

clock = pygame.time.Clock() 
walls = [] # List to hold the walls 
players = [] 
finishes = [] 

# Holds the level layout in a list of strings. 
if currentLevel == 1: 

    level = [ 
    "WWWWWWWWWWWWWWWWWWWW", 
    "W     W", 
    "W P  WWWWWW W", 
    "W WWWW  W W", 
    "W W  WWWW W", 
    "W WWW WWWW  W", 
    "W W  W W  W", 
    "W W  W WWW WW", 
    "W WWW WWW W W W", 
    "W  W W W W W", 
    "WWW W WWWWW W W", 
    "W W  WW  W", 
    "W W WWWW WWW W", 
    "W  W F W W", 
    "WWWWWWWWWWWWWWWWWWWW", 
    ] 
    # Parse the level string above 
    x = y = 0 
    for row in level: 
     for col in row: 
      if col == "W": 
       Wall((x, y)) 
      if col == "P": 
       Player((x, y)) 
      if col == "F": 
       Finish((x, y)) 
      x += 16 
     y += 16 
     x = 0 
if currentLevel == 2: 

    level = [ 
    "WWWWWWWWWWWWWWWWWWWW", 
    "W     W", 
    "W     W", 
    "W WWWWWWWWWWWWW W", 
    "W     W", 
    "W   P  W", 
    "W     W", 
    "W WWWWWWWWWWWWW W", 
    "W     W", 
    "W WWWWWWWWWWWWW W", 
    "W     W", 
    "W   F  W", 
    "W     W", 
    "W     W", 
    "WWWWWWWWWWWWWWWWWWWW", 
    ] 

    # Parse the level string above 
    x = y = 0 
    for row in level: 
     for col in row: 
      if col == "W": 
       Wall((x, y)) 
      if col == "P": 
       Player((x, y)) 
      if col == "F": 
       Finish((x, y)) 
      x += 16 
     y += 16 
     x = 0 

running = True 
while running: 

    clock.tick(60) 

    for e in pygame.event.get(): 
     if e.type == pygame.QUIT: 
      running = False 
     if e.type == pygame.KEYDOWN and e.key == pygame.K_ESCAPE: 
      running = False 

    # Move the player if an arrow key is pressed 
    key = pygame.key.get_pressed() 
    if key[pygame.K_LEFT]: 
     player.move(-2, 0) 
    if key[pygame.K_RIGHT]: 
     player.move(2, 0) 
    if key[pygame.K_UP]: 
     player.move(0, -2) 
    if key[pygame.K_DOWN]: 
     player.move(0, 2) 

    # Just added this to make it slightly fun ;) 
    for player in players: 
     for finish in finishes: 
      if player.rect.colliderect(finish.rect): 
       currentLevel = 2 # Doesn't work 

    # Draw the scene 
    screen.fill((0, 0, 0)) 
    for wall in walls: 
     pygame.draw.rect(screen, (255, 255, 255), wall.rect) 
    for player in players: 
     pygame.draw.rect(screen, (255, 200, 0), player.rect) 
    for finish in finishes: 
     pygame.draw.rect(screen, (0, 200, 0), finish.rect) 
    pygame.display.flip() 

回答

2

你只需要改變的currentLevel變量,但你從來沒有真正改變wallsplayersfinishes名單(只有while裏面的代碼循環在這個時候執行)。

來解決這個問題

一個非常簡單的方法就是把代碼「負載」的電平轉換成函數調用它,當玩家達到的水平結束,如:

import os 
import random 
import pygame 

# Class for the orange dude 
class Player(object): 

    def __init__(self, pos): 
     self.rect = pygame.Rect(pos[0], pos[1], 16, 16) 

    def move(self, dx, dy): 

     # Move each axis separately. Note that this checks for collisions both times. 
     if dx != 0: 
      self.move_single_axis(dx, 0) 
     if dy != 0: 
      self.move_single_axis(0, dy) 

    def move_single_axis(self, dx, dy): 

    # Move the rect 
     self.rect.x += dx 
     self.rect.y += dy 

    # If you collide with a wall, move out based on velocity 
     for wall in walls: 
      if self.rect.colliderect(wall.rect): 
       if dx > 0: # Moving right; Hit the left side of the wall 
        self.rect.right = wall.rect.left 
       if dx < 0: # Moving left; Hit the right side of the wall 
        self.rect.left = wall.rect.right 
       if dy > 0: # Moving down; Hit the top side of the wall 
        self.rect.bottom = wall.rect.top 
       if dy < 0: # Moving up; Hit the bottom side of the wall 
        self.rect.top = wall.rect.bottom 

# Nice class to hold a wall rect 
class Wall(object): 

    def __init__(self, pos): 
     self.rect = pygame.Rect(pos[0], pos[1], 16, 16) 

class Finish(object): 

    def __init__(self, pos): 
     self.rect = pygame.Rect(pos[0], pos[1], 16, 16) 

# Variables 
currentLevel = 0 

# Initialise pygame 
pygame.init() 

# Set up the display 
pygame.display.set_caption("Change level") 
screen = pygame.display.set_mode((320, 240)) 

clock = pygame.time.Clock() 

levels = [[ 
    "WWWWWWWWWWWWWWWWWWWW", 
    "W     W", 
    "W P  WWWWWW W", 
    "W WWWW  W W", 
    "W W  WWWW W", 
    "W WWW WWWW  W", 
    "W W  W W  W", 
    "W W  W WWW WW", 
    "W WWW WWW W W W", 
    "W  W W W W W", 
    "WWW W WWWWW W W", 
    "W W  WW  W", 
    "W W WWWW WWW W", 
    "W  W F W W", 
    "WWWWWWWWWWWWWWWWWWWW", 
    ], 
    [ 
    "WWWWWWWWWWWWWWWWWWWW", 
    "W     W", 
    "W     W", 
    "W WWWWWWWWWWWWW W", 
    "W     W", 
    "W   P  W", 
    "W     W", 
    "W WWWWWWWWWWWWW W", 
    "W     W", 
    "W WWWWWWWWWWWWW W", 
    "W     W", 
    "W   F  W", 
    "W     W", 
    "W     W", 
    "WWWWWWWWWWWWWWWWWWWW", 
    ]] 

def load_level(level): 
    walls = [] 
    players = [] 
    finishes = [] 

    # Parse the level string above 
    x = y = 0 
    for row in levels[level]: 
     for col in row: 
      if col == "W": 
       walls.append(Wall((x, y))) 
      if col == "P": 
       players.append(Player((x, y))) 
      if col == "F": 
       finishes.append(Finish((x, y))) 
      x += 16 
     y += 16 
     x = 0 
    return walls, players, finishes 

walls, players, finishes = load_level(currentLevel) 
running = True 
while running: 

    clock.tick(60) 

    for e in pygame.event.get(): 
     if e.type == pygame.QUIT: 
      running = False 
     if e.type == pygame.KEYDOWN and e.key == pygame.K_ESCAPE: 
      running = False 

    # Move the player if an arrow key is pressed 
    key = pygame.key.get_pressed() 
    if key[pygame.K_LEFT]: 
     player.move(-2, 0) 
    if key[pygame.K_RIGHT]: 
     player.move(2, 0) 
    if key[pygame.K_UP]: 
     player.move(0, -2) 
    if key[pygame.K_DOWN]: 
     player.move(0, 2) 

    # Just added this to make it slightly fun ;) 
    for player in players: 
     for finish in finishes: 
      if player.rect.colliderect(finish.rect): 
       currentLevel += 1 
       walls, players, finishes = load_level(currentLevel) 

    # Draw the scene 
    screen.fill((0, 0, 0)) 
    for wall in walls: 
     pygame.draw.rect(screen, (255, 255, 255), wall.rect) 
    for player in players: 
     pygame.draw.rect(screen, (255, 200, 0), player.rect) 
    for finish in finishes: 
     pygame.draw.rect(screen, (0, 200, 0), finish.rect) 
    pygame.display.flip() 
+0

謝謝多米尼克!它真的幫助了我。我希望這個話題也能幫助別人。 – Frederikzt