Pygame基于字符串的级别绘制一次然后消失

问题描述:

我正在使用Python 2.7。我在重新绘制基于字符串的级别时遇到问题。它在第一帧画得很好,但在此之后,它似乎不再吸引。我一直试图想出一段时间的修复。下面是完整的源代码:Pygame基于字符串的级别绘制一次然后消失

import pygame 
from pygame.locals import * 

xScan = 0 
yScan = 0 
level = "WWWWWWWW" \ 
     "WSSSSSSW" \ 
     "WSSSSSSW" \ 
     "WSSSSSSW" \ 
     "WSSSSSSW" \ 
     "WWWWWWWW" 


class Player(): 
    def __init__(self, color, x, y, width, height, outline_size): 
     self.color = color 
     self.x = x 
     self.y = y 
     self.width = width 
     self.height = height 
     self.outline_size = outline_size 

    def draw(self): 
     pygame.draw.rect(screen, self.color, [self.x * 80, self.y * 80, self.width * 80, self.height * 80], self.outline_size) 


def draw_level(): 
    for tile in level: 
     global xScan, yScan 
     if tile == "W": 
      pygame.draw.rect(screen, [0, 0, 0], [xScan * 80, yScan * 80, 80, 80], 0) 
     elif tile == "S": 
      pygame.draw.rect(screen, [120, 120, 120], [xScan * 80, yScan * 80, 80, 80], 1) 

     if xScan >= 0 and xScan < 7: 
      xScan += 1 
     elif xScan == 7: 
      xScan = 0 
      yScan += 1 
     elif yScan == 5 and xScan == 7: 
      xScan = 0 
      yScan = 0 


def update(): 
    screen.fill([255, 255, 255]) 
    draw_level() 
    player.draw() 
    pygame.display.flip() 

pygame.init() 
screen = pygame.display.set_mode([640, 480]) 
pygame.display.set_caption("Squares n' Tiles!") 
player = Player([0, 100, 255], 1, 1, 1, 1, 0) 

running = True 
while running: 
    clock = pygame.time.Clock() 
    clock.tick(30) 
    for event in pygame.event.get(): 
     if event.type == pygame.KEYDOWN: 
      if event.key == K_ESCAPE: 
       running = False 
      if event.key == K_UP and player.y * 80 >= 160: 
       player.y -= 1 
      if event.key == K_DOWN and player.y * 80 < 320: 
       player.y += 1 
      if event.key == K_LEFT and player.x * 80 >= 160: 
       player.x -= 1 
      if event.key == K_RIGHT and player.x * 80 < 480: 
       player.x += 1 
      if event.key == K_c or event.key == K_r: 
       player.x = 1 
       player.y = 1 
     if event.type == pygame.QUIT: 
      running = False 
    update() 

pygame.quit() 

我认为问题出在这部分代码中:

def draw_level(): 
    for tile in level: 
     global xScan, yScan 
     if tile == "W": 
      pygame.draw.rect(screen, [0, 0, 0], [xScan * 80, yScan * 80, 80, 80], 0) 
     elif tile == "S": 
      pygame.draw.rect(screen, [120, 120, 120], [xScan * 80, yScan * 80, 80, 80], 1) 

     if xScan >= 0 and xScan < 7: 
      xScan += 1 
     elif xScan == 7: 
      xScan = 0 
      yScan += 1 
     elif yScan == 5 and xScan == 7: 
      xScan = 0 
      yScan = 0 

我试着在前面的部分的后半数字搞乱。这是一个变化是主要解决了这个问题(尽管它的格式不是很一致):

if xScan >= 7: 
    xScan = 0 
    yScan += 1 
elif yScan == 6: 
    xScan = 1 
    yScan = 0 
else: 
    xScan += 1 

与上面的代码唯一的问题是,左上方图块不画。我怎么能改变我的代码,使其正常工作?在每一帧上,我都希望屏幕充满白色,重新绘制关卡,玩家重新绘制,屏幕翻转。预先感谢您的帮助。我也希望对我的代码结构有所建议。

的问题是,该块不执行:

elif yScan == 5 and xScan == 7: 
     xScan = 0 
     yScan = 0 

这是因为你循环遍历字符串level每个字符,所以达到了最大值为XSCAN = 6,yScan = 5 。

而不只是初始化xScanyScan进入抽奖级功能

def draw_level(): 
    xScan = 0 # no need for these to be global 
    yScan = 0 
    for tile in level: 
     if tile == "W": 
      pygame.draw.rect(screen, [0, 0, 0], [xScan * 80, yScan * 80, 80, 80], 0) 
     elif tile == "S": 
      pygame.draw.rect(screen, [120, 120, 120], [xScan * 80, yScan * 80, 80, 80], 1) 

     if xScan >= 0 and xScan < 7: 
      xScan += 1 
     elif xScan == 7: 
      xScan = 0 
      yScan += 1 

我时竟被ð建议储存你的级别人物的几行,而不是一个长字符串:

level = "WWWWWWWW\n" \ 
     "WSSSSSSW\n" \ 
     "WSSSSSSW\n" \ 
     "WSSSSSSW\n" \ 
     "WSSSSSSW\n" \ 
     "WWWWWWWW\n" # note the new line characters (\n) 

然后你可以遍历在地图上像这样:

def draw_level(): 
    for yScan, row in enumerate(level.split('\n')): 
     for xScan, tile in enumerate(row): 
      if tile == "W": 
       pygame.draw.rect(screen, [0, 0, 0], [xScan * 80, yScan * 80, 80, 80], 0) 
      elif tile == "S": 
       pygame.draw.rect(screen, [120, 120, 120], [xScan * 80, yScan * 80, 80, 80], 1) 

enumerate接受一个列表(或迭代),并返回例如:

>>> a = 'test' 
>>> for i, c in enumerate(a): 
...  print('i is {}, c is {}'.format(i, c)) 
... 
i is 0, c is t 
i is 1, c is e 
i is 2, c is s 
i is 3, c is t 
+0

谢谢!我很感激。 – Mikeureko