2016-06-19 7 views
0

Ich versuche Ebenen zu wechseln, aber ich bekomme diesen Traceback-Fehler.Ebenen in pygame ändern

Ich bin wirklich hier fest, und das ist die letzte Komponente meines Spiels, so dass jede Hilfe geschätzt wird. Ich bin auch ziemlich neu in Pygame und Python, so dass meine Erfahrung sehr begrenzt ist. Danke im Voraus!

der Code:

import pygame 
import sys 
import time 
pygame.init() 
screenSize = (800,600) 
displayScreen = pygame.display.set_mode((screenSize),0) 
pygame.display.set_caption("U1A2 Test") 


WHITE = (255,255,255) 
GREEN = (0,255,0) 
RED = (255,0,0) 
BLUE = (0,0,255) 

displayScreen.fill(WHITE) 
pygame.display.update() 
clock = pygame.time.Clock() 
fps= 60 
game = False 
menu = True 
inst = False 
jump= False 
x = 53 
y = 552 


walls = [] 
dx = 0 
dy = 0 

currentLevel = 0 
sprite= pygame.image.load('block sprite.png') 

levels = [[ 

    "       ", 
    "       ", 
    "   D    ", 
    "   D    ", 
    "       ", 
    "       ", 
    " WW      ",  
    "       ", 
    "       ",  
    "  WWWW    ", 
    "       ", 
    "       ", 
    "    WWW  ", 
    "       ", 
    "       ", 
    "   WWW   ", 
    " WWW     ", 
    "       ", 
    "WWWWWWWWWWWWWWWWWWWWWWWWWW", 
    ], 

    [ 

    "       ", 
    "       ", 
    "     D  ", 
    "     D  ", 
    "       ", 
    "  WW     ", 
    "       ",  
    "    WW  ", 
    "       ",  
    " WWWW     ", 
    "       ", 
    "       ", 
    "    WWW  ", 
    "       ", 
    "       ", 
    "   WWW   ", 
    " WWW     ", 
    "       ", 
    "WWWWWWWWWWWWWWWWWWWWWWWWWW", 
    ]] 

def load_level(level): 
    m = n = 0 
    wall = (x, y) 
    walls = [] 
    for row in levels[level]: 
     for col in row: 

      if col == "D": 
       endRect = pygame.Rect(m, n, 32, 32) 
       walls.append(endRect) 
      if col == " ": 
       jump = False 
      if col == "W": 
       wallRect = pygame.Rect(m,n,32,32) 
       walls.append(wallRect) 
       jump = True 
      m += 32 
     n += 32 
     m = 0 
    return walls,endRect,wallRect,wall  

walls,endRect,wallRect,wall = load_level(currentLevel)   
while menu: 


     fontTitle = pygame.font.SysFont("Ariel", 72) 
     textTitle = fontTitle.render("change this", True, (255,0,0)) 
     displayScreen.blit(textTitle,(35, 50)) 

     fontTitle = pygame.font.SysFont("Ariel", 52) 
     textTitle = fontTitle.render("Press 1 to play", True, (255,0,0)) 
     displayScreen.blit(textTitle,(35, 100)) 

     fontTitle = pygame.font.SysFont("Ariel", 52) 
     textTitle = fontTitle.render("Press 2 for instructions", True, (255,0,0)) 
     displayScreen.blit(textTitle,(35, 150)) 
     pygame.display.update() 

     fontTitle = pygame.font.SysFont("Ariel", 52) 
     textTitle = fontTitle.render("Press 3 to quit", True, (255,0,0)) 
     displayScreen.blit(textTitle,(35, 200)) 
     pygame.display.update() 


     for event in pygame.event.get(): 
      if event.type == pygame.KEYDOWN: 
       if event.key == pygame.K_1: 
        print "ds" 
        game = True 
        currentLevel = 1 




       elif event.key == pygame.K_2: 
        menu = False 
        inst = True 
        displayScreen.fill(WHITE) 
       elif event.key == pygame.K_3: 
        menu = False 

     while game: 


      #pygame.draw.rect(displayScreen,GREEN,PlayerRect,0) 



      #pygame.draw.rect(displayScreen, (255, 0, 0), PlayerRect, 1) 



      #walls, players = load_level(level1) 
      clock.tick(fps)         
      for event in pygame.event.get(): 
       if event.type ==pygame.QUIT: 
        pygame.display.quit() 
        sys.exit() 

       elif event.type == pygame.KEYDOWN: 
        if event.key == pygame.K_a: 
         dx = -7 
         displayScreen.fill(WHITE) 

        elif event.key == pygame.K_d: 
         dx = 7 
         displayScreen.fill(WHITE) 

        elif event.key == pygame.K_w:  
         dy = -25 

        elif event.key == pygame.K_s: 
         dy = 25 
         displayScreen.fill(WHITE) 

        elif event.key == pygame.K_q: 
         stop = True 
         displayScreen.fill(WHITE) 

       if event.type == pygame.KEYUP: 
        if event.key == pygame.K_a or event.key == pygame.K_d: 
          dx = 0 
        elif event.key == pygame.K_w or event.key == pygame.K_s:  
          dy = 0    

      oldx = x 
      oldy = y       
      x = x + dx 
      y = y + dy 

      if game == True: 
       dy = dy + 2 

      if (x>=798 or x<=2): 
       x=oldx 


      if (y<=3 or y>=597): 
       y=oldy 

      displayScreen.fill(WHITE) 

      for wall in walls: 
       PlayerRect = pygame.Rect(x,y, sprite.get_width(), sprite.get_height()) 
       if PlayerRect.colliderect(wall): 
        if dx > 0: 
         PlayerRect.left = wall.right 

        if dx < 0: 
         PlayerRect.right = wall.left 

        if dy > 0: 
         PlayerRect.bottom = wall.top 

        if dy < 0: 
         PlayerRect.top = wall.bottom 

        dy = 0 

      for wall in walls: 
       pygame.draw.rect(displayScreen,BLUE,wall,0) 
       pygame.draw.rect(displayScreen,RED, endRect, 0) 

       if PlayerRect.colliderect(endRect): 
        currentLevel += 1 
        walls,endRect,wallRect,wall = load_level(currentLevel) 


      displayScreen.blit(sprite,(x,y)) 
      pygame.display.flip() 


     while inst: 
       fontTitle = pygame.font.SysFont("Ariel", 72) 
       textTitle = fontTitle.render("Instructions", True, (255,0,0)) 
       displayScreen.blit(textTitle,(35, 50)) 

       fontTitle = pygame.font.SysFont("Ariel", 52) 
       textTitle = fontTitle.render("- Use W to jump,S to fall", True, (255,0,0)) 
       displayScreen.blit(textTitle,(35, 100)) 

       fontTitle = pygame.font.SysFont("Ariel", 52) 
       textTitle = fontTitle.render("- Control your jump by using the A and D keys", True, (255,0,0)) 
       displayScreen.blit(textTitle,(35,150)) 
       pygame.display.update() 

       fontTitle = pygame.font.SysFont("Ariel", 52) 
       textTitle = fontTitle.render("- Move left and right with the A and D keys", True, (255,0,0)) 
       displayScreen.blit(textTitle,(35, 200)) 
       pygame.display.update() 

       fontTitle = pygame.font.SysFont("Ariel", 52) 
       textTitle = fontTitle.render("Press 3 to exit", True, (255,0,0)) 
       displayScreen.blit(textTitle,(35, 250)) 
       pygame.display.update() 

       for event in pygame.event.get(): 
        if event.type == pygame.KEYDOWN: 
         if event.key == pygame.K_3: 
          inst = False 
          displayScreen.fill(WHITE) 
          menu = True 

pygame.quit() 
sys.exit() 
+0

Es ist im besten Fall schwierig, mit solchen Problemen zu helfen, ohne dass Sie genügend Code zur Verfügung stellen, um das Problem zu reproduzieren - insbesondere, wenn Sie globale Variablen wie Sie verwenden. Bitte lesen Sie [_Wie erstellen Sie ein minimales, vollständiges und verifizierbares Beispiel_] (https://stackoverflow.com/help/mcve). – martineau

+0

Entschuldigung letztes Mal, als ich eine Frage gestellt habe, wurde mir das gleiche gesagt, also habe ich diesmal nur eine kleine Menge an Code eingegeben. Ich werde es bearbeiten wird der volle Code –

+0

Wir brauchen nicht (oder _want_ der vollständige Code). Gerade genug, um das Problem zu verursachen. – martineau

Antwort

0

Das Problem ist, da die Fehlermeldung zeigt an, dass der Index mit der levels Liste verwendet außerhalb des Bereichs liegt. Es kann nur 0 oder 1 sein. Das Problem scheint zu sein, weil in der Haupt while game Schleife Sie currentLevel um eins inkrementieren, ohne seinen Wert vor oder nach zu überprüfen. Anfänglich wurde es auf 0 eingestellt, aber später wird es auf 1 gesetzt, wenn der Benutzer die Taste drückt, um das Spiel zu spielen.

Ich bin nicht sicher, aber sein Wert auf 1 eingestellt wird, wenn der Benutzer beginnt, spielen falsch sein kann. Unabhängig davon müssen Sie entweder einige Überprüfungen hinzufügen, um zu verhindern, dass sie jemals außer Reichweite geraten, oder immer vor der Verwendung überprüfen. Eine offensichtliche Art und Weise würde einfach sein macht es Inkrementieren bedingter:

  for wall in walls: 
       pygame.draw.rect(displayScreen,BLUE,wall,0) 
       pygame.draw.rect(displayScreen,RED, endRect, 0) 

       if PlayerRect.colliderect(endRect): 
        if currentLevel < 1: #### LIKE THIS #### 
         currentLevel += 1 
        walls,endRect,wallRect,wall = load_level(currentLevel) 

Noch besser ist, man könnte das Programm flexibler gestalten, indem Konstanten Hardcoding zu vermeiden, die in Ihrem Code ändern könnten. Hier, die durch die Definition einer globalen Konstante in der Nähe von Anfang an getan werden könnte:

HIGHEST_LEVEL = len(levels)-1 # index of topmost level 

... und dann mit ihm jede und jeder, wo notwendig currentLevel, um sicherzustellen, ist oder bleibt gültig:

    ... 
       if PlayerRect.colliderect(endRect) 
        if currentLevel < HIGHEST_LEVEL: 
         currentLevel += 1 
        ... 

diese Verwendung Ansatz hier würde erlauben, können Sie Ebenen zum Spiel hinzufügen und müssen nicht weit und weit suchen, obwohl der Code sicher currentLevel immer in Reichweite war - so viel wie ich in den Prozess der Debugging Ihres Programms tun musste.