pygame变更级别 - 级别列表

问题描述:

你好我是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() 

你只需要改变的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